From 2ab3356d2f9b88abbf6771e84f2f4f4631e217e2 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Fri, 27 Jan 2017 14:36:52 -0800 Subject: [PATCH 01/79] Add check-index Ant target --- ant/build.xml | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/ant/build.xml b/ant/build.xml index d42cb360e..9bf710d63 100644 --- a/ant/build.xml +++ b/ant/build.xml @@ -104,6 +104,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From def1f407a59a6fc5de4252893d74203c7be2a4d0 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Fri, 27 Jan 2017 14:37:45 -0800 Subject: [PATCH 02/79] Ignore generated files --- .gitignore | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 95a370abe..67bb48623 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ /nbproject/private/ -/target/ \ No newline at end of file +/target/ + +build/ +javadoc/ +jfreechart-*-javadocs.zip +jfreechart-*.zip +lib/jfreechart-*-src.jar +lib/jfreechart-*.jar From 4fb83b38124ac7b223e4527fbf03be4d32641735 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Thu, 16 Nov 2017 20:16:48 -0800 Subject: [PATCH 03/79] begin pass at annotations --- ant/build.xml | 2 +- src/main/java/org/jfree/chart/LegendItem.java | 9 ++++++++- .../annotations/XYPolygonAnnotation.java | 8 ++++++-- .../java/org/jfree/chart/axis/PeriodAxis.java | 13 +++++++++---- .../java/org/jfree/chart/axis/ValueAxis.java | 6 +++++- .../org/jfree/chart/plot/CategoryPlot.java | 8 ++++---- .../org/jfree/chart/plot/FastScatterPlot.java | 11 ++++++++--- src/main/java/org/jfree/chart/plot/Plot.java | 5 +++++ .../org/jfree/chart/plot/ThermometerPlot.java | 16 +++++++++++----- .../java/org/jfree/chart/plot/XYPlot.java | 19 ++++++++++++++----- .../jfree/chart/renderer/RendererUtils.java | 7 +++++-- .../java/org/jfree/chart/text/TextBlock.java | 6 +++++- 12 files changed, 81 insertions(+), 29 deletions(-) diff --git a/ant/build.xml b/ant/build.xml index f2a229a5a..f594b9223 100644 --- a/ant/build.xml +++ b/ant/build.xml @@ -103,7 +103,7 @@ - + diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index 0144d9003..a23a37450 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -64,6 +64,10 @@ package org.jfree.chart; +/*>>> +import org.checkerframework.checker.index.qual.IndexFor; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; @@ -78,6 +82,7 @@ import java.io.Serializable; import java.text.AttributedString; import java.text.CharacterIterator; + import org.jfree.chart.text.AttributedStringUtils; import org.jfree.chart.ui.GradientPaintTransformer; import org.jfree.chart.ui.StandardGradientPaintTransformer; @@ -514,7 +519,9 @@ private String characterIteratorToString(CharacterIterator iterator) { int i = 0; char c = iterator.first(); while (c != CharacterIterator.DONE) { - chars[i] = c; + @SuppressWarnings("index") // Correctness depends on the Character Iterator having count elements before supplying CharacterIterator.DONE + /*@IndexFor("chars")*/ int index = i; + chars[index] = c; i++; c = iterator.next(); } diff --git a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java index 2738417cd..08e0dfddd 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java @@ -229,7 +229,9 @@ public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, for (int i = 2; i < this.polygon.length; i += 2) { x = domainAxis.valueToJava2D(this.polygon[i], dataArea, domainEdge); - y = rangeAxis.valueToJava2D(this.polygon[i + 1], dataArea, + @SuppressWarnings("index") // polygon always has an even number of elements, and i is an odd index + double y1 = this.polygon[i + 1]; + y = rangeAxis.valueToJava2D(y1, dataArea, rangeEdge); area.lineTo((float) y, (float) x); } @@ -240,7 +242,9 @@ else if (orientation == PlotOrientation.VERTICAL) { for (int i = 2; i < this.polygon.length; i += 2) { x = domainAxis.valueToJava2D(this.polygon[i], dataArea, domainEdge); - y = rangeAxis.valueToJava2D(this.polygon[i + 1], dataArea, + @SuppressWarnings("index") // polygon always has an even number of elements, and i is an odd index + double y1 = this.polygon[i + 1]; + y = rangeAxis.valueToJava2D(y1, dataArea, rangeEdge); area.lineTo((float) x, (float) y); } diff --git a/src/main/java/org/jfree/chart/axis/PeriodAxis.java b/src/main/java/org/jfree/chart/axis/PeriodAxis.java index eedd72155..87222fdb1 100644 --- a/src/main/java/org/jfree/chart/axis/PeriodAxis.java +++ b/src/main/java/org/jfree/chart/axis/PeriodAxis.java @@ -65,6 +65,11 @@ package org.jfree.chart.axis; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.IntVal; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.FontMetrics; @@ -179,7 +184,7 @@ public class PeriodAxis extends ValueAxis private transient Paint minorTickMarkPaint = Color.BLACK; /** Info for each labeling band. */ - private PeriodAxisLabelInfo[] labelInfo; + private PeriodAxisLabelInfo /*@ArrayLen(2)*/ [] labelInfo; /** * Creates a new axis. @@ -510,7 +515,7 @@ public void setMinorTickMarkOutsideLength(float length) { * * @return An array. */ - public PeriodAxisLabelInfo[] getLabelInfo() { + public PeriodAxisLabelInfo /*@ArrayLen(2)*/ [] getLabelInfo() { return this.labelInfo; } @@ -520,7 +525,7 @@ public PeriodAxisLabelInfo[] getLabelInfo() { * * @param info the info. */ - public void setLabelInfo(PeriodAxisLabelInfo[] info) { + public void setLabelInfo(PeriodAxisLabelInfo /*@ArrayLen(2)*/ [] info) { this.labelInfo = info; fireChangeEvent(); } @@ -800,7 +805,7 @@ protected void drawTickMarksVertical(Graphics2D g2, AxisState state, * * @return The updated axis state. */ - protected AxisState drawTickLabels(int band, Graphics2D g2, AxisState state, + protected AxisState drawTickLabels(/*@IntVal({0, 1})*/ int band, Graphics2D g2, AxisState state, Rectangle2D dataArea, RectangleEdge edge) { // work out the initial gap diff --git a/src/main/java/org/jfree/chart/axis/ValueAxis.java b/src/main/java/org/jfree/chart/axis/ValueAxis.java index f5c685484..d57881e41 100644 --- a/src/main/java/org/jfree/chart/axis/ValueAxis.java +++ b/src/main/java/org/jfree/chart/axis/ValueAxis.java @@ -114,6 +114,10 @@ package org.jfree.chart.axis; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; + */ + import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; @@ -628,7 +632,7 @@ protected void drawAxisLine(Graphics2D g2, double cursor, * * @return The x and y coordinates of the anchor point. */ - protected float[] calculateAnchorPoint(ValueTick tick, double cursor, + protected float /*@ArrayLen(2)*/ [] calculateAnchorPoint(ValueTick tick, double cursor, Rectangle2D dataArea, RectangleEdge edge) { RectangleInsets insets = getTickLabelInsets(); diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 5a215df0d..02c9cc5f1 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -1403,10 +1403,10 @@ public void mapDatasetToDomainAxis(int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToDomainAxes(int index, List axisIndices) { + public void mapDatasetToDomainAxes(int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); - this.datasetToDomainAxesMap.put(index, new ArrayList(axisIndices)); + this.datasetToDomainAxesMap.put(index, new ArrayList(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); } @@ -1492,10 +1492,10 @@ public void mapDatasetToRangeAxis(int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToRangeAxes(int index, List axisIndices) { + public void mapDatasetToRangeAxes(int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); - this.datasetToRangeAxesMap.put(index, new ArrayList(axisIndices)); + this.datasetToRangeAxesMap.put(index, new ArrayList(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); } diff --git a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java index 682c8efff..f9fdd2dc3 100644 --- a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java +++ b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java @@ -68,6 +68,11 @@ package org.jfree.chart.plot; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.checker.index.qual.PolySameLen; +*/ + import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; @@ -122,7 +127,7 @@ public class FastScatterPlot extends Plot implements ValueAxisPlot, Pannable, public static final Paint DEFAULT_GRIDLINE_PAINT = Color.lightGray; /** The data. */ - private float[][] data; + private float /*@ArrayLen(2)*/ [] /*@PolySameLen*/ [] data; /** The x data range. */ private Range xDataRange; @@ -195,7 +200,7 @@ public FastScatterPlot() { * @param domainAxis the domain (x) axis ({@code null} not permitted). * @param rangeAxis the range (y) axis ({@code null} not permitted). */ - public FastScatterPlot(float[][] data, + public FastScatterPlot(float /*@ArrayLen(2)*/ [] /*@PolySameLen*/ [] data, ValueAxis domainAxis, ValueAxis rangeAxis) { super(); @@ -252,7 +257,7 @@ public float[][] getData() { * * @see #getData() */ - public void setData(float[][] data) { + public void setData(float /*@ArrayLen(2)*/ [] /*@PolySameLen*/ [] data) { this.data = data; fireChangeEvent(); } diff --git a/src/main/java/org/jfree/chart/plot/Plot.java b/src/main/java/org/jfree/chart/plot/Plot.java index 072a27e49..af76cce65 100644 --- a/src/main/java/org/jfree/chart/plot/Plot.java +++ b/src/main/java/org/jfree/chart/plot/Plot.java @@ -135,6 +135,10 @@ package org.jfree.chart.plot; +/*>>> +import org.checkerframework.dataflow.qual.Pure; + */ + import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; @@ -1486,6 +1490,7 @@ private void readObject(ObjectInputStream stream) * * @return The edge (never {@code null}). */ + /*@Pure*/ public static RectangleEdge resolveDomainAxisLocation( AxisLocation location, PlotOrientation orientation) { diff --git a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java index 5307d5507..29f44de71 100644 --- a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java +++ b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java @@ -93,6 +93,12 @@ package org.jfree.chart.plot; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.IntVal; +import org.checkerframework.checker.index.qual.IndexFor; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; @@ -193,7 +199,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, protected static final int AXIS_GAP = 10; /** The unit strings. */ - protected static final String[] UNITS = {"", "\u00B0F", "\u00B0C", + protected static final String /*@ArrayLen(4)*/ [] UNITS = {"", "\u00B0F", "\u00B0C", "\u00B0K"}; /** Index for low value in subrangeInfo matrix. */ @@ -280,7 +286,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, private transient Paint thermometerPaint = Color.BLACK; /** The display units */ - private int units = UNITS_CELCIUS; + private /*@IndexFor("UNITS")*/ int units = UNITS_CELCIUS; /** The value label position. */ private int valueLocation = BULB; @@ -304,10 +310,10 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, private boolean showValueLines = false; /** The display sub-range. */ - private int subrange = -1; + private /*@IntVal({-1,0,1,2})*/ int subrange = -1; /** The start and end values for the subranges. */ - private double[][] subrangeInfo = { + private double /*@ArrayLen(3)*/ [] /*@ArrayLen(4)*/ [] subrangeInfo = { {0.0, 50.0, 0.0, 50.0}, {50.0, 75.0, 50.0, 75.0}, {75.0, 100.0, 75.0, 100.0} @@ -326,7 +332,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, private boolean useSubrangePaint = true; /** Paint for each range */ - private transient Paint[] subrangePaint = {Color.GREEN, Color.ORANGE, + private transient Paint /*@ArrayLen(3)*/ [] subrangePaint = {Color.GREEN, Color.ORANGE, Color.RED}; /** A flag that controls whether the sub-range indicators are visible. */ diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index c80def5e9..3e1b9a30b 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -235,6 +235,11 @@ package org.jfree.chart.plot; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.dataflow.qual.Pure; +*/ + import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; @@ -265,6 +270,7 @@ import java.util.ResourceBundle; import java.util.Set; import java.util.TreeMap; + import org.jfree.chart.JFreeChart; import org.jfree.chart.LegendItem; @@ -393,7 +399,7 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, private transient Point2D quadrantOrigin = new Point2D.Double(0.0, 0.0); /** The paint used for each quadrant. */ - private transient Paint[] quadrantPaint + private transient Paint /*@ArrayLen(4)*/ [] quadrantPaint = new Paint[] {null, null, null, null}; /** A flag that controls whether the domain grid-lines are visible. */ @@ -735,6 +741,7 @@ public String getPlotType() { * @see #setOrientation(PlotOrientation) */ @Override + /*@Pure*/ public PlotOrientation getOrientation() { return this.orientation; } @@ -893,6 +900,7 @@ public void setDomainAxes(ValueAxis[] axes) { * * @see #setDomainAxisLocation(AxisLocation) */ + /*@Pure*/ public AxisLocation getDomainAxisLocation() { return (AxisLocation) this.domainAxisLocations.get(0); } @@ -1097,6 +1105,7 @@ public void setRangeAxis(ValueAxis axis) { * * @see #setRangeAxisLocation(AxisLocation) */ + /*@Pure*/ public AxisLocation getRangeAxisLocation() { return (AxisLocation) this.rangeAxisLocations.get(0); } @@ -1447,11 +1456,11 @@ public void mapDatasetToDomainAxis(int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToDomainAxes(int index, List axisIndices) { + public void mapDatasetToDomainAxes(int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); Integer key = new Integer(index); - this.datasetToDomainAxesMap.put(key, new ArrayList(axisIndices)); + this.datasetToDomainAxesMap.put(key, new ArrayList(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); } @@ -1481,11 +1490,11 @@ public void mapDatasetToRangeAxis(int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToRangeAxes(int index, List axisIndices) { + public void mapDatasetToRangeAxes(int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); Integer key = new Integer(index); - this.datasetToRangeAxesMap.put(key, new ArrayList(axisIndices)); + this.datasetToRangeAxesMap.put(key, new ArrayList(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); } diff --git a/src/main/java/org/jfree/chart/renderer/RendererUtils.java b/src/main/java/org/jfree/chart/renderer/RendererUtils.java index d362f7681..6fc43aed2 100644 --- a/src/main/java/org/jfree/chart/renderer/RendererUtils.java +++ b/src/main/java/org/jfree/chart/renderer/RendererUtils.java @@ -44,6 +44,9 @@ package org.jfree.chart.renderer; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +*/ import org.jfree.chart.util.Args; import org.jfree.data.DomainOrder; import org.jfree.data.xy.XYDataset; @@ -252,8 +255,8 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { * * @return The indices of the boundary items. */ - public static int[] findLiveItems(XYDataset dataset, int series, - double xLow, double xHigh) { + public static int /*@ArrayLen(2)*/ [] findLiveItems(XYDataset dataset, int series, + double xLow, double xHigh) { // here we could probably be a little faster by searching for both // indices simultaneously, but I'll look at that later if it seems // like it matters... diff --git a/src/main/java/org/jfree/chart/text/TextBlock.java b/src/main/java/org/jfree/chart/text/TextBlock.java index f912a94b6..17d087a79 100644 --- a/src/main/java/org/jfree/chart/text/TextBlock.java +++ b/src/main/java/org/jfree/chart/text/TextBlock.java @@ -28,6 +28,10 @@ package org.jfree.chart.text; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; + */ + import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; @@ -239,7 +243,7 @@ else if (this.lineAlignment == HorizontalAlignment.RIGHT) { * * @return The offsets (float[0] = x offset, float[1] = y offset). */ - private float[] calculateOffsets(TextBlockAnchor anchor, double width, + private float /*@ArrayLen(2)*/ [] calculateOffsets(TextBlockAnchor anchor, double width, double height) { float[] result = new float[2]; float xAdj = 0.0f; From 3df94d165d86846baa847397e0d714f063f626e3 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Tue, 28 Nov 2017 09:32:40 -0800 Subject: [PATCH 04/79] annotations --- src/main/java/org/jfree/chart/LegendItem.java | 4 +- .../annotations/XYPolygonAnnotation.java | 4 + .../org/jfree/chart/axis/CompassFormat.java | 12 +- .../jfree/chart/axis/CyclicNumberAxis.java | 6 +- .../org/jfree/chart/axis/MonthDateFormat.java | 25 ++- .../java/org/jfree/chart/axis/PeriodAxis.java | 2 +- .../jfree/chart/axis/QuarterDateFormat.java | 20 ++- .../java/org/jfree/chart/axis/ValueAxis.java | 2 + .../jfree/chart/block/ColumnArrangement.java | 5 + .../jfree/chart/block/FlowArrangement.java | 5 + .../java/org/jfree/chart/date/SerialDate.java | 106 +++++++----- .../org/jfree/chart/date/SpreadsheetDate.java | 41 +++-- .../org/jfree/chart/entity/XYItemEntity.java | 10 +- .../labels/AbstractXYItemLabelGenerator.java | 8 +- .../labels/BoxAndWhiskerToolTipGenerator.java | 6 +- .../BoxAndWhiskerXYToolTipGenerator.java | 6 +- .../labels/BubbleXYItemLabelGenerator.java | 8 +- .../labels/CategorySeriesLabelGenerator.java | 6 +- .../labels/CustomXYToolTipGenerator.java | 8 +- .../labels/HighLowItemLabelGenerator.java | 8 +- .../labels/IntervalXYItemLabelGenerator.java | 8 +- .../labels/IntervalXYToolTipGenerator.java | 8 +- .../MultipleXYSeriesLabelGenerator.java | 12 +- .../StandardCategorySeriesLabelGenerator.java | 8 +- .../labels/StandardXYItemLabelGenerator.java | 6 +- .../StandardXYSeriesLabelGenerator.java | 8 +- .../labels/StandardXYToolTipGenerator.java | 6 +- .../labels/StandardXYZToolTipGenerator.java | 8 +- .../labels/SymbolicXYItemLabelGenerator.java | 8 +- .../chart/labels/XYItemLabelGenerator.java | 6 +- .../chart/labels/XYSeriesLabelGenerator.java | 6 +- .../chart/labels/XYToolTipGenerator.java | 7 +- .../chart/labels/XYZToolTipGenerator.java | 6 +- .../plot/CombinedDomainCategoryPlot.java | 3 +- .../chart/plot/CombinedDomainXYPlot.java | 3 +- .../chart/plot/CombinedRangeCategoryPlot.java | 3 +- .../jfree/chart/plot/CombinedRangeXYPlot.java | 3 +- .../org/jfree/chart/plot/CompassPlot.java | 38 +++-- .../chart/plot/DefaultDrawingSupplier.java | 47 +++-- .../org/jfree/chart/plot/FastScatterPlot.java | 12 +- .../java/org/jfree/chart/plot/PolarPlot.java | 22 ++- .../org/jfree/chart/plot/SpiderWebPlot.java | 18 +- .../org/jfree/chart/plot/ThermometerPlot.java | 41 ++--- .../chart/renderer/AbstractRenderer.java | 160 +++++++++--------- .../renderer/DefaultPolarItemRenderer.java | 18 +- .../chart/renderer/PolarItemRenderer.java | 10 +- .../jfree/chart/renderer/RendererUtils.java | 9 +- .../AbstractCategoryItemRenderer.java | 24 +-- .../chart/renderer/category/AreaRenderer.java | 6 +- .../chart/renderer/category/BarRenderer.java | 8 +- .../category/BoxAndWhiskerRenderer.java | 6 +- .../category/CategoryItemRenderer.java | 120 ++++++------- .../category/CategoryStepRenderer.java | 6 +- .../renderer/category/LayeredBarRenderer.java | 8 +- .../renderer/category/LevelRenderer.java | 6 +- .../category/LineAndShapeRenderer.java | 30 ++-- .../renderer/category/ScatterRenderer.java | 14 +- .../renderer/xy/AbstractXYItemRenderer.java | 22 ++- .../renderer/xy/CyclicXYItemRenderer.java | 16 +- .../renderer/xy/SamplingXYLineRenderer.java | 6 +- .../renderer/xy/StandardXYItemRenderer.java | 16 +- .../chart/renderer/xy/XYAreaRenderer.java | 6 +- .../chart/renderer/xy/XYAreaRenderer2.java | 6 +- .../chart/renderer/xy/XYBarRenderer.java | 6 +- .../renderer/xy/XYBoxAndWhiskerRenderer.java | 10 +- .../chart/renderer/xy/XYBubbleRenderer.java | 6 +- .../renderer/xy/XYDifferenceRenderer.java | 6 +- .../chart/renderer/xy/XYDotRenderer.java | 6 +- .../chart/renderer/xy/XYItemRenderer.java | 104 ++++++------ .../renderer/xy/XYItemRendererState.java | 8 +- .../renderer/xy/XYLineAndShapeRenderer.java | 36 ++-- .../chart/renderer/xy/XYShapeRenderer.java | 6 +- .../chart/renderer/xy/YIntervalRenderer.java | 6 +- .../chart/title/LegendItemBlockContainer.java | 6 +- .../chart/urls/CategoryURLGenerator.java | 6 +- .../urls/CustomCategoryURLGenerator.java | 8 +- .../chart/urls/CustomXYURLGenerator.java | 8 +- .../urls/StandardCategoryURLGenerator.java | 6 +- .../chart/urls/StandardXYURLGenerator.java | 6 +- .../chart/urls/StandardXYZURLGenerator.java | 6 +- .../chart/urls/TimeSeriesURLGenerator.java | 6 +- .../org/jfree/chart/urls/XYURLGenerator.java | 6 +- .../org/jfree/chart/urls/XYZURLGenerator.java | 6 +- .../jfree/chart/util/AbstractObjectList.java | 31 +++- .../java/org/jfree/chart/util/ObjectList.java | 8 +- .../java/org/jfree/chart/util/PaintList.java | 9 +- .../java/org/jfree/chart/util/StrokeList.java | 9 +- .../DefaultIntervalCategoryDataset.java | 16 +- .../category/IntervalCategoryDataset.java | 8 +- .../gantt/SlidingGanttCategoryDataset.java | 8 +- .../data/gantt/TaskSeriesCollection.java | 10 +- .../org/jfree/data/gantt/XYTaskDataset.java | 44 ++--- .../data/general/AbstractSeriesDataset.java | 6 +- .../org/jfree/data/general/DatasetUtils.java | 8 +- .../org/jfree/data/general/SeriesDataset.java | 6 +- .../statistics/BoxAndWhiskerXYDataset.java | 22 ++- .../DefaultBoxAndWhiskerCategoryDataset.java | 4 + .../DefaultBoxAndWhiskerXYDataset.java | 32 ++-- .../data/statistics/HistogramDataset.java | 26 +-- .../org/jfree/data/statistics/Regression.java | 8 +- .../statistics/SimpleHistogramDataset.java | 32 ++-- .../time/DynamicTimeSeriesCollection.java | 22 ++- .../data/time/TimePeriodValuesCollection.java | 22 ++- .../jfree/data/time/TimeSeriesCollection.java | 26 +-- .../jfree/data/time/TimeTableXYDataset.java | 26 +-- .../data/time/ohlc/OHLCSeriesCollection.java | 36 ++-- .../data/xy/AbstractIntervalXYDataset.java | 11 +- .../org/jfree/data/xy/AbstractXYDataset.java | 8 +- .../org/jfree/data/xy/AbstractXYZDataset.java | 6 +- .../jfree/data/xy/CategoryTableXYDataset.java | 20 ++- .../jfree/data/xy/DefaultHighLowDataset.java | 34 ++-- .../data/xy/DefaultIntervalXYDataset.java | 32 ++-- .../org/jfree/data/xy/DefaultOHLCDataset.java | 34 ++-- .../jfree/data/xy/DefaultTableXYDataset.java | 24 +-- .../org/jfree/data/xy/DefaultWindDataset.java | 16 +- .../org/jfree/data/xy/DefaultXYDataset.java | 16 +- .../org/jfree/data/xy/DefaultXYZDataset.java | 20 ++- .../org/jfree/data/xy/IntervalXYDataset.java | 20 ++- .../org/jfree/data/xy/IntervalXYDelegate.java | 14 +- .../org/jfree/data/xy/IntervalXYZDataset.java | 16 +- .../java/org/jfree/data/xy/OHLCDataset.java | 24 +-- .../jfree/data/xy/VectorSeriesCollection.java | 24 +-- .../org/jfree/data/xy/VectorXYDataset.java | 10 +- .../java/org/jfree/data/xy/WindDataset.java | 8 +- .../data/xy/XIntervalSeriesCollection.java | 30 ++-- .../java/org/jfree/data/xy/XYBarDataset.java | 32 ++-- .../java/org/jfree/data/xy/XYDataset.java | 14 +- .../data/xy/XYIntervalSeriesCollection.java | 34 ++-- .../org/jfree/data/xy/XYSeriesCollection.java | 24 +-- .../java/org/jfree/data/xy/XYZDataset.java | 8 +- .../java/org/jfree/data/xy/XisSymbolic.java | 6 +- .../data/xy/YIntervalSeriesCollection.java | 30 ++-- .../java/org/jfree/data/xy/YisSymbolic.java | 6 +- .../general/TestIntervalCategoryDataset.java | 4 +- 134 files changed, 1427 insertions(+), 851 deletions(-) diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index a23a37450..ae39da2a2 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -65,7 +65,7 @@ package org.jfree.chart; /*>>> -import org.checkerframework.checker.index.qual.IndexFor; +import org.checkerframework.checker.index.qual.*; */ import java.awt.BasicStroke; @@ -122,7 +122,7 @@ public class LegendItem implements Cloneable, Serializable { private int datasetIndex; /** The series index. */ - private int series; + private /*@NonNegative*/ int series; /** The label. */ private String label; diff --git a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java index 08e0dfddd..4866ca86c 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java @@ -213,6 +213,7 @@ public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, if (this.polygon.length < 4) { return; } + PlotOrientation orientation = plot.getOrientation(); RectangleEdge domainEdge = Plot.resolveDomainAxisLocation( plot.getDomainAxisLocation(), orientation); @@ -220,8 +221,11 @@ public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, plot.getRangeAxisLocation(), orientation); GeneralPath area = new GeneralPath(); + + @SuppressWarnings("index") // Length is checked above, and all functions called in-between are pure double x = domainAxis.valueToJava2D(this.polygon[0], dataArea, domainEdge); + @SuppressWarnings("index") // Length is checked above, and all functions called in-between are pure double y = rangeAxis.valueToJava2D(this.polygon[1], dataArea, rangeEdge); if (orientation == PlotOrientation.HORIZONTAL) { diff --git a/src/main/java/org/jfree/chart/axis/CompassFormat.java b/src/main/java/org/jfree/chart/axis/CompassFormat.java index 647d1ea6c..5620e6ca9 100644 --- a/src/main/java/org/jfree/chart/axis/CompassFormat.java +++ b/src/main/java/org/jfree/chart/axis/CompassFormat.java @@ -42,6 +42,11 @@ package org.jfree.chart.axis; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.IntRange; + */ + import java.text.FieldPosition; import java.text.NumberFormat; import java.text.ParsePosition; @@ -53,7 +58,7 @@ public class CompassFormat extends NumberFormat { /** The directions. */ - public final String[] directions; + public final String /*@ArrayLen(16)*/ [] directions; /** * Creates a new formatter using English identifiers. @@ -88,7 +93,7 @@ public CompassFormat(String n, String e, String s, String w) { * * @since 1.0.18 */ - public CompassFormat(String[] directions) { + public CompassFormat(String /*@ArrayLen(16)*/ [] directions) { super(); Args.nullNotPermitted(directions, "directions"); if (directions.length != 16) { @@ -110,7 +115,8 @@ public String getDirectionCode(double direction) { if (direction < 0.0) { direction = direction + 360.0; } - int index = ((int) Math.floor(direction / 11.25) + 1) / 2; + @SuppressWarnings({"index", "value"}) // Math.floor needs annotations? + /*@IntRange(from = 0, to = 15)*/ int index = ((int) Math.floor(direction / 11.25) + 1) / 2; return directions[index]; } diff --git a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java index eacc73118..71c1cce8e 100644 --- a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java +++ b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java @@ -50,6 +50,10 @@ package org.jfree.chart.axis; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; @@ -384,7 +388,7 @@ public CycleBoundTick(boolean mapToLastCycle, Number number, * @return The anchor point. */ @Override - protected float[] calculateAnchorPoint(ValueTick tick, double cursor, + protected float /*@ArrayLen(2)*/ [] calculateAnchorPoint(ValueTick tick, double cursor, Rectangle2D dataArea, RectangleEdge edge) { if (tick instanceof CycleBoundTick) { boolean mapsav = this.boundMappedToLastCycle; diff --git a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java index ee7a10688..85ed41ed0 100644 --- a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java @@ -41,6 +41,11 @@ package org.jfree.chart.axis; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.IntRange; + */ + import java.text.DateFormat; import java.text.DateFormatSymbols; import java.text.FieldPosition; @@ -64,10 +69,10 @@ public class MonthDateFormat extends DateFormat { /** The symbols used for the months. */ - private String[] months; + private String /*@ArrayLen(12)*/ [] months; /** Flags that control which months will have the year appended. */ - private boolean[] showYear; + private boolean /*@ArrayLen(13)*/ [] showYear; /** The year formatter. */ private DateFormat yearFormatter; @@ -163,18 +168,21 @@ public MonthDateFormat(TimeZone zone, Locale locale, int chars, * @param yearFormatter the year formatter. */ public MonthDateFormat(TimeZone zone, Locale locale, int chars, - boolean[] showYear, DateFormat yearFormatter) { + boolean /*@ArrayLen(13)*/ [] showYear, DateFormat yearFormatter) { Args.nullNotPermitted(locale, "locale"); DateFormatSymbols dfs = new DateFormatSymbols(locale); - String[] monthsFromLocale = dfs.getMonths(); + @SuppressWarnings({"value", "index"}) // DateFormatSymbols needs annotations + String /*@ArrayLen(12)*/ [] monthsFromLocale = dfs.getMonths(); this.months = new String[12]; for (int i = 0; i < 12; i++) { + @SuppressWarnings({"index", "value"}) // https://github.com/typetools/checker-framework/issues/1669 + /*@IntRange(from = 0, to = 11)*/ int i1 = i; if (chars > 0) { - this.months[i] = monthsFromLocale[i].substring(0, - Math.min(chars, monthsFromLocale[i].length())); + this.months[i1] = monthsFromLocale[i1].substring(0, + Math.min(chars, monthsFromLocale[i1].length())); } else { - this.months[i] = monthsFromLocale[i]; + this.months[i1] = monthsFromLocale[i1]; } } this.calendar = new GregorianCalendar(zone); @@ -200,7 +208,8 @@ public MonthDateFormat(TimeZone zone, Locale locale, int chars, public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { this.calendar.setTime(date); - int month = this.calendar.get(Calendar.MONTH); + @SuppressWarnings({"index", "value"}) // Calendar needs index annotations + /*@IntRange(from=0, to=11)*/ int month = this.calendar.get(Calendar.MONTH); toAppendTo.append(this.months[month]); if (this.showYear[month]) { toAppendTo.append(this.yearFormatter.format(date)); diff --git a/src/main/java/org/jfree/chart/axis/PeriodAxis.java b/src/main/java/org/jfree/chart/axis/PeriodAxis.java index 87222fdb1..5ecac2b93 100644 --- a/src/main/java/org/jfree/chart/axis/PeriodAxis.java +++ b/src/main/java/org/jfree/chart/axis/PeriodAxis.java @@ -1147,7 +1147,7 @@ public int hashCode() { public Object clone() throws CloneNotSupportedException { PeriodAxis clone = (PeriodAxis) super.clone(); clone.timeZone = (TimeZone) this.timeZone.clone(); - clone.labelInfo = (PeriodAxisLabelInfo[]) this.labelInfo.clone(); + clone.labelInfo = (PeriodAxisLabelInfo /*@ArrayLen(2)*/ []) this.labelInfo.clone(); return clone; } diff --git a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java index 05df205a4..79c34fcce 100644 --- a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java @@ -46,6 +46,11 @@ package org.jfree.chart.axis; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.IntRange; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.FieldPosition; @@ -69,11 +74,11 @@ public class QuarterDateFormat extends DateFormat private static final long serialVersionUID = -6738465248529797176L; /** Symbols for regular quarters. */ - public static final String[] REGULAR_QUARTERS = new String[] {"1", "2", + public static final String /*@ArrayLen(4)*/ [] REGULAR_QUARTERS = new String[] {"1", "2", "3", "4"}; /** Symbols for roman numbered quarters. */ - public static final String[] ROMAN_QUARTERS = new String[] {"I", "II", + public static final String /*@ArrayLen(4)*/ [] ROMAN_QUARTERS = new String[] {"I", "II", "III", "IV"}; /** @@ -81,11 +86,11 @@ public class QuarterDateFormat extends DateFormat * * @since 1.0.6 */ - public static final String[] GREEK_QUARTERS = new String[] {"\u0391", + public static final String /*@ArrayLen(4)*/ [] GREEK_QUARTERS = new String[] {"\u0391", "\u0392", "\u0393", "\u0394"}; /** The strings. */ - private String[] quarters = REGULAR_QUARTERS; + private String /*@ArrayLen(4)*/ [] quarters = REGULAR_QUARTERS; /** A flag that controls whether the quarter or the year goes first. */ private boolean quarterFirst; @@ -112,7 +117,7 @@ public QuarterDateFormat(TimeZone zone) { * @param zone the time zone ({@code null} not permitted). * @param quarterSymbols the quarter symbols. */ - public QuarterDateFormat(TimeZone zone, String[] quarterSymbols) { + public QuarterDateFormat(TimeZone zone, String /*@ArrayLen(4)*/ [] quarterSymbols) { this(zone, quarterSymbols, false); } @@ -126,7 +131,7 @@ public QuarterDateFormat(TimeZone zone, String[] quarterSymbols) { * * @since 1.0.6 */ - public QuarterDateFormat(TimeZone zone, String[] quarterSymbols, + public QuarterDateFormat(TimeZone zone, String /*@ArrayLen(4)*/ [] quarterSymbols, boolean quarterFirst) { Args.nullNotPermitted(zone, "zone"); this.calendar = new GregorianCalendar(zone); @@ -154,7 +159,8 @@ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { this.calendar.setTime(date); int year = this.calendar.get(Calendar.YEAR); - int month = this.calendar.get(Calendar.MONTH); + @SuppressWarnings({"index", "value"}) // Calendar needs index annotations + /*@IntRange(from=0, to=11)*/ int month = this.calendar.get(Calendar.MONTH); int quarter = month / 3; if (this.quarterFirst) { toAppendTo.append(this.quarters[quarter]); diff --git a/src/main/java/org/jfree/chart/axis/ValueAxis.java b/src/main/java/org/jfree/chart/axis/ValueAxis.java index d57881e41..9b19367a7 100644 --- a/src/main/java/org/jfree/chart/axis/ValueAxis.java +++ b/src/main/java/org/jfree/chart/axis/ValueAxis.java @@ -116,6 +116,7 @@ /*>>> import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.dataflow.qual.Pure; */ import java.awt.Font; @@ -1475,6 +1476,7 @@ public void setMinorTickCount(int count) { * * @see #java2DToValue(double, Rectangle2D, RectangleEdge) */ + /*@Pure*/ public abstract double valueToJava2D(double value, Rectangle2D area, RectangleEdge edge); diff --git a/src/main/java/org/jfree/chart/block/ColumnArrangement.java b/src/main/java/org/jfree/chart/block/ColumnArrangement.java index 7813f7d6e..f5fc36bb6 100644 --- a/src/main/java/org/jfree/chart/block/ColumnArrangement.java +++ b/src/main/java/org/jfree/chart/block/ColumnArrangement.java @@ -41,6 +41,10 @@ package org.jfree.chart.block; +/*>>> +import org.checkerframework.checker.index.qual.SameLen; + */ + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.io.Serializable; @@ -308,6 +312,7 @@ protected Size2D arrangeRF(BlockContainer container, Graphics2D g2, * * @return The size after the arrangement. */ + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/152 protected Size2D arrangeNN(BlockContainer container, Graphics2D g2) { double y = 0.0; double height = 0.0; diff --git a/src/main/java/org/jfree/chart/block/FlowArrangement.java b/src/main/java/org/jfree/chart/block/FlowArrangement.java index a47d79e5d..746ed3f71 100644 --- a/src/main/java/org/jfree/chart/block/FlowArrangement.java +++ b/src/main/java/org/jfree/chart/block/FlowArrangement.java @@ -42,6 +42,10 @@ package org.jfree.chart.block; +/*>>> +import org.checkerframework.checker.index.qual.SameLen; + */ + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.io.Serializable; @@ -353,6 +357,7 @@ protected Size2D arrangeRN(BlockContainer container, Graphics2D g2, * * @return The size after the arrangement. */ + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/152 protected Size2D arrangeNN(BlockContainer container, Graphics2D g2) { double x = 0.0; double width = 0.0; diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index ac5f54dbc..4ec24f544 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -28,6 +28,13 @@ package org.jfree.chart.date; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.IntRange; +import org.checkerframework.common.value.qual.IntVal; +import org.checkerframework.checker.index.qual.SameLen; + */ + import java.io.Serializable; import java.text.DateFormatSymbols; import java.text.SimpleDateFormat; @@ -62,7 +69,7 @@ public abstract class SerialDate implements Comparable, Serializable, DATE_FORMAT_SYMBOLS = new SimpleDateFormat().getDateFormatSymbols(); /** The serial number for 1 January 1900. */ - public static final int SERIAL_LOWER_BOUND = 2; + public static final /*@IntVal(2)*/ int SERIAL_LOWER_BOUND = 2; /** The serial number for 31 December 9999. */ public static final int SERIAL_UPPER_BOUND = 2958465; @@ -104,25 +111,25 @@ public abstract class SerialDate implements Comparable, Serializable, public static final int SUNDAY = Calendar.SUNDAY; /** The number of days in each month in non leap years. */ - static final int[] LAST_DAY_OF_MONTH = + static final /*@IntRange(from = 0, to = 31)*/ int /*@ArrayLen(13)*/ [] LAST_DAY_OF_MONTH = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /** The number of days in a (non-leap) year up to the end of each month. */ - static final int[] AGGREGATE_DAYS_TO_END_OF_MONTH = + static final int /*@ArrayLen(13)*/ [] AGGREGATE_DAYS_TO_END_OF_MONTH = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; /** The number of days in a year up to the end of the preceding month. */ - static final int[] AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH = + static final /*@IntRange(from = 0, to = 365)*/ int /*@ArrayLen(14)*/ [] AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; /** The number of days in a leap year up to the end of each month. */ - static final int[] LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_MONTH = + static final int /*@ArrayLen(13)*/ [] LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_MONTH = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; /** * The number of days in a leap year up to the end of the preceding month. */ - static final int[] + static final int /*@ArrayLen(14)*/ [] LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH = {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; @@ -218,7 +225,8 @@ public static int stringToWeekdayCode(String s) { final String[] shortWeekdayNames = DATE_FORMAT_SYMBOLS.getShortWeekdays(); - final String[] weekDayNames = DATE_FORMAT_SYMBOLS.getWeekdays(); + @SuppressWarnings("index") // java.text.DateFormatSymbols needs index annotations + final String /*@SameLen("shortWeekdayNames")*/ [] weekDayNames = DATE_FORMAT_SYMBOLS.getWeekdays(); int result = -1; s = s.trim(); @@ -245,8 +253,9 @@ public static int stringToWeekdayCode(String s) { * * @return a string representing the supplied day-of-the-week. */ - public static String weekdayCodeToString(int weekday) { - final String[] weekdays = DATE_FORMAT_SYMBOLS.getWeekdays(); + public static String weekdayCodeToString(/*@IntRange(from=0, to=7)*/ int weekday) { + @SuppressWarnings({"index", "value"}) // java.text.DateFormatSymbols needs index annotations + final String /*@ArrayLen(8)*/ [] weekdays = DATE_FORMAT_SYMBOLS.getWeekdays(); return weekdays[weekday]; } @@ -255,7 +264,7 @@ public static String weekdayCodeToString(int weekday) { * * @return an array of month names. */ - public static String[] getMonths() { + public static String /*@ArrayLen(13)*/ [] getMonths() { return getMonths(false); @@ -269,7 +278,8 @@ public static String[] getMonths() { * * @return an array of month names. */ - public static String[] getMonths(boolean shortened) { + @SuppressWarnings({"index", "value"}) // DateFormatSymbols needs index annotations + public static String /*@ArrayLen(13)*/ [] getMonths(boolean shortened) { if (shortened) { return DATE_FORMAT_SYMBOLS.getShortMonths(); } @@ -315,7 +325,7 @@ public static boolean isValidMonthCode(int code) { * * @return the quarter that the month belongs to. */ - public static int monthCodeToQuarter(int code) { + public static /*@IntVal({1,2,3,4})*/ int monthCodeToQuarter(/*@IntRange(from = 1, to = 12)*/ int code) { switch(code) { case JANUARY: @@ -346,7 +356,7 @@ public static int monthCodeToQuarter(int code) { * * @return a string representing the supplied month. */ - public static String monthCodeToString(int month) { + public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month) { return monthCodeToString(month, false); } @@ -361,7 +371,7 @@ public static String monthCodeToString(int month) { * * @return a string representing the supplied month. */ - public static String monthCodeToString(int month, boolean shortened) { + public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month, boolean shortened) { // check arguments... if (!isValidMonthCode(month)) { @@ -369,13 +379,17 @@ public static String monthCodeToString(int month, boolean shortened) { "SerialDate.monthCodeToString: month outside valid range."); } - final String[] months; + final String /*@ArrayLen(13)*/ [] months; if (shortened) { - months = DATE_FORMAT_SYMBOLS.getShortMonths(); + @SuppressWarnings({"index", "value"}) // java.text.DateFormatSymbols needs index annotations + final String /*@ArrayLen(13)*/ [] monthsTmp = DATE_FORMAT_SYMBOLS.getShortMonths(); + months = monthsTmp; } else { - months = DATE_FORMAT_SYMBOLS.getMonths(); + @SuppressWarnings({"index", "value"}) // java.text.DateFormatSymbols needs index annotations + final String /*@ArrayLen(13)*/ [] monthsTmp = DATE_FORMAT_SYMBOLS.getMonths(); + months = monthsTmp; } return months[month - 1]; @@ -394,10 +408,11 @@ public static String monthCodeToString(int month, boolean shortened) { * @return {@code -1} if the string is not parseable, the month of the * year otherwise. */ - public static int stringToMonthCode(String s) { + public static /*@IntRange(from = -1, to = 12)*/ int stringToMonthCode(String s) { final String[] shortMonthNames = DATE_FORMAT_SYMBOLS.getShortMonths(); - final String[] monthNames = DATE_FORMAT_SYMBOLS.getMonths(); + @SuppressWarnings("index") // Need annotations on Date Format Symbols + final String /*@SameLen("shortMonthNames")*/ [] monthNames = DATE_FORMAT_SYMBOLS.getMonths(); int result = -1; s = s.trim(); @@ -423,8 +438,10 @@ public static int stringToMonthCode(String s) { } } } + @SuppressWarnings({"index", "value"}) // the loop above only ensures that 1 <= result <= 12 if s is an actual month name + /*@IntRange(from = 1, to =12)*/ int toReturn = result; - return result; + return toReturn; } @@ -454,7 +471,7 @@ public static boolean isValidWeekInMonthCode(int code) { * * @return {@code true} if the specified year is a leap year. */ - public static boolean isLeapYear(int yyyy) { + public static boolean isLeapYear(/*@IntRange(from = 1900, to = 9999)*/ int yyyy) { if ((yyyy % 4) != 0) { return false; @@ -479,9 +496,10 @@ else if ((yyyy % 100) == 0) { * * @param yyyy the year (in the range 1900 to 9999). * - * @return the number of leap years from 1900 to the specified year. + * @return the number of leap years from 1900 to the specified year (if year is 9999, 1964 leap years). */ - public static int leapYearCount(int yyyy) { + @SuppressWarnings({"index", "value"}) // imprecision wrt ranges + public static /*@IntRange(from = 0, to = 1964)*/ int leapYearCount(/*@IntRange(from = 1900, to = 9999)*/int yyyy) { int leap4 = (yyyy - 1896) / 4; int leap100 = (yyyy - 1800) / 100; int leap400 = (yyyy - 1600) / 400; @@ -497,7 +515,8 @@ public static int leapYearCount(int yyyy) { * * @return the number of the last day of the month. */ - public static int lastDayOfMonth(int month, int yyyy) { + @SuppressWarnings({"index", "value"}) // February has 28 days, so 1 is only added to 28, not 31. + public static /*@IntRange(from = 28, to = 31)*/ int lastDayOfMonth(/*@IntRange(from=1, to=12)*/ int month, int yyyy) { final int result = LAST_DAY_OF_MONTH[month]; if (month != FEBRUARY) { @@ -521,6 +540,7 @@ else if (isLeapYear(yyyy)) { * * @return a new date. */ + @SuppressWarnings({"index", "value"}) // days could take the serial day number out of range, if it is sufficiently large, but no restriction on days public static SerialDate addDays(int days, SerialDate base) { int serialDayNumber = base.toSerial() + days; return SerialDate.createInstance(serialDayNumber); @@ -538,11 +558,14 @@ public static SerialDate addDays(int days, SerialDate base) { * * @return a new date. */ + @SuppressWarnings({"index", "value"}) // I believe there is an error in this function. TODO: Update this note to explain the error public static SerialDate addMonths(int months, SerialDate base) { int yy = (12 * base.getYYYY() + base.getMonth() + months - 1) / 12; int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1; - int dd = Math.min(base.getDayOfMonth(), - SerialDate.lastDayOfMonth(mm, yy)); + int lastDayOfMonth = SerialDate.lastDayOfMonth(mm, yy); + @SuppressWarnings({"index", "value"}) // https://github.com/typetools/checker-framework/issues/1687 + /*@IntRange(from = 1, to = 31)*/ int dd = Math.min(base.getDayOfMonth(), + lastDayOfMonth); return SerialDate.createInstance(dd, mm, yy); } @@ -555,13 +578,15 @@ public static SerialDate addMonths(int months, SerialDate base) { * * @return A new date. */ + @SuppressWarnings({"index", "value"}) // I believe there is an error in this function. TODO: Update this note to explain the error public static SerialDate addYears(int years, SerialDate base) { int baseY = base.getYYYY(); int baseM = base.getMonth(); int baseD = base.getDayOfMonth(); int targetY = baseY + years; - int targetD = Math.min(baseD, SerialDate.lastDayOfMonth(baseM, targetY)); + @SuppressWarnings({"index", "value"}) // https://github.com/typetools/checker-framework/issues/1687 + /*@IntRange(from = 1, to = 31)*/ int targetD = Math.min(baseD, SerialDate.lastDayOfMonth(baseM, targetY)); return SerialDate.createInstance(targetD, baseM, targetY); } @@ -575,7 +600,7 @@ public static SerialDate addYears(int years, SerialDate base) { * @return the latest date that falls on the specified day-of-the-week and * is BEFORE the base date. */ - public static SerialDate getPreviousDayOfWeek(int targetWeekday, + public static SerialDate getPreviousDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetWeekday, SerialDate base) { // check arguments... @@ -606,7 +631,7 @@ public static SerialDate getPreviousDayOfWeek(int targetWeekday, * @return the earliest date that falls on the specified day-of-the-week * and is AFTER the base date. */ - public static SerialDate getFollowingDayOfWeek(int targetWeekday, + public static SerialDate getFollowingDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetWeekday, SerialDate base) { // check arguments... @@ -638,7 +663,7 @@ public static SerialDate getFollowingDayOfWeek(int targetWeekday, * @return the date that falls on the specified day-of-the-week and is * CLOSEST to the base date. */ - public static SerialDate getNearestDayOfWeek(int targetDOW, SerialDate base) { + public static SerialDate getNearestDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetDOW, SerialDate base) { // check arguments... if (!SerialDate.isValidWeekdayCode(targetDOW)) { @@ -723,7 +748,7 @@ public static String relativeToString(int relative) { * * @return An instance of {@link SerialDate}. */ - public static SerialDate createInstance(int day, int month, int yyyy) { + public static SerialDate createInstance(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int yyyy) { return new SpreadsheetDate(day, month, yyyy); } @@ -735,7 +760,7 @@ public static SerialDate createInstance(int day, int month, int yyyy) { * * @return a instance of SerialDate. */ - public static SerialDate createInstance(int serial) { + public static SerialDate createInstance(/*@IntRange(from = 2, to = 2958465)*/ int serial) { return new SpreadsheetDate(serial); } @@ -746,6 +771,7 @@ public static SerialDate createInstance(int serial) { * * @return a instance of SerialDate. */ + @SuppressWarnings({"index", "value"}) // Gregorian Calendar needs index annotations public static SerialDate createInstance(java.util.Date date) { GregorianCalendar calendar = new GregorianCalendar(); @@ -762,7 +788,7 @@ public static SerialDate createInstance(java.util.Date date) { * * @return the serial number for the date. */ - public abstract int toSerial(); + public abstract /*@IntRange(from = 2, to = 2958465)*/ int toSerial(); /** * Returns a java.util.Date. Since java.util.Date has more precision than @@ -808,28 +834,28 @@ public String toString() { * * @return the year. */ - public abstract int getYYYY(); + public abstract /*@IntRange(from=1900, to=9999)*/ int getYYYY(); /** * Returns the month (January = 1, February = 2, March = 3). * * @return the month of the year. */ - public abstract int getMonth(); + public abstract /*@IntRange(from=1, to=12)*/ int getMonth(); /** * Returns the day of the month. * * @return the day of the month. */ - public abstract int getDayOfMonth(); + public abstract /*@IntRange(from = 1, to = 31)*/ int getDayOfMonth(); /** * Returns the day of the week. * * @return the day of the week. */ - public abstract int getDayOfWeek(); + public abstract /*@IntRange(from = 1, to = 7)*/ int getDayOfWeek(); /** * Returns the difference (in days) between this date and the specified @@ -935,7 +961,7 @@ public abstract boolean isInRange(SerialDate d1, SerialDate d2, * @return the latest date that falls on the specified day-of-the-week and * is BEFORE this date. */ - public SerialDate getPreviousDayOfWeek(int targetDOW) { + public SerialDate getPreviousDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetDOW) { return getPreviousDayOfWeek(targetDOW, this); } @@ -948,7 +974,7 @@ public SerialDate getPreviousDayOfWeek(int targetDOW) { * @return the earliest date that falls on the specified day-of-the-week * and is AFTER this date. */ - public SerialDate getFollowingDayOfWeek(int targetDOW) { + public SerialDate getFollowingDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetDOW) { return getFollowingDayOfWeek(targetDOW, this); } @@ -959,7 +985,7 @@ public SerialDate getFollowingDayOfWeek(int targetDOW) { * * @return the nearest date that falls on the specified day-of-the-week. */ - public SerialDate getNearestDayOfWeek(int targetDOW) { + public SerialDate getNearestDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetDOW) { return getNearestDayOfWeek(targetDOW, this); } diff --git a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java index 862f2ee9d..36dcb404c 100644 --- a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java +++ b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java @@ -28,6 +28,11 @@ package org.jfree.chart.date; +/*>>> +import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.IntRange; + */ + import java.util.Calendar; import java.util.Date; @@ -58,16 +63,16 @@ public class SpreadsheetDate extends SerialDate { * The day number (1-Jan-1900 = 2, 2-Jan-1900 = 3, ..., 31-Dec-9999 = * 2958465). */ - private final int serial; + private final /*@IntRange(from = 2, to = 2958465)*/ int serial; /** The day of the month (1 to 28, 29, 30 or 31 depending on the month). */ - private final int day; + private final /*@IntRange(from = 1, to = 31)*/ int day; /** The month of the year (1 to 12). */ - private final int month; + private final /*@IntRange(from = 1, to = 12)*/ int month; /** The year (1900 to 9999). */ - private final int year; + private final /*@IntRange(from = 1900, to = 9999)*/ int year; /** * Creates a new date instance. @@ -76,7 +81,7 @@ public class SpreadsheetDate extends SerialDate { * @param month the month (in the range 1 to 12). * @param year the year (in the range 1900 to 9999). */ - public SpreadsheetDate(int day, int month, int year) { + public SpreadsheetDate(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1, to = 9999)*/ int year) { if ((year >= 1900) && (year <= 9999)) { this.year = year; @@ -111,7 +116,7 @@ public SpreadsheetDate(int day, int month, int year) { * * @param serial the serial number for the day (range: 2 to 2958465). */ - public SpreadsheetDate(int serial) { + public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { if ((serial >= SERIAL_LOWER_BOUND) && (serial <= SERIAL_UPPER_BOUND)) { this.serial = serial; @@ -144,7 +149,7 @@ public SpreadsheetDate(int serial) { final int ss2 = calcSerial(1, 1, this.year); - int[] daysToEndOfPrecedingMonth + int /*@ArrayLen(14)*/ [] daysToEndOfPrecedingMonth = AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH; if (isLeapYear(this.year)) { @@ -153,10 +158,12 @@ public SpreadsheetDate(int serial) { } // get the month from the serial date - int mm = 1; + /*@IntRange(from = 1, to = 13)*/ int mm = 1; int sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1; while (sss < this.serial) { - mm = mm + 1; + @SuppressWarnings({"index", "value"}) // this loop cannot go around more than 12 times + /*@IntRange(from=2, to=13)*/ int mm1 = mm + 1; + mm = mm1; sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1; } this.month = mm - 1; @@ -175,7 +182,7 @@ public SpreadsheetDate(int serial) { * @return The serial number of this date. */ @Override - public int toSerial() { + public /*@IntRange(from = 2, to = 2958465)*/ int toSerial() { return this.serial; } @@ -197,7 +204,7 @@ public Date toDate() { * @return The year. */ @Override - public int getYYYY() { + public /*@IntRange(from = 1900, to = 9999)*/ int getYYYY() { return this.year; } @@ -207,7 +214,7 @@ public int getYYYY() { * @return The month of the year. */ @Override - public int getMonth() { + public /*@IntRange(from = 1, to = 12)*/ int getMonth() { return this.month; } @@ -217,7 +224,7 @@ public int getMonth() { * @return The day of the month. */ @Override - public int getDayOfMonth() { + public /*@IntRange(from = 1, to = 31)*/ int getDayOfMonth() { return this.day; } @@ -232,7 +239,7 @@ public int getDayOfMonth() { * @return A code representing the day of the week. */ @Override - public int getDayOfWeek() { + public /*@IntRange(from = 1, to = 7)*/ int getDayOfWeek() { return (this.serial + 6) % 7 + 1; } @@ -425,9 +432,11 @@ else if (include == SerialDate.INCLUDE_SECOND) { * * @return the serial number from the day, month and year. */ - private int calcSerial(int d, int m, int y) { + private /*@IntRange(from = 2, to = 2958465)*/ int calcSerial(/*@IntRange(from = 1, to = 31)*/ int d, /*@IntRange(from=1,to=12)*/ int m, /*@IntRange(from = 1900, to = 9999)*/ int y) { + @SuppressWarnings({"index", "value"}) // Though passing y - 1 is technically incorrect iff y = 1900, leapYearCount returns zero if passed 1899 (same as 1900). int yy = ((y - 1900) * 365) + SerialDate.leapYearCount(y - 1); - int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m]; + @SuppressWarnings({"index", "value"}) // Preceding month can't be December - month must be 1 - 12 (12 -> current month is december). + /*@IntRange(from = 0, to = 336)*/ int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m]; if (m > MonthConstants.FEBRUARY) { if (SerialDate.isLeapYear(y)) { mm = mm + 1; diff --git a/src/main/java/org/jfree/chart/entity/XYItemEntity.java b/src/main/java/org/jfree/chart/entity/XYItemEntity.java index f55f1d675..de4aa78d5 100644 --- a/src/main/java/org/jfree/chart/entity/XYItemEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYItemEntity.java @@ -50,6 +50,10 @@ package org.jfree.chart.entity; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Shape; import org.jfree.data.xy.XYDataset; @@ -67,7 +71,7 @@ public class XYItemEntity extends ChartEntity { private transient XYDataset dataset; /** The series. */ - private int series; + private /*@NonNegative*/ int series; /** The item. */ private int item; @@ -83,7 +87,7 @@ public class XYItemEntity extends ChartEntity { * @param urlText the URL text for HTML image maps. */ public XYItemEntity(Shape area, - XYDataset dataset, int series, int item, + XYDataset dataset, /*@NonNegative*/ int series, int item, String toolTipText, String urlText) { super(area, toolTipText, urlText); this.dataset = dataset; @@ -123,7 +127,7 @@ public int getSeriesIndex() { * * @param series the series index (zero-based). */ - public void setSeriesIndex(int series) { + public void setSeriesIndex(/*@NonNegative*/ int series) { this.series = series; } diff --git a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java index ddd11105e..d8c532123 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java @@ -55,6 +55,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; @@ -233,7 +237,7 @@ public DateFormat getYDateFormat() { * * @return The label (possibly {@code null}). */ - public String generateLabelString(XYDataset dataset, int series, int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, int item) { String result; Object[] items = createItemArray(dataset, series, item); result = MessageFormat.format(this.formatString, items); @@ -262,7 +266,7 @@ public String getNullYString() { * @return An array of three items from the dataset formatted as * {@code String} objects (never {@code null}). */ - protected Object[] createItemArray(XYDataset dataset, int series, + protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, int item) { Object[] result = new Object[3]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java index 29e8dff2a..133031f1e 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java @@ -41,6 +41,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.MessageFormat; import java.text.NumberFormat; @@ -108,7 +112,7 @@ public BoxAndWhiskerToolTipGenerator(String format, * @return The items (never {@code null}). */ @Override - protected Object[] createItemArray(CategoryDataset dataset, int series, + protected Object[] createItemArray(CategoryDataset dataset, /*@NonNegative*/ int series, int item) { Object[] result = new Object[8]; result[0] = dataset.getRowKey(series); diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 4a287ecb5..16d63c097 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -49,6 +49,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; @@ -123,7 +127,7 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, * @return The items (never {@code null}). */ @Override - protected Object[] createItemArray(XYDataset dataset, int series, + protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, int item) { Object[] result = new Object[8]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index bfd78e994..c8b4a6f84 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -45,6 +45,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; @@ -161,7 +165,7 @@ public DateFormat getZDateFormat() { * @return The item label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, int series, int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int item) { return generateLabelString(dataset, series, item); } @@ -175,7 +179,7 @@ public String generateLabel(XYDataset dataset, int series, int item) { * @return The label (possibly {@code null}). */ @Override - public String generateLabelString(XYDataset dataset, int series, int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, int item) { String result; Object[] items; if (dataset instanceof XYZDataset) { diff --git a/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java index 56e958813..a99597c6f 100644 --- a/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java @@ -42,6 +42,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.category.CategoryDataset; /** @@ -62,6 +66,6 @@ public interface CategorySeriesLabelGenerator { * * @return A series label. */ - public String generateLabel(CategoryDataset dataset, int series); + public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int series); } diff --git a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java index 36794e636..0d186b223 100644 --- a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java @@ -46,6 +46,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.List; import org.jfree.chart.util.PublicCloneable; @@ -106,7 +110,7 @@ public int getToolTipCount(int list) { * * @return The tool tip text. */ - public String getToolTipText(int series, int item) { + public String getToolTipText(/*@NonNegative*/ int series, int item) { String result = null; @@ -141,7 +145,7 @@ public void addToolTipSeries(List toolTips) { * @return The tooltip text. */ @Override - public String generateToolTip(XYDataset data, int series, int item) { + public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, int item) { return getToolTipText(series, item); } diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index 00bb845dd..0fb9cbc3d 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -52,6 +52,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.NumberFormat; @@ -118,7 +122,7 @@ public HighLowItemLabelGenerator(DateFormat dateFormatter, * @return The tooltip text. */ @Override - public String generateToolTip(XYDataset dataset, int series, int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, int item) { if (!(dataset instanceof OHLCDataset)) { return null; } @@ -164,7 +168,7 @@ public String generateToolTip(XYDataset dataset, int series, int item) { * @return The label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, int series, int category) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int category) { return null; //TODO: implement this method properly } diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index 7d39a2293..d417310d2 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -40,6 +40,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; @@ -149,7 +153,7 @@ public IntervalXYItemLabelGenerator(String formatString, * {@code String} objects (never {@code null}). */ @Override - protected Object[] createItemArray(XYDataset dataset, int series, + protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, int item) { IntervalXYDataset intervalDataset = null; @@ -235,7 +239,7 @@ protected Object[] createItemArray(XYDataset dataset, int series, * @return The label text (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, int series, int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index a3c09ba75..819c36e58 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -40,6 +40,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; @@ -146,7 +150,7 @@ public IntervalXYToolTipGenerator(String formatString, * {@code String} objects (never {@code null}). */ @Override - protected Object[] createItemArray(XYDataset dataset, int series, + protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, int item) { IntervalXYDataset intervalDataset = null; if (dataset instanceof IntervalXYDataset) { @@ -227,7 +231,7 @@ protected Object[] createItemArray(XYDataset dataset, int series, * @return The tool tip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset dataset, int series, int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java index 8309feb23..a307df2d1 100644 --- a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java @@ -44,6 +44,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.MessageFormat; import java.util.HashMap; @@ -104,7 +108,7 @@ public MultipleXYSeriesLabelGenerator(String format) { * @param series the series index. * @param label the label. */ - public void addSeriesLabel(int series, String label) { + public void addSeriesLabel(/*@NonNegative*/ int series, String label) { Integer key = new Integer(series); List labelList = (List) this.seriesLabelLists.get(key); if (labelList == null) { @@ -119,7 +123,7 @@ public void addSeriesLabel(int series, String label) { * * @param series the series index. */ - public void clearSeriesLabels(int series) { + public void clearSeriesLabels(/*@NonNegative*/ int series) { Integer key = new Integer(series); this.seriesLabelLists.put(key, null); } @@ -134,7 +138,7 @@ public void clearSeriesLabels(int series) { * @return A series label. */ @Override - public String generateLabel(XYDataset dataset, int series) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series) { Args.nullNotPermitted(dataset, "dataset"); StringBuilder label = new StringBuilder(); label.append(MessageFormat.format(this.formatPattern, @@ -162,7 +166,7 @@ public String generateLabel(XYDataset dataset, int series) { * * @return The items (never {@code null}). */ - protected Object[] createItemArray(XYDataset dataset, int series) { + protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series) { Object[] result = new Object[1]; result[0] = dataset.getSeriesKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java index 1a560129f..57c15b35b 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java @@ -44,6 +44,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.MessageFormat; @@ -95,7 +99,7 @@ public StandardCategorySeriesLabelGenerator(String format) { * @return A series label. */ @Override - public String generateLabel(CategoryDataset dataset, int series) { + public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int series) { Args.nullNotPermitted(dataset, "dataset"); String label = MessageFormat.format(this.formatPattern, createItemArray(dataset, series)); @@ -111,7 +115,7 @@ public String generateLabel(CategoryDataset dataset, int series) { * * @return The items (never {@code null}). */ - protected Object[] createItemArray(CategoryDataset dataset, int series) { + protected Object[] createItemArray(CategoryDataset dataset, /*@NonNegative*/ int series) { Object[] result = new Object[1]; result[0] = dataset.getRowKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java index 7830b10ee..a736fa17d 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java @@ -60,6 +60,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.NumberFormat; @@ -180,7 +184,7 @@ public StandardXYItemLabelGenerator(String formatString, * @return The label text (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, int series, int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java index baa55d202..400f3fcc0 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java @@ -44,6 +44,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.MessageFormat; @@ -99,7 +103,7 @@ public StandardXYSeriesLabelGenerator(String format) { * @return A series label. */ @Override - public String generateLabel(XYDataset dataset, int series) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series) { Args.nullNotPermitted(dataset, "dataset"); String label = MessageFormat.format( this.formatPattern, createItemArray(dataset, series) @@ -116,7 +120,7 @@ this.formatPattern, createItemArray(dataset, series) * * @return The items (never {@code null}). */ - protected Object[] createItemArray(XYDataset dataset, int series) { + protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series) { Object[] result = new Object[1]; result[0] = dataset.getSeriesKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java index 3fe021d3a..6f9ea7954 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java @@ -42,6 +42,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.NumberFormat; @@ -162,7 +166,7 @@ public StandardXYToolTipGenerator(String formatString, * @return The tooltip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset dataset, int series, int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index ec111e336..e7ec700c0 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -42,6 +42,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; @@ -157,7 +161,7 @@ public DateFormat getZDateFormat() { * @return The tooltip text (possibly {@code null}). */ @Override - public String generateToolTip(XYZDataset dataset, int series, int item) { + public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, int item) { return generateLabelString(dataset, series, item); } @@ -171,7 +175,7 @@ public String generateToolTip(XYZDataset dataset, int series, int item) { * @return The label (possibly {@code null}). */ @Override - public String generateLabelString(XYDataset dataset, int series, int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, int item) { String result; Object[] items = createItemArray((XYZDataset) dataset, series, item); result = MessageFormat.format(getFormatString(), items); diff --git a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java index ed0c004db..98e3efcfe 100644 --- a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java @@ -49,6 +49,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; @@ -78,7 +82,7 @@ public class SymbolicXYItemLabelGenerator implements XYItemLabelGenerator, * @return The tool tip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset data, int series, int item) { + public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, int item) { String xStr, yStr; if (data instanceof YisSymbolic) { @@ -115,7 +119,7 @@ else if (data instanceof TimeSeriesCollection) { * @return The label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, int series, int category) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int category) { return null; //TODO: implement this method properly } diff --git a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java index a5481722c..2373410ed 100644 --- a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java @@ -48,6 +48,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.xy.XYDataset; /** @@ -66,6 +70,6 @@ public interface XYItemLabelGenerator { * * @return The label (possibly {@code null}). */ - public String generateLabel(XYDataset dataset, int series, int item); + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java index 43c7f626a..f5bed9e17 100644 --- a/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java @@ -42,6 +42,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.xy.XYDataset; /** @@ -63,6 +67,6 @@ public interface XYSeriesLabelGenerator { * * @return A series label. */ - public String generateLabel(XYDataset dataset, int series); + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series); } diff --git a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java index 17c2322c4..8999cc3c5 100644 --- a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java @@ -42,6 +42,11 @@ package org.jfree.chart.labels; + +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.xy.XYDataset; /** @@ -59,6 +64,6 @@ public interface XYToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(XYDataset dataset, int series, int item); + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java index 5f22f35b5..5a097f8ab 100644 --- a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java @@ -42,6 +42,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.xy.XYZDataset; /** @@ -59,6 +63,6 @@ public interface XYZToolTipGenerator extends XYToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(XYZDataset dataset, int series, int item); + public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/chart/plot/CombinedDomainCategoryPlot.java b/src/main/java/org/jfree/chart/plot/CombinedDomainCategoryPlot.java index 25704cc9e..ca7c1feb3 100644 --- a/src/main/java/org/jfree/chart/plot/CombinedDomainCategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CombinedDomainCategoryPlot.java @@ -463,7 +463,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, parentState.getSharedAxisStates().put(axis, axisState); // draw all the subplots - for (int i = 0; i < this.subplots.size(); i++) { + // this.subplotAreas and this.subplots always have the same length + for (int i = 0; i < this.subplotAreas.length; i++) { CategoryPlot plot = (CategoryPlot) this.subplots.get(i); PlotRenderingInfo subplotInfo = null; if (info != null) { diff --git a/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java b/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java index b53f551c6..44d3ab247 100644 --- a/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java +++ b/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java @@ -496,7 +496,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, parentState.getSharedAxisStates().put(axis, axisState); // draw all the subplots - for (int i = 0; i < this.subplots.size(); i++) { + // this.subplotAreas and this.subplots always have the same length + for (int i = 0; i < this.subplotAreas.length; i++) { XYPlot plot = (XYPlot) this.subplots.get(i); PlotRenderingInfo subplotInfo = null; if (info != null) { diff --git a/src/main/java/org/jfree/chart/plot/CombinedRangeCategoryPlot.java b/src/main/java/org/jfree/chart/plot/CombinedRangeCategoryPlot.java index bacc32389..633d11111 100644 --- a/src/main/java/org/jfree/chart/plot/CombinedRangeCategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CombinedRangeCategoryPlot.java @@ -365,7 +365,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, parentState.getSharedAxisStates().put(axis, state); // draw all the charts - for (int i = 0; i < this.subplots.size(); i++) { + // this.subplotArea and this.subplots always have the same length + for (int i = 0; i < this.subplotArea.length; i++) { CategoryPlot plot = (CategoryPlot) this.subplots.get(i); PlotRenderingInfo subplotInfo = null; if (info != null) { diff --git a/src/main/java/org/jfree/chart/plot/CombinedRangeXYPlot.java b/src/main/java/org/jfree/chart/plot/CombinedRangeXYPlot.java index a68ae118e..4de3dabb8 100644 --- a/src/main/java/org/jfree/chart/plot/CombinedRangeXYPlot.java +++ b/src/main/java/org/jfree/chart/plot/CombinedRangeXYPlot.java @@ -435,7 +435,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, parentState.getSharedAxisStates().put(axis, axisState); // draw all the charts - for (int i = 0; i < this.subplots.size(); i++) { + // this.subplotAreas and this.subplots always have the same length + for (int i = 0; i < this.subplotAreas.length; i++) { XYPlot plot = (XYPlot) this.subplots.get(i); PlotRenderingInfo subplotInfo = null; if (info != null) { diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 3f88d9ec6..53f4f0fae 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -67,6 +67,14 @@ package org.jfree.chart.plot; +/*>>> +import org.checkerframework.common.value.qual.MinLen; +import org.checkerframework.checker.index.qual.SameLen; +import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.index.qual.LTLengthOf; +import org.checkerframework.checker.index.qual.IndexFor; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; @@ -162,10 +170,12 @@ public class CompassPlot extends Plot implements Cloneable, Serializable { private transient Rectangle2D rect1; /** An array of value datasets. */ - private ValueDataset[] datasets = new ValueDataset[1]; + @SuppressWarnings("index") // this.datasets and this.seriesNeedle are always updated in tandem + private ValueDataset /*@MinLen(1)*/ /*@SameLen("this.seriesNeedle")*/ [] datasets = new ValueDataset[1]; /** An array of needles. */ - private MeterNeedle[] seriesNeedle = new MeterNeedle[1]; + @SuppressWarnings("index") // this.datasets and this.seriesNeedle are always updated in tandem + private MeterNeedle /*@MinLen(1)*/ /*@SameLen("this.datasets")*/ [] seriesNeedle = new MeterNeedle[1]; /** The resourceBundle for the localization. */ protected static ResourceBundle localizationResources @@ -369,7 +379,7 @@ public void setDrawBorder(boolean status) { * * @see #setSeriesOutlinePaint(int, Paint) */ - public void setSeriesPaint(int series, Paint paint) { + public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint) { // super.setSeriesPaint(series, paint); if ((series >= 0) && (series < this.seriesNeedle.length)) { this.seriesNeedle[series].setFillPaint(paint); @@ -384,7 +394,7 @@ public void setSeriesPaint(int series, Paint paint) { * * @see #setSeriesPaint(int, Paint) */ - public void setSeriesOutlinePaint(int series, Paint p) { + public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint p) { if ((series >= 0) && (series < this.seriesNeedle.length)) { this.seriesNeedle[series].setOutlinePaint(p); @@ -400,7 +410,7 @@ public void setSeriesOutlinePaint(int series, Paint p) { * * @see #setSeriesOutlinePaint(int, Paint) */ - public void setSeriesOutlineStroke(int series, Stroke stroke) { + public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke) { if ((series >= 0) && (series < this.seriesNeedle.length)) { this.seriesNeedle[series].setOutlineStroke(stroke); @@ -438,12 +448,14 @@ public void setSeriesNeedle(int type) { * * @see #setSeriesNeedle(int) */ - public void setSeriesNeedle(int index, int type) { + public void setSeriesNeedle(/*@NonNegative*/ int index, int type) { switch (type) { case 0: setSeriesNeedle(index, new ArrowNeedle(true)); setSeriesPaint(index, Color.RED); - this.seriesNeedle[index].setHighlightPaint(Color.WHITE); + @SuppressWarnings("index") // I believe this is a bug TODO: explain why and/or verify this + MeterNeedle seriesNeedOfIndex = this.seriesNeedle[index]; + seriesNeedOfIndex.setHighlightPaint(Color.WHITE); break; case 1: setSeriesNeedle(index, new LineNeedle()); @@ -491,7 +503,7 @@ public void setSeriesNeedle(int index, int type) { * @param index the series index. * @param needle the needle. */ - public void setSeriesNeedle(int index, MeterNeedle needle) { + public void setSeriesNeedle(/*@NonNegative*/ int index, MeterNeedle needle) { if ((needle != null) && (index < this.seriesNeedle.length)) { this.seriesNeedle[index] = needle; } @@ -537,7 +549,10 @@ public void addDataset(ValueDataset dataset, MeterNeedle needle) { t[i] = this.datasets[i]; p[i] = this.seriesNeedle[i]; } - i = this.datasets.length; + + @SuppressWarnings("index") // arrays have correlated but non-equal length + /*@LTLengthOf(value = {"t", "p", "p", "this.datasets"}, offset = {"0", "0", "-1", "-1"})*/ int newI = this.datasets.length; + i = newI; t[i] = dataset; p[i] = ((needle != null) ? needle : p[i - 1]); @@ -682,7 +697,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, value = (data.getValue().doubleValue()) % this.revolutionDistance; value = value / this.revolutionDistance * 360; - current = i % x; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + /*@IndexFor("this.seriesNeedle")*/ int current1 = i % x; + current = current1; this.seriesNeedle[current].draw(g2, needleArea, value); } } @@ -801,6 +818,7 @@ public boolean equals(Object obj) { * exception, but subclasses (if any) might. */ @Override + @SuppressWarnings({"value", "index"}) // clone results in identical types public Object clone() throws CloneNotSupportedException { CompassPlot clone = (CompassPlot) super.clone(); diff --git a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java index 009532943..704788c99 100644 --- a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java +++ b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java @@ -48,6 +48,11 @@ package org.jfree.chart.plot; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.index.qual.IndexFor; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Paint; @@ -108,37 +113,37 @@ public class DefaultDrawingSupplier implements DrawingSupplier, Cloneable, private transient Paint[] paintSequence; /** The current paint index. */ - private int paintIndex; + private /*@NonNegative*/ int paintIndex; /** The outline paint sequence. */ private transient Paint[] outlinePaintSequence; /** The current outline paint index. */ - private int outlinePaintIndex; + private /*@NonNegative*/ int outlinePaintIndex; /** The fill paint sequence. */ private transient Paint[] fillPaintSequence; /** The current fill paint index. */ - private int fillPaintIndex; + private /*@NonNegative*/ int fillPaintIndex; /** The stroke sequence. */ private transient Stroke[] strokeSequence; /** The current stroke index. */ - private int strokeIndex; + private /*@NonNegative*/ int strokeIndex; /** The outline stroke sequence. */ private transient Stroke[] outlineStrokeSequence; /** The current outline stroke index. */ - private int outlineStrokeIndex; + private /*@NonNegative*/ int outlineStrokeIndex; /** The shape sequence. */ private transient Shape[] shapeSequence; /** The current shape index. */ - private int shapeIndex; + private /*@NonNegative*/ int shapeIndex; /** * Creates a new supplier, with default sequences for fill paint, outline @@ -210,8 +215,10 @@ public DefaultDrawingSupplier(Paint[] paintSequence, */ @Override public Paint getNextPaint() { + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + /*@IndexFor("this.paintSequence")*/ int index = this.paintIndex % this.paintSequence.length; Paint result - = this.paintSequence[this.paintIndex % this.paintSequence.length]; + = this.paintSequence[index]; this.paintIndex++; return result; } @@ -223,8 +230,9 @@ public Paint getNextPaint() { */ @Override public Paint getNextOutlinePaint() { - Paint result = this.outlinePaintSequence[ - this.outlinePaintIndex % this.outlinePaintSequence.length]; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + /*@IndexFor("this.outlinePaintSequence")*/ int index = this.outlinePaintIndex % this.outlinePaintSequence.length; + Paint result = this.outlinePaintSequence[index]; this.outlinePaintIndex++; return result; } @@ -238,8 +246,9 @@ public Paint getNextOutlinePaint() { */ @Override public Paint getNextFillPaint() { - Paint result = this.fillPaintSequence[this.fillPaintIndex - % this.fillPaintSequence.length]; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + /*@IndexFor("this.fillPaintSequence")*/ int index = this.fillPaintIndex % this.fillPaintSequence.length; + Paint result = this.fillPaintSequence[index]; this.fillPaintIndex++; return result; } @@ -251,8 +260,9 @@ public Paint getNextFillPaint() { */ @Override public Stroke getNextStroke() { - Stroke result = this.strokeSequence[ - this.strokeIndex % this.strokeSequence.length]; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + /*@IndexFor("this.strokeSequence")*/ int index = this.strokeIndex % this.strokeSequence.length; + Stroke result = this.strokeSequence[index]; this.strokeIndex++; return result; } @@ -264,8 +274,9 @@ public Stroke getNextStroke() { */ @Override public Stroke getNextOutlineStroke() { - Stroke result = this.outlineStrokeSequence[ - this.outlineStrokeIndex % this.outlineStrokeSequence.length]; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + /*@IndexFor("this.outlineStrokeSequence")*/ int index = this.outlineStrokeIndex % this.outlineStrokeSequence.length; + Stroke result = this.outlineStrokeSequence[index]; this.outlineStrokeIndex++; return result; } @@ -277,8 +288,9 @@ public Stroke getNextOutlineStroke() { */ @Override public Shape getNextShape() { - Shape result = this.shapeSequence[ - this.shapeIndex % this.shapeSequence.length]; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + /*@IndexFor("this.shapeSequence")*/ int index = this.shapeIndex % this.shapeSequence.length; + Shape result = this.shapeSequence[index]; this.shapeIndex++; return result; } @@ -468,6 +480,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { * @throws IOException if there is an I/O problem. * @throws ClassNotFoundException if there is a problem loading a class. */ + @SuppressWarnings("index") // stream must have been serialized from an object of this class private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); diff --git a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java index f9fdd2dc3..942b02b7a 100644 --- a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java +++ b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java @@ -70,6 +70,7 @@ /*>>> import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.checker.index.qual.SameLen; import org.checkerframework.checker.index.qual.PolySameLen; */ @@ -127,7 +128,7 @@ public class FastScatterPlot extends Plot implements ValueAxisPlot, Pannable, public static final Paint DEFAULT_GRIDLINE_PAINT = Color.lightGray; /** The data. */ - private float /*@ArrayLen(2)*/ [] /*@PolySameLen*/ [] data; + private float /*@ArrayLen(2)*/ [] /*@SameLen({"this.data[0]", "this.data[1]"})*/ [] data; /** The x data range. */ private Range xDataRange; @@ -200,7 +201,7 @@ public FastScatterPlot() { * @param domainAxis the domain (x) axis ({@code null} not permitted). * @param rangeAxis the range (y) axis ({@code null} not permitted). */ - public FastScatterPlot(float /*@ArrayLen(2)*/ [] /*@PolySameLen*/ [] data, + public FastScatterPlot(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0]", "data[1]"})*/ [] data, ValueAxis domainAxis, ValueAxis rangeAxis) { super(); @@ -257,7 +258,7 @@ public float[][] getData() { * * @see #getData() */ - public void setData(float /*@ArrayLen(2)*/ [] /*@PolySameLen*/ [] data) { + public void setData(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0]", "data[1]"})*/ [] data) { this.data = data; fireChangeEvent(); } @@ -706,7 +707,7 @@ else if (axis == this.rangeAxis) { * * @return The range. */ - private Range calculateXDataRange(float[][] data) { + private Range calculateXDataRange(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0]", "data[1]"})*/ [] data) { Range result = null; @@ -738,7 +739,7 @@ private Range calculateXDataRange(float[][] data) { * * @return The range. */ - private Range calculateYDataRange(float[][] data) { + private Range calculateYDataRange(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0]", "data[1]"})*/ [] data) { Range result = null; if (data != null) { @@ -1071,6 +1072,7 @@ public boolean equals(Object obj) { * not support cloning. */ @Override + @SuppressWarnings("index") // clone always results in the same types public Object clone() throws CloneNotSupportedException { FastScatterPlot clone = (FastScatterPlot) super.clone(); diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index 529d3bf2e..e1b535501 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -62,6 +62,10 @@ package org.jfree.chart.plot; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; @@ -383,7 +387,7 @@ public void setAxis(ValueAxis axis) { * * @since 1.0.14 */ - public void setAxis(int index, ValueAxis axis) { + public void setAxis(/*@NonNegative*/ int index, ValueAxis axis) { setAxis(index, axis, true); } @@ -399,7 +403,7 @@ public void setAxis(int index, ValueAxis axis) { * * @since 1.0.14 */ - public void setAxis(int index, ValueAxis axis, boolean notify) { + public void setAxis(/*@NonNegative*/ int index, ValueAxis axis, boolean notify) { ValueAxis existing = getAxis(index); if (existing != null) { existing.removeChangeListener(this); @@ -441,7 +445,7 @@ public PolarAxisLocation getAxisLocation() { * * @since 1.0.14 */ - public PolarAxisLocation getAxisLocation(int index) { + public PolarAxisLocation getAxisLocation(/*@NonNegative*/ int index) { PolarAxisLocation result = null; if (index < this.axisLocations.size()) { result = (PolarAxisLocation) this.axisLocations.get(index); @@ -491,7 +495,7 @@ public void setAxisLocation(PolarAxisLocation location, boolean notify) { * * @since 1.0.14 */ - public void setAxisLocation(int index, PolarAxisLocation location) { + public void setAxisLocation(/*@NonNegative*/ int index, PolarAxisLocation location) { // delegate... setAxisLocation(index, location, true); } @@ -506,7 +510,7 @@ public void setAxisLocation(int index, PolarAxisLocation location) { * * @since 1.0.14 */ - public void setAxisLocation(int index, PolarAxisLocation location, + public void setAxisLocation(/*@NonNegative*/ int index, PolarAxisLocation location, boolean notify) { Args.nullNotPermitted(location, "location"); this.axisLocations.set(index, location); @@ -548,7 +552,7 @@ public XYDataset getDataset() { * * @since 1.0.14 */ - public XYDataset getDataset(int index) { + public XYDataset getDataset(/*@NonNegative*/ int index) { XYDataset result = null; if (index < this.datasets.size()) { result = (XYDataset) this.datasets.get(index); @@ -581,7 +585,7 @@ public void setDataset(XYDataset dataset) { * * @since 1.0.14 */ - public void setDataset(int index, XYDataset dataset) { + public void setDataset(/*@NonNegative*/ int index, XYDataset dataset) { XYDataset existing = getDataset(index); if (existing != null) { existing.removeChangeListener(this); @@ -682,7 +686,7 @@ public void setRenderer(PolarItemRenderer renderer) { * * @since 1.0.14 */ - public void setRenderer(int index, PolarItemRenderer renderer) { + public void setRenderer(/*@NonNegative*/ int index, PolarItemRenderer renderer) { setRenderer(index, renderer, true); } @@ -698,7 +702,7 @@ public void setRenderer(int index, PolarItemRenderer renderer) { * * @since 1.0.14 */ - public void setRenderer(int index, PolarItemRenderer renderer, + public void setRenderer(/*@NonNegative*/ int index, PolarItemRenderer renderer, boolean notify) { PolarItemRenderer existing = getRenderer(index); if (existing != null) { diff --git a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java index 2ce74b6c2..2cb4486c7 100644 --- a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java +++ b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java @@ -71,6 +71,10 @@ package org.jfree.chart.plot; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; @@ -677,7 +681,7 @@ public void setSeriesPaint(Paint paint) { * * @see #setSeriesPaint(int, Paint) */ - public Paint getSeriesPaint(int series) { + public Paint getSeriesPaint(/*@NonNegative*/ int series) { // return the override, if there is one... if (this.seriesPaint != null) { @@ -710,7 +714,7 @@ public Paint getSeriesPaint(int series) { * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(int series, Paint paint) { + public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint) { this.seriesPaintList.setPaint(series, paint); fireChangeEvent(); } @@ -770,7 +774,7 @@ public void setSeriesOutlinePaint(Paint paint) { * * @return The paint (never {@code null}). */ - public Paint getSeriesOutlinePaint(int series) { + public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series) { // return the override, if there is one... if (this.seriesOutlinePaint != null) { return this.seriesOutlinePaint; @@ -790,7 +794,7 @@ public Paint getSeriesOutlinePaint(int series) { * @param series the series index (zero-based). * @param paint the paint ({@code null} permitted). */ - public void setSeriesOutlinePaint(int series, Paint paint) { + public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint) { this.seriesOutlinePaintList.setPaint(series, paint); fireChangeEvent(); } @@ -846,7 +850,7 @@ public void setSeriesOutlineStroke(Stroke stroke) { * * @return The stroke (never {@code null}). */ - public Stroke getSeriesOutlineStroke(int series) { + public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series) { // return the override, if there is one... if (this.seriesOutlineStroke != null) { @@ -869,7 +873,7 @@ public Stroke getSeriesOutlineStroke(int series) { * @param series the series index (zero-based). * @param stroke the stroke ({@code null} permitted). */ - public void setSeriesOutlineStroke(int series, Stroke stroke) { + public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke) { this.seriesOutlineStrokeList.setStroke(series, stroke); fireChangeEvent(); } @@ -1379,7 +1383,7 @@ protected void drawRadarPoly(Graphics2D g2, * * @see #getDataExtractOrder() */ - protected Number getPlotValue(int series, int cat) { + protected Number getPlotValue(/*@NonNegative*/ int series, int cat) { Number value = null; if (this.dataExtractOrder == TableOrder.BY_ROW) { value = this.dataset.getValue(series, cat); diff --git a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java index 29f44de71..a8f8081df 100644 --- a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java +++ b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java @@ -163,56 +163,56 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, private static final long serialVersionUID = 4087093313147984390L; /** A constant for unit type 'None'. */ - public static final int UNITS_NONE = 0; + public static final /*@IntVal(0)*/ int UNITS_NONE = 0; /** A constant for unit type 'Fahrenheit'. */ - public static final int UNITS_FAHRENHEIT = 1; + public static final /*@IntVal(1)*/ int UNITS_FAHRENHEIT = 1; /** A constant for unit type 'Celcius'. */ - public static final int UNITS_CELCIUS = 2; + public static final /*@IntVal(2)*/ int UNITS_CELCIUS = 2; /** A constant for unit type 'Kelvin'. */ - public static final int UNITS_KELVIN = 3; + public static final /*@IntVal(3)*/ int UNITS_KELVIN = 3; /** A constant for the value label position (no label). */ - public static final int NONE = 0; + public static final /*@IntVal(0)*/ int NONE = 0; /** A constant for the value label position (right of the thermometer). */ - public static final int RIGHT = 1; + public static final /*@IntVal(1)*/ int RIGHT = 1; /** A constant for the value label position (left of the thermometer). */ - public static final int LEFT = 2; + public static final /*@IntVal(2)*/ int LEFT = 2; /** A constant for the value label position (in the thermometer bulb). */ - public static final int BULB = 3; + public static final /*@IntVal(3)*/ int BULB = 3; /** A constant for the 'normal' range. */ - public static final int NORMAL = 0; + public static final /*@IntVal(0)*/ int NORMAL = 0; /** A constant for the 'warning' range. */ - public static final int WARNING = 1; + public static final /*@IntVal(1)*/ int WARNING = 1; /** A constant for the 'critical' range. */ - public static final int CRITICAL = 2; + public static final /*@IntVal(2)*/ int CRITICAL = 2; /** The axis gap. */ - protected static final int AXIS_GAP = 10; + protected static final /*@IntVal(10)*/ int AXIS_GAP = 10; /** The unit strings. */ protected static final String /*@ArrayLen(4)*/ [] UNITS = {"", "\u00B0F", "\u00B0C", "\u00B0K"}; /** Index for low value in subrangeInfo matrix. */ - protected static final int RANGE_LOW = 0; + protected static final /*@IntVal(0)*/ int RANGE_LOW = 0; /** Index for high value in subrangeInfo matrix. */ - protected static final int RANGE_HIGH = 1; + protected static final /*@IntVal(1)*/ int RANGE_HIGH = 1; /** Index for display low value in subrangeInfo matrix. */ - protected static final int DISPLAY_LOW = 2; + protected static final /*@IntVal(2)*/ int DISPLAY_LOW = 2; /** Index for display high value in subrangeInfo matrix. */ - protected static final int DISPLAY_HIGH = 3; + protected static final /*@IntVal(3)*/ int DISPLAY_HIGH = 3; /** The default lower bound. */ protected static final double DEFAULT_LOWER_BOUND = 0.0; @@ -225,21 +225,21 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, * * @since 1.0.7 */ - protected static final int DEFAULT_BULB_RADIUS = 40; + protected static final /*@IntVal(40)*/ int DEFAULT_BULB_RADIUS = 40; /** * The default column radius. * * @since 1.0.7 */ - protected static final int DEFAULT_COLUMN_RADIUS = 20; + protected static final /*@IntVal(20)*/ int DEFAULT_COLUMN_RADIUS = 20; /** * The default gap between the outlines representing the thermometer. * * @since 1.0.7 */ - protected static final int DEFAULT_GAP = 5; + protected static final /*@IntVal(5)*/ int DEFAULT_GAP = 5; /** The dataset for the plot. */ private ValueDataset dataset; @@ -1367,7 +1367,7 @@ protected static boolean isValidNumber(double d) { * * @return A boolean. */ - private boolean inSubrange(int subrange, double value) { + private boolean inSubrange(/*@IndexFor("this.subrangeInfo")*/ int subrange, double value) { return (value > this.subrangeInfo[subrange][RANGE_LOW] && value <= this.subrangeInfo[subrange][RANGE_HIGH]); } @@ -1524,6 +1524,7 @@ private static boolean equal(double[][] array1, double[][] array2) { * @throws CloneNotSupportedException if the plot cannot be cloned. */ @Override + @SuppressWarnings({"index", "value"}) // clone always results in the same types public Object clone() throws CloneNotSupportedException { ThermometerPlot clone = (ThermometerPlot) super.clone(); diff --git a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java index 798db2063..0f7eb4d55 100644 --- a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java @@ -99,6 +99,10 @@ package org.jfree.chart.renderer; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; @@ -384,7 +388,7 @@ public abstract class AbstractRenderer implements Cloneable, Serializable { private boolean dataBoundsIncludesVisibleSeriesOnly = true; /** The default radius for the entity 'hotspot' */ - private int defaultEntityRadius; + private /*@NonNegative*/ int defaultEntityRadius; /** Storage for registered change listeners. */ private transient EventListenerList listenerList; @@ -512,13 +516,13 @@ protected void endElementGroup(Graphics2D g2) { * * @return A boolean. */ - public boolean getItemVisible(int series, int item) { + public boolean getItemVisible(/*@NonNegative*/ int series, int item) { return isSeriesVisible(series); } /** * Returns a boolean that indicates whether or not the specified series - * should be drawn. In fact this method should be named + * should be drawn. In fact this method should be named * lookupSeriesVisible() to be consistent with the other series * attributes and avoid confusion with the getSeriesVisible() method. * @@ -526,7 +530,7 @@ public boolean getItemVisible(int series, int item) { * * @return A boolean. */ - public boolean isSeriesVisible(int series) { + public boolean isSeriesVisible(/*@NonNegative*/ int series) { boolean result = this.defaultSeriesVisible; Boolean b = this.seriesVisibleList.getBoolean(series); if (b != null) { @@ -544,7 +548,7 @@ public boolean isSeriesVisible(int series) { * * @see #setSeriesVisible(int, Boolean) */ - public Boolean getSeriesVisible(int series) { + public Boolean getSeriesVisible(/*@NonNegative*/ int series) { return this.seriesVisibleList.getBoolean(series); } @@ -557,7 +561,7 @@ public Boolean getSeriesVisible(int series) { * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(int series, Boolean visible) { + public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible) { setSeriesVisible(series, visible, true); } @@ -572,7 +576,7 @@ public void setSeriesVisible(int series, Boolean visible) { * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(int series, Boolean visible, boolean notify) { + public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify) { this.seriesVisibleList.setBoolean(series, visible); if (notify) { // we create an event with a special flag set...the purpose of @@ -596,7 +600,7 @@ public boolean getDefaultSeriesVisible() { } /** - * Sets the default series visibility and sends a + * Sets the default series visibility and sends a * {@link RendererChangeEvent} to all registered listeners. * * @param visible the flag. @@ -639,7 +643,7 @@ public void setDefaultSeriesVisible(boolean visible, boolean notify) { * * @return A boolean. */ - public boolean isSeriesVisibleInLegend(int series) { + public boolean isSeriesVisibleInLegend(/*@NonNegative*/ int series) { boolean result = this.defaultSeriesVisibleInLegend; Boolean b = this.seriesVisibleInLegendList.getBoolean(series); if (b != null) { @@ -660,7 +664,7 @@ public boolean isSeriesVisibleInLegend(int series) { * * @see #setSeriesVisibleInLegend(int, Boolean) */ - public Boolean getSeriesVisibleInLegend(int series) { + public Boolean getSeriesVisibleInLegend(/*@NonNegative*/ int series) { return this.seriesVisibleInLegendList.getBoolean(series); } @@ -673,7 +677,7 @@ public Boolean getSeriesVisibleInLegend(int series) { * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(int series, Boolean visible) { + public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible) { setSeriesVisibleInLegend(series, visible, true); } @@ -688,7 +692,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible) { * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(int series, Boolean visible, + public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible, boolean notify) { this.seriesVisibleInLegendList.setBoolean(series, visible); if (notify) { @@ -729,7 +733,7 @@ public void setDefaultSeriesVisibleInLegend(boolean visible) { * * @see #getDefaultSeriesVisibleInLegend() */ - public void setDefaultSeriesVisibleInLegend(boolean visible, + public void setDefaultSeriesVisibleInLegend(boolean visible, boolean notify) { this.defaultSeriesVisibleInLegend = visible; if (notify) { @@ -765,7 +769,7 @@ public Paint getItemPaint(int row, int column) { * * @since 1.0.6 */ - public Paint lookupSeriesPaint(int series) { + public Paint lookupSeriesPaint(/*@NonNegative*/ int series) { Paint seriesPaint = getSeriesPaint(series); if (seriesPaint == null && this.autoPopulateSeriesPaint) { @@ -791,7 +795,7 @@ public Paint lookupSeriesPaint(int series) { * * @see #setSeriesPaint(int, Paint) */ - public Paint getSeriesPaint(int series) { + public Paint getSeriesPaint(/*@NonNegative*/ int series) { return this.paintList.getPaint(series); } @@ -804,7 +808,7 @@ public Paint getSeriesPaint(int series) { * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(int series, Paint paint) { + public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint) { setSeriesPaint(series, paint, true); } @@ -818,7 +822,7 @@ public void setSeriesPaint(int series, Paint paint) { * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(int series, Paint paint, boolean notify) { + public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint, boolean notify) { this.paintList.setPaint(series, paint); if (notify) { fireChangeEvent(); @@ -934,7 +938,7 @@ public Paint getItemFillPaint(int row, int column) { * * @since 1.0.6 */ - public Paint lookupSeriesFillPaint(int series) { + public Paint lookupSeriesFillPaint(/*@NonNegative*/ int series) { Paint seriesFillPaint = getSeriesFillPaint(series); if (seriesFillPaint == null && this.autoPopulateSeriesFillPaint) { @@ -960,7 +964,7 @@ public Paint lookupSeriesFillPaint(int series) { * * @see #setSeriesFillPaint(int, Paint) */ - public Paint getSeriesFillPaint(int series) { + public Paint getSeriesFillPaint(/*@NonNegative*/ int series) { return this.fillPaintList.getPaint(series); } @@ -973,7 +977,7 @@ public Paint getSeriesFillPaint(int series) { * * @see #getSeriesFillPaint(int) */ - public void setSeriesFillPaint(int series, Paint paint) { + public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint) { setSeriesFillPaint(series, paint, true); } @@ -987,7 +991,7 @@ public void setSeriesFillPaint(int series, Paint paint) { * * @see #getSeriesFillPaint(int) */ - public void setSeriesFillPaint(int series, Paint paint, boolean notify) { + public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint, boolean notify) { this.fillPaintList.setPaint(series, paint); if (notify) { fireChangeEvent(); @@ -1093,7 +1097,7 @@ public Paint getItemOutlinePaint(int row, int column) { * * @since 1.0.6 */ - public Paint lookupSeriesOutlinePaint(int series) { + public Paint lookupSeriesOutlinePaint(/*@NonNegative*/ int series) { Paint seriesOutlinePaint = getSeriesOutlinePaint(series); if (seriesOutlinePaint == null && this.autoPopulateSeriesOutlinePaint) { @@ -1119,7 +1123,7 @@ public Paint lookupSeriesOutlinePaint(int series) { * * @see #setSeriesOutlinePaint(int, Paint) */ - public Paint getSeriesOutlinePaint(int series) { + public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series) { return this.outlinePaintList.getPaint(series); } @@ -1132,7 +1136,7 @@ public Paint getSeriesOutlinePaint(int series) { * * @see #getSeriesOutlinePaint(int) */ - public void setSeriesOutlinePaint(int series, Paint paint) { + public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint) { setSeriesOutlinePaint(series, paint, true); } @@ -1146,7 +1150,7 @@ public void setSeriesOutlinePaint(int series, Paint paint) { * * @see #getSeriesOutlinePaint(int) */ - public void setSeriesOutlinePaint(int series, Paint paint, boolean notify) { + public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint, boolean notify) { this.outlinePaintList.setPaint(series, paint); if (notify) { fireChangeEvent(); @@ -1250,7 +1254,7 @@ public Stroke getItemStroke(int row, int column) { * * @since 1.0.6 */ - public Stroke lookupSeriesStroke(int series) { + public Stroke lookupSeriesStroke(/*@NonNegative*/ int series) { Stroke result = getSeriesStroke(series); if (result == null && this.autoPopulateSeriesStroke) { @@ -1276,7 +1280,7 @@ public Stroke lookupSeriesStroke(int series) { * * @see #setSeriesStroke(int, Stroke) */ - public Stroke getSeriesStroke(int series) { + public Stroke getSeriesStroke(/*@NonNegative*/ int series) { return this.strokeList.getStroke(series); } @@ -1289,7 +1293,7 @@ public Stroke getSeriesStroke(int series) { * * @see #getSeriesStroke(int) */ - public void setSeriesStroke(int series, Stroke stroke) { + public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke) { setSeriesStroke(series, stroke, true); } @@ -1303,7 +1307,7 @@ public void setSeriesStroke(int series, Stroke stroke) { * * @see #getSeriesStroke(int) */ - public void setSeriesStroke(int series, Stroke stroke, boolean notify) { + public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify) { this.strokeList.setStroke(series, stroke); if (notify) { fireChangeEvent(); @@ -1420,7 +1424,7 @@ public Stroke getItemOutlineStroke(int row, int column) { * * @since 1.0.6 */ - public Stroke lookupSeriesOutlineStroke(int series) { + public Stroke lookupSeriesOutlineStroke(/*@NonNegative*/ int series) { Stroke result = getSeriesOutlineStroke(series); if (result == null && this.autoPopulateSeriesOutlineStroke) { @@ -1446,7 +1450,7 @@ public Stroke lookupSeriesOutlineStroke(int series) { * * @see #setSeriesOutlineStroke(int, Stroke) */ - public Stroke getSeriesOutlineStroke(int series) { + public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series) { return this.outlineStrokeList.getStroke(series); } @@ -1459,7 +1463,7 @@ public Stroke getSeriesOutlineStroke(int series) { * * @see #getSeriesOutlineStroke(int) */ - public void setSeriesOutlineStroke(int series, Stroke stroke) { + public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke) { setSeriesOutlineStroke(series, stroke, true); } @@ -1473,7 +1477,7 @@ public void setSeriesOutlineStroke(int series, Stroke stroke) { * * @see #getSeriesOutlineStroke(int) */ - public void setSeriesOutlineStroke(int series, Stroke stroke, + public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify) { this.outlineStrokeList.setStroke(series, stroke); if (notify) { @@ -1493,7 +1497,7 @@ public Stroke getDefaultOutlineStroke() { } /** - * Sets the default outline stroke and sends a {@link RendererChangeEvent} + * Sets the default outline stroke and sends a {@link RendererChangeEvent} * to all registered listeners. * * @param stroke the stroke ({@code null} not permitted). @@ -1557,8 +1561,8 @@ public void setAutoPopulateSeriesOutlineStroke(boolean auto) { /** * Returns a shape used to represent a data item. *

- * The default implementation passes control to the - * {@link #lookupSeriesShape(int)} method. You can override this method if + * The default implementation passes control to the + * {@link #lookupSeriesShape(int)} method. You can override this method if * you require different behaviour. * * @param row the row (or series) index (zero-based). @@ -1579,7 +1583,7 @@ public Shape getItemShape(int row, int column) { * * @since 1.0.6 */ - public Shape lookupSeriesShape(int series) { + public Shape lookupSeriesShape(/*@NonNegative*/ int series) { Shape result = getSeriesShape(series); if (result == null && this.autoPopulateSeriesShape) { @@ -1605,7 +1609,7 @@ public Shape lookupSeriesShape(int series) { * * @see #setSeriesShape(int, Shape) */ - public Shape getSeriesShape(int series) { + public Shape getSeriesShape(/*@NonNegative*/ int series) { return this.shapeList.getShape(series); } @@ -1618,7 +1622,7 @@ public Shape getSeriesShape(int series) { * * @see #getSeriesShape(int) */ - public void setSeriesShape(int series, Shape shape) { + public void setSeriesShape(/*@NonNegative*/ int series, Shape shape) { setSeriesShape(series, shape, true); } @@ -1632,7 +1636,7 @@ public void setSeriesShape(int series, Shape shape) { * * @see #getSeriesShape(int) */ - public void setSeriesShape(int series, Shape shape, boolean notify) { + public void setSeriesShape(/*@NonNegative*/ int series, Shape shape, boolean notify) { this.shapeList.setShape(series, shape); if (notify) { fireChangeEvent(); @@ -1731,7 +1735,7 @@ public boolean isItemLabelVisible(int row, int column) { * * @return A boolean. */ - public boolean isSeriesItemLabelsVisible(int series) { + public boolean isSeriesItemLabelsVisible(/*@NonNegative*/ int series) { Boolean b = this.itemLabelsVisibleList.getBoolean(series); if (b == null) { return this.defaultItemLabelsVisible; @@ -1746,7 +1750,7 @@ public boolean isSeriesItemLabelsVisible(int series) { * @param series the series index (zero-based). * @param visible the flag. */ - public void setSeriesItemLabelsVisible(int series, boolean visible) { + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, boolean visible) { setSeriesItemLabelsVisible(series, Boolean.valueOf(visible)); } @@ -1757,7 +1761,7 @@ public void setSeriesItemLabelsVisible(int series, boolean visible) { * @param series the series index (zero-based). * @param visible the flag ({@code null} permitted). */ - public void setSeriesItemLabelsVisible(int series, Boolean visible) { + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible) { setSeriesItemLabelsVisible(series, visible, true); } @@ -1770,7 +1774,7 @@ public void setSeriesItemLabelsVisible(int series, Boolean visible) { * @param notify a flag that controls whether or not listeners are * notified. */ - public void setSeriesItemLabelsVisible(int series, Boolean visible, + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify) { this.itemLabelsVisibleList.setBoolean(series, visible); if (notify) { @@ -1811,7 +1815,7 @@ public void setDefaultItemLabelsVisible(boolean visible) { * @param notify a flag that controls whether or not listeners are * notified. * - * @see #getDefaultItemLabelsVisible() + * @see #getDefaultItemLabelsVisible() */ public void setDefaultItemLabelsVisible(boolean visible, boolean notify) { this.defaultItemLabelsVisible = visible; @@ -1847,7 +1851,7 @@ public Font getItemLabelFont(int row, int column) { * * @see #setSeriesItemLabelFont(int, Font) */ - public Font getSeriesItemLabelFont(int series) { + public Font getSeriesItemLabelFont(/*@NonNegative*/ int series) { return this.itemLabelFontMap.get(series); } @@ -1860,7 +1864,7 @@ public Font getSeriesItemLabelFont(int series) { * * @see #getSeriesItemLabelFont(int) */ - public void setSeriesItemLabelFont(int series, Font font) { + public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font) { setSeriesItemLabelFont(series, font, true); } @@ -1875,7 +1879,7 @@ public void setSeriesItemLabelFont(int series, Font font) { * * @see #getSeriesItemLabelFont(int) */ - public void setSeriesItemLabelFont(int series, Font font, boolean notify) { + public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font, boolean notify) { this.itemLabelFontMap.put(series, font); if (notify) { fireChangeEvent(); @@ -1895,7 +1899,7 @@ public Font getDefaultItemLabelFont() { } /** - * Sets the default item label font and sends a {@link RendererChangeEvent} + * Sets the default item label font and sends a {@link RendererChangeEvent} * to all registered listeners. * * @param font the font ({@code null} not permitted). @@ -1951,7 +1955,7 @@ public Paint getItemLabelPaint(int row, int column) { * * @see #setSeriesItemLabelPaint(int, Paint) */ - public Paint getSeriesItemLabelPaint(int series) { + public Paint getSeriesItemLabelPaint(/*@NonNegative*/ int series) { return this.itemLabelPaintList.getPaint(series); } @@ -1964,7 +1968,7 @@ public Paint getSeriesItemLabelPaint(int series) { * * @see #getSeriesItemLabelPaint(int) */ - public void setSeriesItemLabelPaint(int series, Paint paint) { + public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint) { setSeriesItemLabelPaint(series, paint, true); } @@ -1979,7 +1983,7 @@ public void setSeriesItemLabelPaint(int series, Paint paint) { * * @see #getSeriesItemLabelPaint(int) */ - public void setSeriesItemLabelPaint(int series, Paint paint, + public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint, boolean notify) { this.itemLabelPaintList.setPaint(series, paint); if (notify) { @@ -2041,7 +2045,7 @@ public void setDefaultItemLabelPaint(Paint paint, boolean notify) { * * @see #getNegativeItemLabelPosition(int, int) */ - public ItemLabelPosition getPositiveItemLabelPosition(int row, int column) { + public ItemLabelPosition getPositiveItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getSeriesPositiveItemLabelPosition(row); } @@ -2054,7 +2058,7 @@ public ItemLabelPosition getPositiveItemLabelPosition(int row, int column) { * * @see #setSeriesPositiveItemLabelPosition(int, ItemLabelPosition) */ - public ItemLabelPosition getSeriesPositiveItemLabelPosition(int series) { + public ItemLabelPosition getSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series) { // otherwise look up the position table ItemLabelPosition position = (ItemLabelPosition) this.positiveItemLabelPositionMap.get(series); @@ -2073,7 +2077,7 @@ public ItemLabelPosition getSeriesPositiveItemLabelPosition(int series) { * * @see #getSeriesPositiveItemLabelPosition(int) */ - public void setSeriesPositiveItemLabelPosition(int series, + public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position) { setSeriesPositiveItemLabelPosition(series, position, true); } @@ -2089,7 +2093,7 @@ public void setSeriesPositiveItemLabelPosition(int series, * * @see #getSeriesPositiveItemLabelPosition(int) */ - public void setSeriesPositiveItemLabelPosition(int series, + public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position, boolean notify) { this.positiveItemLabelPositionMap.put(series, position); if (notify) { @@ -2153,7 +2157,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @see #getPositiveItemLabelPosition(int, int) */ - public ItemLabelPosition getNegativeItemLabelPosition(int row, int column) { + public ItemLabelPosition getNegativeItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getSeriesNegativeItemLabelPosition(row); } @@ -2166,9 +2170,9 @@ public ItemLabelPosition getNegativeItemLabelPosition(int row, int column) { * * @see #setSeriesNegativeItemLabelPosition(int, ItemLabelPosition) */ - public ItemLabelPosition getSeriesNegativeItemLabelPosition(int series) { + public ItemLabelPosition getSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series) { // otherwise look up the position list - ItemLabelPosition position + ItemLabelPosition position = this.negativeItemLabelPositionMap.get(series); if (position == null) { position = this.defaultNegativeItemLabelPosition; @@ -2185,7 +2189,7 @@ public ItemLabelPosition getSeriesNegativeItemLabelPosition(int series) { * * @see #getSeriesNegativeItemLabelPosition(int) */ - public void setSeriesNegativeItemLabelPosition(int series, + public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position) { setSeriesNegativeItemLabelPosition(series, position, true); } @@ -2201,7 +2205,7 @@ public void setSeriesNegativeItemLabelPosition(int series, * * @see #getSeriesNegativeItemLabelPosition(int) */ - public void setSeriesNegativeItemLabelPosition(int series, + public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position, boolean notify) { this.negativeItemLabelPositionMap.put(series, position); if (notify) { @@ -2283,7 +2287,7 @@ public void setItemLabelAnchorOffset(double offset) { * * @return A boolean. */ - public boolean getItemCreateEntity(int series, int item) { + public boolean getItemCreateEntity(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Boolean b = getSeriesCreateEntities(series); if (b != null) { return b; @@ -2302,7 +2306,7 @@ public boolean getItemCreateEntity(int series, int item) { * * @see #setSeriesCreateEntities(int, Boolean) */ - public Boolean getSeriesCreateEntities(int series) { + public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series) { return this.createEntitiesList.getBoolean(series); } @@ -2315,7 +2319,7 @@ public Boolean getSeriesCreateEntities(int series) { * * @see #getSeriesCreateEntities(int) */ - public void setSeriesCreateEntities(int series, Boolean create) { + public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create) { setSeriesCreateEntities(series, create, true); } @@ -2330,7 +2334,7 @@ public void setSeriesCreateEntities(int series, Boolean create) { * * @see #getSeriesCreateEntities(int) */ - public void setSeriesCreateEntities(int series, Boolean create, + public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, boolean notify) { this.createEntitiesList.setBoolean(series, create); if (notify) { @@ -2388,7 +2392,7 @@ public void setDefaultCreateEntities(boolean create, boolean notify) { * * @see #setDefaultEntityRadius(int) */ - public int getDefaultEntityRadius() { + public /*@NonNegative*/ int getDefaultEntityRadius() { return this.defaultEntityRadius; } @@ -2400,7 +2404,7 @@ public int getDefaultEntityRadius() { * * @see #getDefaultEntityRadius() */ - public void setDefaultEntityRadius(int radius) { + public void setDefaultEntityRadius(/*@NonNegative*/ int radius) { this.defaultEntityRadius = radius; } @@ -2413,7 +2417,7 @@ public void setDefaultEntityRadius(int radius) { * * @since 1.0.11 */ - public Shape lookupLegendShape(int series) { + public Shape lookupLegendShape(/*@NonNegative*/ int series) { Shape result = getLegendShape(series); if (result == null) { result = this.defaultLegendShape; @@ -2436,7 +2440,7 @@ public Shape lookupLegendShape(int series) { * * @since 1.0.11 */ - public Shape getLegendShape(int series) { + public Shape getLegendShape(/*@NonNegative*/ int series) { return this.legendShapeList.getShape(series); } @@ -2449,7 +2453,7 @@ public Shape getLegendShape(int series) { * * @since 1.0.11 */ - public void setLegendShape(int series, Shape shape) { + public void setLegendShape(/*@NonNegative*/ int series, Shape shape) { this.legendShapeList.setShape(series, shape); fireChangeEvent(); } @@ -2481,9 +2485,9 @@ public void setDefaultLegendShape(Shape shape) { /** * Returns the flag that controls whether or not the legend shape is * treated as a line when creating legend items. - * + * * @return A boolean. - * + * * @since 1.0.14 */ protected boolean getTreatLegendShapeAsLine() { @@ -2514,7 +2518,7 @@ protected void setTreatLegendShapeAsLine(boolean treatAsLine) { * * @since 1.0.11 */ - public Font lookupLegendTextFont(int series) { + public Font lookupLegendTextFont(/*@NonNegative*/ int series) { Font result = getLegendTextFont(series); if (result == null) { result = this.defaultLegendTextFont; @@ -2534,7 +2538,7 @@ public Font lookupLegendTextFont(int series) { * * @since 1.0.11 */ - public Font getLegendTextFont(int series) { + public Font getLegendTextFont(/*@NonNegative*/ int series) { return this.legendTextFontMap.get(series); } @@ -2547,7 +2551,7 @@ public Font getLegendTextFont(int series) { * * @since 1.0.11 */ - public void setLegendTextFont(int series, Font font) { + public void setLegendTextFont(/*@NonNegative*/ int series, Font font) { this.legendTextFontMap.put(series, font); fireChangeEvent(); } @@ -2586,7 +2590,7 @@ public void setDefaultLegendTextFont(Font font) { * * @since 1.0.11 */ - public Paint lookupLegendTextPaint(int series) { + public Paint lookupLegendTextPaint(/*@NonNegative*/ int series) { Paint result = getLegendTextPaint(series); if (result == null) { result = this.defaultLegendTextPaint; @@ -2606,7 +2610,7 @@ public Paint lookupLegendTextPaint(int series) { * * @since 1.0.11 */ - public Paint getLegendTextPaint(int series) { + public Paint getLegendTextPaint(/*@NonNegative*/ int series) { return this.legendTextPaint.getPaint(series); } @@ -2619,7 +2623,7 @@ public Paint getLegendTextPaint(int series) { * * @since 1.0.11 */ - public void setLegendTextPaint(int series, Paint paint) { + public void setLegendTextPaint(/*@NonNegative*/ int series, Paint paint) { this.legendTextPaint.setPaint(series, paint); fireChangeEvent(); } diff --git a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java index e777ff71d..40116f74f 100644 --- a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java @@ -63,6 +63,10 @@ package org.jfree.chart.renderer; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Graphics2D; @@ -367,7 +371,7 @@ public DrawingSupplier getDrawingSupplier() { * * @return A boolean. */ - public boolean isSeriesFilled(int series) { + public boolean isSeriesFilled(/*@NonNegative*/ int series) { boolean result = false; Boolean b = this.seriesFilled.getBoolean(series); if (b != null) { @@ -382,7 +386,7 @@ public boolean isSeriesFilled(int series) { * @param series the series index. * @param filled the flag. */ - public void setSeriesFilled(int series, boolean filled) { + public void setSeriesFilled(/*@NonNegative*/ int series, boolean filled) { this.seriesFilled.setBoolean(series, Boolean.valueOf(filled)); } @@ -455,7 +459,7 @@ public void setLegendLine(Shape line) { * used if {@code area} is {@code null}). */ protected void addEntity(EntityCollection entities, Shape area, - XYDataset dataset, int series, int item, + XYDataset dataset, /*@NonNegative*/ int series, int item, double entityX, double entityY) { if (!getItemCreateEntity(series, item)) { return; @@ -684,7 +688,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * @return The legend item. */ @Override - public LegendItem getLegendItem(int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int series) { LegendItem result; PolarPlot plot = getPlot(); if (plot == null) { @@ -746,7 +750,7 @@ public LegendItem getLegendItem(int series) { * @since 1.0.14 */ @Override - public XYToolTipGenerator getToolTipGenerator(int series, int item) { + public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, int item) { XYToolTipGenerator generator = (XYToolTipGenerator) this.toolTipGeneratorList.get(series); if (generator == null) { @@ -763,7 +767,7 @@ public XYToolTipGenerator getToolTipGenerator(int series, int item) { * @since 1.0.14 */ @Override - public XYToolTipGenerator getSeriesToolTipGenerator(int series) { + public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series) { return (XYToolTipGenerator) this.toolTipGeneratorList.get(series); } @@ -776,7 +780,7 @@ public XYToolTipGenerator getSeriesToolTipGenerator(int series) { * @since 1.0.14 */ @Override - public void setSeriesToolTipGenerator(int series, + public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, XYToolTipGenerator generator) { this.toolTipGeneratorList.set(series, generator); fireChangeEvent(); diff --git a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java index b19790e44..b385b6e4e 100644 --- a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java @@ -41,6 +41,10 @@ package org.jfree.chart.renderer; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.util.List; @@ -105,7 +109,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * * @return The legend item. */ - public LegendItem getLegendItem(int series); + public LegendItem getLegendItem(/*@NonNegative*/ int series); /** * Returns the plot that this renderer has been assigned to. @@ -162,7 +166,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * * @since 1.0.14 */ - public XYToolTipGenerator getSeriesToolTipGenerator(int series); + public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series); /** * Sets the tool tip generator for a series and sends a @@ -175,7 +179,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * * @since 1.0.14 */ - public void setSeriesToolTipGenerator(int series, + public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, XYToolTipGenerator generator); /** diff --git a/src/main/java/org/jfree/chart/renderer/RendererUtils.java b/src/main/java/org/jfree/chart/renderer/RendererUtils.java index 6fc43aed2..bd5b396c8 100644 --- a/src/main/java/org/jfree/chart/renderer/RendererUtils.java +++ b/src/main/java/org/jfree/chart/renderer/RendererUtils.java @@ -45,7 +45,8 @@ package org.jfree.chart.renderer; /*>>> -import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; */ import org.jfree.chart.util.Args; import org.jfree.data.DomainOrder; @@ -73,7 +74,7 @@ public class RendererUtils { * * @see #findLiveItemsUpperBound(XYDataset, int, double, double) */ - public static int findLiveItemsLowerBound(XYDataset dataset, int series, + public static int findLiveItemsLowerBound(XYDataset dataset, /*@NonNegative*/ int series, double xLow, double xHigh) { Args.nullNotPermitted(dataset, "dataset"); if (xLow >= xHigh) { @@ -167,7 +168,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { * * @see #findLiveItemsLowerBound(XYDataset, int, double, double) */ - public static int findLiveItemsUpperBound(XYDataset dataset, int series, + public static int findLiveItemsUpperBound(XYDataset dataset, /*@NonNegative*/ int series, double xLow, double xHigh) { Args.nullNotPermitted(dataset, "dataset"); if (xLow >= xHigh) { @@ -255,7 +256,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { * * @return The indices of the boundary items. */ - public static int /*@ArrayLen(2)*/ [] findLiveItems(XYDataset dataset, int series, + public static int /*@ArrayLen(2)*/ [] findLiveItems(XYDataset dataset, /*@NonNegative*/ int series, double xLow, double xHigh) { // here we could probably be a little faster by searching for both // indices simultaneously, but I'll look at that later if it seems diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 8e85108ff..4f4ea065c 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -111,6 +111,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Font; @@ -305,7 +309,7 @@ public CategoryItemLabelGenerator getItemLabelGenerator(int row, * @see #setSeriesItemLabelGenerator(int, CategoryItemLabelGenerator) */ @Override - public CategoryItemLabelGenerator getSeriesItemLabelGenerator(int series) { + public CategoryItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int series) { // otherwise look up the generator table CategoryItemLabelGenerator generator = this.itemLabelGeneratorMap.get( @@ -326,7 +330,7 @@ public CategoryItemLabelGenerator getSeriesItemLabelGenerator(int series) { * @see #getSeriesItemLabelGenerator(int) */ @Override - public void setSeriesItemLabelGenerator(int series, + public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, CategoryItemLabelGenerator generator) { setSeriesItemLabelGenerator(series, generator, true); } @@ -342,7 +346,7 @@ public void setSeriesItemLabelGenerator(int series, * @see #getSeriesItemLabelGenerator(int) */ @Override - public void setSeriesItemLabelGenerator(int series, + public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, CategoryItemLabelGenerator generator, boolean notify) { this.itemLabelGeneratorMap.put(series, generator); if (notify) { @@ -429,7 +433,7 @@ public CategoryToolTipGenerator getToolTipGenerator(int row, int column) { * @see #setSeriesToolTipGenerator(int, CategoryToolTipGenerator) */ @Override - public CategoryToolTipGenerator getSeriesToolTipGenerator(int series) { + public CategoryToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series) { return this.toolTipGeneratorMap.get(series); } @@ -443,7 +447,7 @@ public CategoryToolTipGenerator getSeriesToolTipGenerator(int series) { * @see #getSeriesToolTipGenerator(int) */ @Override - public void setSeriesToolTipGenerator(int series, + public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, CategoryToolTipGenerator generator) { setSeriesToolTipGenerator(series, generator, true); } @@ -459,7 +463,7 @@ public void setSeriesToolTipGenerator(int series, * @see #getSeriesToolTipGenerator(int) */ @Override - public void setSeriesToolTipGenerator(int series, + public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, CategoryToolTipGenerator generator, boolean notify) { this.toolTipGeneratorMap.put(series, generator); if (notify) { @@ -536,7 +540,7 @@ public CategoryURLGenerator getItemURLGenerator(int row, int column) { * @see #setSeriesItemURLGenerator(int, CategoryURLGenerator) */ @Override - public CategoryURLGenerator getSeriesItemURLGenerator(int series) { + public CategoryURLGenerator getSeriesItemURLGenerator(/*@NonNegative*/ int series) { // otherwise look up the generator table CategoryURLGenerator generator = this.itemURLGeneratorMap.get(series); if (generator == null) { @@ -555,7 +559,7 @@ public CategoryURLGenerator getSeriesItemURLGenerator(int series) { * @see #getSeriesItemURLGenerator(int) */ @Override - public void setSeriesItemURLGenerator(int series, + public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, CategoryURLGenerator generator) { setSeriesItemURLGenerator(series, generator, true); } @@ -571,7 +575,7 @@ public void setSeriesItemURLGenerator(int series, * @see #getSeriesItemURLGenerator(int) */ @Override - public void setSeriesItemURLGenerator(int series, + public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, CategoryURLGenerator generator, boolean notify) { this.itemURLGeneratorMap.put(series, generator); if (notify) { @@ -1246,7 +1250,7 @@ protected Point2D calculateRangeMarkerTextAnchorPoint(Graphics2D g2, * @see #getLegendItems() */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot p = getPlot(); if (p == null) { diff --git a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java index b544bf798..5c8262591 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java @@ -74,6 +74,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; @@ -157,7 +161,7 @@ public void setEndType(AreaRendererEndType type) { * @return The legend item. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { // if there is no plot, there is no dataset to access... CategoryPlot cp = getPlot(); diff --git a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java index 846125d21..54b157f7a 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java @@ -96,6 +96,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; @@ -917,7 +921,7 @@ public Range findRangeBounds(CategoryDataset dataset, * @return The legend item (possibly {@code null}). */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot cp = getPlot(); if (cp == null) { @@ -1104,7 +1108,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, * @return The width of one series. */ protected double calculateSeriesWidth(double space, CategoryAxis axis, - int categories, int series) { + int categories, /*@NonNegative*/ int series) { double factor = 1.0 - getItemMargin() - axis.getLowerMargin() - axis.getUpperMargin(); if (categories > 1) { diff --git a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java index 4639d665c..8cb373070 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java @@ -91,6 +91,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; @@ -451,7 +455,7 @@ public void setWhiskerWidth(double width) { * @return The legend item (possibly {@code null}). */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot cp = getPlot(); if (cp == null) { diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java index 7c7dade56..b66c489d9 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java @@ -97,6 +97,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; @@ -231,7 +235,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @return A boolean. */ - public boolean getItemVisible(int series, int item); + public boolean getItemVisible(/*@NonNegative*/ int series, int item); /** * Returns a boolean that indicates whether or not the specified series @@ -241,7 +245,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @return A boolean. */ - public boolean isSeriesVisible(int series); + public boolean isSeriesVisible(/*@NonNegative*/ int series); /** * Returns the flag that controls whether a series is visible. @@ -252,7 +256,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #setSeriesVisible(int, Boolean) */ - public Boolean getSeriesVisible(int series); + public Boolean getSeriesVisible(/*@NonNegative*/ int series); /** * Sets the flag that controls whether a series is visible and sends a @@ -263,7 +267,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(int series, Boolean visible); + public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible); /** * Sets the flag that controls whether a series is visible and, if @@ -276,7 +280,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(int series, Boolean visible, boolean notify); + public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify); /** * Returns the default visibility for all series. @@ -318,7 +322,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @return A boolean. */ - public boolean isSeriesVisibleInLegend(int series); + public boolean isSeriesVisibleInLegend(/*@NonNegative*/ int series); /** * Returns the flag that controls whether a series is visible in the @@ -332,7 +336,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #setSeriesVisibleInLegend(int, Boolean) */ - public Boolean getSeriesVisibleInLegend(int series); + public Boolean getSeriesVisibleInLegend(/*@NonNegative*/ int series); /** * Sets the flag that controls whether a series is visible in the legend @@ -343,7 +347,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(int series, Boolean visible); + public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible); /** * Sets the flag that controls whether a series is visible in the legend @@ -356,7 +360,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(int series, Boolean visible, + public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible, boolean notify); /** @@ -411,7 +415,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesPaint(int, Paint) */ - public Paint getSeriesPaint(int series); + public Paint getSeriesPaint(/*@NonNegative*/ int series); /** * Sets the paint used for a series and sends a {@link RendererChangeEvent} @@ -422,9 +426,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(int series, Paint paint); + public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint); - public void setSeriesPaint(int series, Paint paint, boolean notify); + public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint, boolean notify); /** * Returns the default paint. @@ -468,7 +472,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesFillPaint(int, Paint) */ - public Paint getSeriesFillPaint(int series); + public Paint getSeriesFillPaint(/*@NonNegative*/ int series); /** * Sets the paint used for a series outline and sends a @@ -479,7 +483,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesFillPaint(int) */ - public void setSeriesFillPaint(int series, Paint paint); + public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint); /** * Returns the default outline paint. @@ -521,7 +525,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesOutlinePaint(int, Paint) */ - public Paint getSeriesOutlinePaint(int series); + public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series); /** * Sets the paint used for a series outline and sends a @@ -532,9 +536,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesOutlinePaint(int) */ - public void setSeriesOutlinePaint(int series, Paint paint); + public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint); - public void setSeriesOutlinePaint(int series, Paint paint, boolean notify); + public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint, boolean notify); /** * Returns the default outline paint. @@ -578,7 +582,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesStroke(int, Stroke) */ - public Stroke getSeriesStroke(int series); + public Stroke getSeriesStroke(/*@NonNegative*/ int series); /** * Sets the stroke used for a series and sends a @@ -589,9 +593,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesStroke(int) */ - public void setSeriesStroke(int series, Stroke stroke); + public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke); - public void setSeriesStroke(int series, Stroke stroke, boolean notify); + public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify); /** * Returns the default stroke. @@ -639,7 +643,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesOutlineStroke(int, Stroke) */ - public Stroke getSeriesOutlineStroke(int series); + public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series); /** * Sets the outline stroke used for a series and sends a @@ -650,9 +654,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesOutlineStroke(int) */ - public void setSeriesOutlineStroke(int series, Stroke stroke); + public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke); - public void setSeriesOutlineStroke(int series, Stroke stroke, boolean notify); + public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify); /** * Returns the default outline stroke. @@ -696,7 +700,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesShape(int, Shape) */ - public Shape getSeriesShape(int series); + public Shape getSeriesShape(/*@NonNegative*/ int series); /** * Sets the shape used for a series and sends a {@link RendererChangeEvent} @@ -707,9 +711,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesShape(int) */ - public void setSeriesShape(int series, Shape shape); + public void setSeriesShape(/*@NonNegative*/ int series, Shape shape); - public void setSeriesShape(int series, Shape shape, boolean notify); + public void setSeriesShape(/*@NonNegative*/ int series, Shape shape, boolean notify); /** * Returns the default shape. @@ -755,7 +759,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesItemLabelsVisible(int, Boolean) */ - public boolean isSeriesItemLabelsVisible(int series); + public boolean isSeriesItemLabelsVisible(/*@NonNegative*/ int series); /** * Sets a flag that controls the visibility of the item labels for a series. @@ -765,7 +769,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(int series, boolean visible); + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, boolean visible); /** * Sets a flag that controls the visibility of the item labels for a series. @@ -775,7 +779,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(int series, Boolean visible); + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible); /** * Sets the visibility of item labels for a series and, if requested, sends @@ -788,7 +792,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(int series, Boolean visible, + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify); /** @@ -835,7 +839,7 @@ public void setSeriesItemLabelsVisible(int series, Boolean visible, * * @return The generator (possibly {@code null}). */ - public CategoryItemLabelGenerator getItemLabelGenerator(int series, + public CategoryItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int series, int item); /** @@ -847,7 +851,7 @@ public CategoryItemLabelGenerator getItemLabelGenerator(int series, * * @see #setSeriesItemLabelGenerator(int, CategoryItemLabelGenerator) */ - public CategoryItemLabelGenerator getSeriesItemLabelGenerator(int series); + public CategoryItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int series); /** * Sets the item label generator for a series and sends a @@ -858,10 +862,10 @@ public CategoryItemLabelGenerator getItemLabelGenerator(int series, * * @see #getSeriesItemLabelGenerator(int) */ - public void setSeriesItemLabelGenerator(int series, + public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, CategoryItemLabelGenerator generator); - public void setSeriesItemLabelGenerator(int series, + public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, CategoryItemLabelGenerator generator, boolean notify); /** @@ -910,7 +914,7 @@ public void setDefaultItemLabelGenerator(CategoryItemLabelGenerator generator, * * @see #setSeriesToolTipGenerator(int, CategoryToolTipGenerator) */ - public CategoryToolTipGenerator getSeriesToolTipGenerator(int series); + public CategoryToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series); /** * Sets the tool tip generator for a series and sends a @@ -922,10 +926,10 @@ public void setDefaultItemLabelGenerator(CategoryItemLabelGenerator generator, * * @see #getSeriesToolTipGenerator(int) */ - public void setSeriesToolTipGenerator(int series, + public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, CategoryToolTipGenerator generator); - public void setSeriesToolTipGenerator(int series, + public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, CategoryToolTipGenerator generator, boolean notify); /** @@ -972,7 +976,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #setSeriesItemLabelFont(int, Font) */ - public Font getSeriesItemLabelFont(int series); + public Font getSeriesItemLabelFont(/*@NonNegative*/ int series); /** * Sets the item label font for a series and sends a @@ -983,9 +987,9 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #getSeriesItemLabelFont(int) */ - public void setSeriesItemLabelFont(int series, Font font); + public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font); - public void setSeriesItemLabelFont(int series, Font font, boolean notify); + public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font, boolean notify); /** * Returns the default item label font (this is used when no other font @@ -1030,7 +1034,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #setSeriesItemLabelPaint(int, Paint) */ - public Paint getSeriesItemLabelPaint(int series); + public Paint getSeriesItemLabelPaint(/*@NonNegative*/ int series); /** * Sets the item label paint for a series and sends a @@ -1041,9 +1045,9 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #getSeriesItemLabelPaint(int) */ - public void setSeriesItemLabelPaint(int series, Paint paint); + public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint); - public void setSeriesItemLabelPaint(int series, Paint paint, boolean notify); + public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint, boolean notify); /** * Returns the default item label paint. @@ -1087,7 +1091,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #setSeriesPositiveItemLabelPosition(int, ItemLabelPosition) */ - public ItemLabelPosition getSeriesPositiveItemLabelPosition(int series); + public ItemLabelPosition getSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series); /** * Sets the item label position for all positive values in a series and @@ -1098,7 +1102,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #getSeriesPositiveItemLabelPosition(int) */ - public void setSeriesPositiveItemLabelPosition(int series, + public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position); /** @@ -1112,7 +1116,7 @@ public void setSeriesPositiveItemLabelPosition(int series, * * @see #getSeriesPositiveItemLabelPosition(int) */ - public void setSeriesPositiveItemLabelPosition(int series, + public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position, boolean notify); /** @@ -1169,7 +1173,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @see #setSeriesNegativeItemLabelPosition(int, ItemLabelPosition) */ - public ItemLabelPosition getSeriesNegativeItemLabelPosition(int series); + public ItemLabelPosition getSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series); /** * Sets the item label position for negative values in a series and sends a @@ -1180,7 +1184,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @see #getSeriesNegativeItemLabelPosition(int) */ - public void setSeriesNegativeItemLabelPosition(int series, + public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position); /** @@ -1194,7 +1198,7 @@ public void setSeriesNegativeItemLabelPosition(int series, * * @see #getSeriesNegativeItemLabelPosition(int) */ - public void setSeriesNegativeItemLabelPosition(int series, + public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position, boolean notify); /** @@ -1230,13 +1234,13 @@ public void setDefaultNegativeItemLabelPosition(ItemLabelPosition position, // CREATE ENTITIES - public boolean getItemCreateEntity(int series, int item); + public boolean getItemCreateEntity(/*@NonNegative*/ int series, int item); - public Boolean getSeriesCreateEntities(int series); + public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series); - public void setSeriesCreateEntities(int series, Boolean create); + public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create); - public void setSeriesCreateEntities(int series, Boolean create, + public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, boolean notify); public boolean getDefaultCreateEntities(); @@ -1256,7 +1260,7 @@ public void setSeriesCreateEntities(int series, Boolean create, * * @return The item URL generator. */ - public CategoryURLGenerator getItemURLGenerator(int series, int item); + public CategoryURLGenerator getItemURLGenerator(/*@NonNegative*/ int series, int item); /** * Returns the item URL generator for a series. @@ -1267,7 +1271,7 @@ public void setSeriesCreateEntities(int series, Boolean create, * * @see #setSeriesItemURLGenerator(int, CategoryURLGenerator) */ - public CategoryURLGenerator getSeriesItemURLGenerator(int series); + public CategoryURLGenerator getSeriesItemURLGenerator(/*@NonNegative*/ int series); /** * Sets the item URL generator for a series. @@ -1277,10 +1281,10 @@ public void setSeriesCreateEntities(int series, Boolean create, * * @see #getSeriesItemURLGenerator(int) */ - public void setSeriesItemURLGenerator(int series, + public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, CategoryURLGenerator generator); - public void setSeriesItemURLGenerator(int series, + public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, CategoryURLGenerator generator, boolean notify); /** @@ -1314,7 +1318,7 @@ public void setSeriesItemURLGenerator(int series, * * @return The legend item (possibly {@code null}). */ - public LegendItem getLegendItem(int datasetIndex, int series); + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series); /** * Draws a background for the data area. diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java index 325e0d020..208a7f694 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java @@ -51,6 +51,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; @@ -166,7 +170,7 @@ public void setStagger(boolean shouldStagger) { * @return The legend item. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot p = getPlot(); if (p == null) { diff --git a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java index 80629edc5..9c1af4f07 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java @@ -54,6 +54,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Paint; @@ -105,7 +109,7 @@ public LayeredBarRenderer() { * * @return The width for the series (1.0=100%, it is the maximum). */ - public double getSeriesBarWidth(int series) { + public double getSeriesBarWidth(/*@NonNegative*/ int series) { double result = Double.NaN; Number n = (Number) this.seriesBarWidthList.get(series); if (n != null) { @@ -121,7 +125,7 @@ public double getSeriesBarWidth(int series) { * @param width the width of the series bar in percentage (1.0=100%, it is * the maximum). */ - public void setSeriesBarWidth(int series, double width) { + public void setSeriesBarWidth(/*@NonNegative*/ int series, double width) { this.seriesBarWidthList.set(series, new Double(width)); } diff --git a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java index 23ee9268b..3e9c35ec6 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java @@ -51,6 +51,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; @@ -383,7 +387,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, * @return The width of one series. */ protected double calculateSeriesWidth(double space, CategoryAxis axis, - int categories, int series) { + int categories, /*@NonNegative*/ int series) { double factor = 1.0 - getItemMargin() - axis.getLowerMargin() - axis.getUpperMargin(); if (categories > 1) { diff --git a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java index aab8a6164..c8786d12b 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java @@ -94,6 +94,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; @@ -230,7 +234,7 @@ public LineAndShapeRenderer(boolean lines, boolean shapes) { * * @return A boolean. */ - public boolean getItemLineVisible(int series, int item) { + public boolean getItemLineVisible(/*@NonNegative*/ int series, int item) { Boolean flag = getSeriesLinesVisible(series); if (flag != null) { return flag; @@ -248,7 +252,7 @@ public boolean getItemLineVisible(int series, int item) { * * @see #setSeriesLinesVisible(int, Boolean) */ - public Boolean getSeriesLinesVisible(int series) { + public Boolean getSeriesLinesVisible(/*@NonNegative*/ int series) { return this.seriesLinesVisible.getBoolean(series); } @@ -261,7 +265,7 @@ public Boolean getSeriesLinesVisible(int series) { * * @see #getSeriesLinesVisible(int) */ - public void setSeriesLinesVisible(int series, Boolean flag) { + public void setSeriesLinesVisible(/*@NonNegative*/ int series, Boolean flag) { this.seriesLinesVisible.setBoolean(series, flag); fireChangeEvent(); } @@ -275,7 +279,7 @@ public void setSeriesLinesVisible(int series, Boolean flag) { * * @see #getSeriesLinesVisible(int) */ - public void setSeriesLinesVisible(int series, boolean visible) { + public void setSeriesLinesVisible(/*@NonNegative*/ int series, boolean visible) { setSeriesLinesVisible(series, Boolean.valueOf(visible)); } @@ -314,7 +318,7 @@ public void setDefaultLinesVisible(boolean flag) { * * @return A boolean. */ - public boolean getItemShapeVisible(int series, int item) { + public boolean getItemShapeVisible(/*@NonNegative*/ int series, int item) { Boolean flag = getSeriesShapesVisible(series); if (flag != null) { return flag; @@ -332,7 +336,7 @@ public boolean getItemShapeVisible(int series, int item) { * * @see #setSeriesShapesVisible(int, Boolean) */ - public Boolean getSeriesShapesVisible(int series) { + public Boolean getSeriesShapesVisible(/*@NonNegative*/ int series) { return this.seriesShapesVisible.getBoolean(series); } @@ -345,7 +349,7 @@ public Boolean getSeriesShapesVisible(int series) { * * @see #getSeriesShapesVisible(int) */ - public void setSeriesShapesVisible(int series, boolean visible) { + public void setSeriesShapesVisible(/*@NonNegative*/ int series, boolean visible) { setSeriesShapesVisible(series, Boolean.valueOf(visible)); } @@ -358,7 +362,7 @@ public void setSeriesShapesVisible(int series, boolean visible) { * * @see #getSeriesShapesVisible(int) */ - public void setSeriesShapesVisible(int series, Boolean flag) { + public void setSeriesShapesVisible(/*@NonNegative*/ int series, Boolean flag) { this.seriesShapesVisible.setBoolean(series, flag); fireChangeEvent(); } @@ -455,7 +459,7 @@ public void setUseOutlinePaint(boolean use) { * * @return A boolean. */ - public boolean getItemShapeFilled(int series, int item) { + public boolean getItemShapeFilled(/*@NonNegative*/ int series, int item) { return getSeriesShapesFilled(series); } @@ -467,7 +471,7 @@ public boolean getItemShapeFilled(int series, int item) { * * @return A boolean. */ - public boolean getSeriesShapesFilled(int series) { + public boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { Boolean flag = this.seriesShapesFilled.getBoolean(series); if (flag != null) { return flag; @@ -484,7 +488,7 @@ public boolean getSeriesShapesFilled(int series) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(int series, Boolean filled) { + public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean filled) { this.seriesShapesFilled.setBoolean(series, filled); fireChangeEvent(); } @@ -498,7 +502,7 @@ public void setSeriesShapesFilled(int series, Boolean filled) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(int series, boolean filled) { + public void setSeriesShapesFilled(/*@NonNegative*/ int series, boolean filled) { // delegate setSeriesShapesFilled(series, Boolean.valueOf(filled)); } @@ -630,7 +634,7 @@ public void setItemMargin(double margin) { * @return The legend item. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot cp = getPlot(); if (cp == null) { diff --git a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java index c2b56a35d..6ff6942f3 100644 --- a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java @@ -45,6 +45,10 @@ package org.jfree.chart.renderer.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; @@ -264,7 +268,7 @@ public void setUseOutlinePaint(boolean use) { * @param item the item index (zero-based). * @return A boolean. */ - public boolean getItemShapeFilled(int series, int item) { + public boolean getItemShapeFilled(/*@NonNegative*/ int series, int item) { return getSeriesShapesFilled(series); } @@ -275,7 +279,7 @@ public boolean getItemShapeFilled(int series, int item) { * @param series the series index (zero-based). * @return A boolean. */ - public boolean getSeriesShapesFilled(int series) { + public boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { Boolean flag = this.seriesShapesFilled.getBoolean(series); if (flag != null) { return flag.booleanValue(); @@ -293,7 +297,7 @@ public boolean getSeriesShapesFilled(int series) { * @param series the series index (zero-based). * @param filled the flag. */ - public void setSeriesShapesFilled(int series, Boolean filled) { + public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean filled) { this.seriesShapesFilled.setBoolean(series, filled); fireChangeEvent(); } @@ -305,7 +309,7 @@ public void setSeriesShapesFilled(int series, Boolean filled) { * @param series the series index (zero-based). * @param filled the flag. */ - public void setSeriesShapesFilled(int series, boolean filled) { + public void setSeriesShapesFilled(/*@NonNegative*/ int series, boolean filled) { this.seriesShapesFilled.setBoolean(series, Boolean.valueOf(filled)); fireChangeEvent(); } @@ -462,7 +466,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return The legend item. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot cp = getPlot(); if (cp == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java index 2cae40a6e..7c73b7f75 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java @@ -129,6 +129,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Font; @@ -344,7 +348,7 @@ protected void beginElementGroup(Graphics2D g2, Comparable seriesKey, * @return The generator (possibly {@code null}). */ @Override - public XYItemLabelGenerator getItemLabelGenerator(int series, int item) { + public XYItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int series, int item) { // otherwise look up the generator table XYItemLabelGenerator generator @@ -363,7 +367,7 @@ public XYItemLabelGenerator getItemLabelGenerator(int series, int item) { * @return The generator (possibly {@code null}). */ @Override - public XYItemLabelGenerator getSeriesItemLabelGenerator(int series) { + public XYItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int series) { return this.itemLabelGeneratorMap.get(series); } @@ -375,7 +379,7 @@ public XYItemLabelGenerator getSeriesItemLabelGenerator(int series) { * @param generator the generator ({@code null} permitted). */ @Override - public void setSeriesItemLabelGenerator(int series, + public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, XYItemLabelGenerator generator) { this.itemLabelGeneratorMap.put(series, generator); fireChangeEvent(); @@ -416,7 +420,7 @@ public void setDefaultItemLabelGenerator(XYItemLabelGenerator generator) { * @return The generator (possibly {@code null}). */ @Override - public XYToolTipGenerator getToolTipGenerator(int series, int item) { + public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, int item) { // otherwise look up the generator table XYToolTipGenerator generator @@ -435,7 +439,7 @@ public XYToolTipGenerator getToolTipGenerator(int series, int item) { * @return The generator (possibly {@code null}). */ @Override - public XYToolTipGenerator getSeriesToolTipGenerator(int series) { + public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series) { return this.toolTipGeneratorMap.get(series); } @@ -447,7 +451,7 @@ public XYToolTipGenerator getSeriesToolTipGenerator(int series) { * @param generator the generator ({@code null} permitted). */ @Override - public void setSeriesToolTipGenerator(int series, + public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, XYToolTipGenerator generator) { this.toolTipGeneratorMap.put(series, generator); fireChangeEvent(); @@ -837,7 +841,7 @@ public LegendItemCollection getLegendItems() { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { XYPlot xyplot = getPlot(); if (xyplot == null) { return null; @@ -1624,7 +1628,7 @@ protected void updateCrosshairValues(CrosshairState crosshairState, * label position). */ protected void drawItemLabel(Graphics2D g2, PlotOrientation orientation, - XYDataset dataset, int series, int item, double x, double y, + XYDataset dataset, /*@NonNegative*/ int series, int item, double x, double y, boolean negative) { XYItemLabelGenerator generator = getItemLabelGenerator(series, item); @@ -1708,7 +1712,7 @@ else if (layer.equals(Layer.BACKGROUND)) { * {@code hotspot} is {@code null}). */ protected void addEntity(EntityCollection entities, Shape hotspot, - XYDataset dataset, int series, int item, double entityX, + XYDataset dataset, /*@NonNegative*/ int series, int item, double entityX, double entityY) { if (!getItemCreateEntity(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 0be7fc1e8..52463a143 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -47,6 +47,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.io.Serializable; @@ -363,7 +367,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return this.x.length; } @@ -376,7 +380,7 @@ public int getItemCount(int series) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return this.x[item]; } @@ -390,7 +394,7 @@ public Number getX(int series, int item) { * @return The x-value. */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number xx = getX(series, item); if (xx != null) { @@ -408,7 +412,7 @@ public double getXValue(int series, int item) { * @return The y-value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return this.y[item]; } @@ -422,7 +426,7 @@ public Number getY(int series, int item) { * @return The y-value. */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number yy = getY(series, item); if (yy != null) { @@ -449,7 +453,7 @@ public int getSeriesCount() { * @return The series name. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.delegateSet.getSeriesKey(series); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java index e43a25e6a..9835a0ce7 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java @@ -45,6 +45,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.GeneralPath; @@ -168,7 +172,7 @@ public State(PlotRenderingInfo info) { * @param passCount the number of passes. */ @Override - public void startSeriesPass(XYDataset dataset, int series, + public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, int firstItem, int lastItem, int pass, int passCount) { this.seriesPath.reset(); this.intervalPath.reset(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index 79d705ab9..4bed2857f 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -111,6 +111,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Image; import java.awt.Paint; @@ -326,7 +330,7 @@ public void setBaseShapesVisible(boolean flag) { * * @see #getSeriesShapesFilled(int) */ - public boolean getItemShapeFilled(int series, int item) { + public boolean getItemShapeFilled(/*@NonNegative*/ int series, int item) { // otherwise look up the paint table Boolean flag = this.seriesShapesFilled.getBoolean(series); @@ -346,7 +350,7 @@ public boolean getItemShapeFilled(int series, int item) { * * @return A boolean. */ - public Boolean getSeriesShapesFilled(int series) { + public Boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { return this.seriesShapesFilled.getBoolean(series); } @@ -359,7 +363,7 @@ public Boolean getSeriesShapesFilled(int series) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(int series, Boolean flag) { + public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean flag) { this.seriesShapesFilled.setBoolean(series, flag); fireChangeEvent(); } @@ -574,7 +578,7 @@ public void setLegendLine(Shape line) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { XYPlot plot = getPlot(); if (plot == null) { return null; @@ -1009,7 +1013,7 @@ public Object clone() throws CloneNotSupportedException { * * @see #getPlotImages() */ - protected Image getImage(Plot plot, int series, int item, + protected Image getImage(Plot plot, /*@NonNegative*/ int series, int item, double x, double y) { // this method must be overridden if you want to display images return null; @@ -1032,7 +1036,7 @@ protected Image getImage(Plot plot, int series, int item, * * @return The hotspot used to draw the data item. */ - protected Point getImageHotspot(Plot plot, int series, int item, + protected Point getImageHotspot(Plot plot, /*@NonNegative*/ int series, int item, double x, double y, Image image) { int height = image.getHeight(null); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index f20c91b7b..41b63c2b6 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -88,6 +88,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.BasicStroke; import java.awt.GradientPaint; import java.awt.Graphics2D; @@ -435,7 +439,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { LegendItem result = null; XYPlot xyplot = getPlot(); if (xyplot != null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java index 9e360d3e6..8638fe916 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java @@ -86,6 +86,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; @@ -229,7 +233,7 @@ public void setLegendArea(Shape area) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { LegendItem result = null; XYPlot xyplot = getPlot(); if (xyplot != null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index b184ed70d..1356b71cc 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -106,6 +106,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; @@ -731,7 +735,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { XYPlot xyplot = getPlot(); if (xyplot == null) { return null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index 5750d4a1c..8c0ea898b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -78,6 +78,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; @@ -303,7 +307,7 @@ public Range findRangeBounds(XYDataset dataset) { * * @since 1.0.10 */ - protected Paint lookupBoxPaint(int series, int item) { + protected Paint lookupBoxPaint(/*@NonNegative*/ int series, int item) { Paint p = getBoxPaint(); if (p != null) { return p; @@ -373,7 +377,7 @@ else if (orientation == PlotOrientation.VERTICAL) { */ public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, - ValueAxis rangeAxis, XYDataset dataset, int series, + ValueAxis rangeAxis, XYDataset dataset, /*@NonNegative*/ int series, int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... @@ -513,7 +517,7 @@ else if (exactBoxWidth > maxBoxWidth) { */ public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, - ValueAxis rangeAxis, XYDataset dataset, int series, + ValueAxis rangeAxis, XYDataset dataset, /*@NonNegative*/ int series, int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index 238079a8c..ea7c75697 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -64,6 +64,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; @@ -286,7 +290,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { LegendItem result = null; XYPlot plot = getPlot(); if (plot == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index 5a181152d..47f46c2c2 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -83,6 +83,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; @@ -1115,7 +1119,7 @@ private void createPolygon (Graphics2D x_graphics, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { LegendItem result = null; XYPlot p = getPlot(); if (p != null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java index 10520c940..486ab470f 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java @@ -55,6 +55,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; @@ -275,7 +279,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return A legend item for the series (possibly {@code null}). */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { // if the renderer isn't assigned to a plot, then we don't have a // dataset... diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java index c359d4c1e..e778b3bb7 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java @@ -86,6 +86,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; @@ -197,7 +201,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return A boolean. */ - public boolean getItemVisible(int series, int item); + public boolean getItemVisible(/*@NonNegative*/ int series, int item); /** * Returns a boolean that indicates whether or not the specified series @@ -207,7 +211,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return A boolean. */ - public boolean isSeriesVisible(int series); + public boolean isSeriesVisible(/*@NonNegative*/ int series); /** * Returns the flag that controls whether a series is visible. @@ -218,7 +222,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #setSeriesVisible(int, Boolean) */ - public Boolean getSeriesVisible(int series); + public Boolean getSeriesVisible(/*@NonNegative*/ int series); /** * Sets the flag that controls whether a series is visible and sends a @@ -229,7 +233,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(int series, Boolean visible); + public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible); /** * Sets the flag that controls whether a series is visible and, if @@ -242,7 +246,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(int series, Boolean visible, boolean notify); + public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify); /** * Returns the default visibility for all series. @@ -284,7 +288,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return A boolean. */ - public boolean isSeriesVisibleInLegend(int series); + public boolean isSeriesVisibleInLegend(/*@NonNegative*/ int series); /** * Returns the flag that controls whether a series is visible in the @@ -298,7 +302,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #setSeriesVisibleInLegend(int, Boolean) */ - public Boolean getSeriesVisibleInLegend(int series); + public Boolean getSeriesVisibleInLegend(/*@NonNegative*/ int series); /** * Sets the flag that controls whether a series is visible in the legend @@ -309,7 +313,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(int series, Boolean visible); + public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible); /** * Sets the flag that controls whether a series is visible in the legend @@ -322,7 +326,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(int series, Boolean visible, + public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible, boolean notify); /** @@ -377,7 +381,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesPaint(int, Paint) */ - public Paint getSeriesPaint(int series); + public Paint getSeriesPaint(/*@NonNegative*/ int series); /** * Sets the paint used for a series and sends a {@link RendererChangeEvent} @@ -388,9 +392,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(int series, Paint paint); + public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint); - public void setSeriesPaint(int series, Paint paint, boolean notify); + public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint, boolean notify); /** * Returns the default paint. @@ -432,7 +436,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @return The paint (possibly {@code null}). */ - public Paint getSeriesFillPaint(int series); + public Paint getSeriesFillPaint(/*@NonNegative*/ int series); /** * Sets the paint used for a series and sends a @@ -441,9 +445,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * @param series the series index (zero-based). * @param paint the paint ({@code null} permitted). */ - public void setSeriesFillPaint(int series, Paint paint); + public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint); - public void setSeriesFillPaint(int series, Paint paint, boolean notify); + public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint, boolean notify); /** * Returns the default paint. @@ -483,7 +487,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesOutlinePaint(int, Paint) */ - public Paint getSeriesOutlinePaint(int series); + public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series); /** * Sets the paint used for a series outline and sends a @@ -494,9 +498,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesOutlinePaint(int) */ - public void setSeriesOutlinePaint(int series, Paint paint); + public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint); - public void setSeriesOutlinePaint(int series, Paint paint, boolean notify); + public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint, boolean notify); /** * Returns the default outline paint. @@ -540,7 +544,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesStroke(int, Stroke) */ - public Stroke getSeriesStroke(int series); + public Stroke getSeriesStroke(/*@NonNegative*/ int series); /** * Sets the stroke used for a series and sends a @@ -551,9 +555,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesStroke(int) */ - public void setSeriesStroke(int series, Stroke stroke); + public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke); - public void setSeriesStroke(int series, Stroke stroke, boolean notify); + public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify); /** * Returns the default stroke. @@ -599,7 +603,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesOutlineStroke(int, Stroke) */ - public Stroke getSeriesOutlineStroke(int series); + public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series); /** * Sets the outline stroke used for a series and sends a @@ -610,9 +614,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesOutlineStroke(int) */ - public void setSeriesOutlineStroke(int series, Stroke stroke); + public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke); - public void setSeriesOutlineStroke(int series, Stroke stroke, boolean notify); + public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify); /** * Returns the default outline stroke. @@ -656,7 +660,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesShape(int, Shape) */ - public Shape getSeriesShape(int series); + public Shape getSeriesShape(/*@NonNegative*/ int series); /** * Sets the shape used for a series and sends a {@link RendererChangeEvent} @@ -667,9 +671,9 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesShape(int) */ - public void setSeriesShape(int series, Shape shape); + public void setSeriesShape(/*@NonNegative*/ int series, Shape shape); - public void setSeriesShape(int series, Shape shape, boolean notify); + public void setSeriesShape(/*@NonNegative*/ int series, Shape shape, boolean notify); /** * Returns the default shape. @@ -703,7 +707,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @return The legend item (possibly {@code null}). */ - public LegendItem getLegendItem(int datasetIndex, int series); + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series); //// LEGEND ITEM LABEL GENERATOR ////////////////////////////////////////// @@ -747,7 +751,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #setSeriesToolTipGenerator(int, XYToolTipGenerator) */ - public XYToolTipGenerator getSeriesToolTipGenerator(int series); + public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series); /** * Sets the tool tip generator for a series and sends a @@ -758,7 +762,7 @@ public void setSeriesVisibleInLegend(int series, Boolean visible, * * @see #getSeriesToolTipGenerator(int) */ - public void setSeriesToolTipGenerator(int series, + public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, XYToolTipGenerator generator); /** @@ -817,7 +821,7 @@ public void setSeriesToolTipGenerator(int series, * * @return A boolean. */ - public boolean isSeriesItemLabelsVisible(int series); + public boolean isSeriesItemLabelsVisible(/*@NonNegative*/ int series); /** * Sets a flag that controls the visibility of the item labels for a @@ -829,7 +833,7 @@ public void setSeriesToolTipGenerator(int series, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(int series, boolean visible); + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, boolean visible); /** * Sets a flag that controls the visibility of the item labels for a series. @@ -839,7 +843,7 @@ public void setSeriesToolTipGenerator(int series, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(int series, Boolean visible); + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible); /** * Sets the visibility of item labels for a series and, if requested, @@ -852,7 +856,7 @@ public void setSeriesToolTipGenerator(int series, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(int series, Boolean visible, + public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify); /** @@ -907,7 +911,7 @@ public void setSeriesItemLabelsVisible(int series, Boolean visible, * * @see #setSeriesItemLabelGenerator(int, XYItemLabelGenerator) */ - public XYItemLabelGenerator getSeriesItemLabelGenerator(int series); + public XYItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int series); /** * Sets the item label generator for a series and sends a @@ -918,7 +922,7 @@ public void setSeriesItemLabelsVisible(int series, Boolean visible, * * @see #getSeriesItemLabelGenerator(int) */ - public void setSeriesItemLabelGenerator(int series, + public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, XYItemLabelGenerator generator); /** @@ -959,7 +963,7 @@ public void setSeriesItemLabelGenerator(int series, * * @return The font (possibly {@code null}). */ - public Font getSeriesItemLabelFont(int series); + public Font getSeriesItemLabelFont(/*@NonNegative*/ int series); /** * Sets the item label font for a series and sends a @@ -970,7 +974,7 @@ public void setSeriesItemLabelGenerator(int series, * * @see #getSeriesItemLabelFont(int) */ - public void setSeriesItemLabelFont(int series, Font font); + public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font); /** * Returns the default item label font (this is used when no other font @@ -1013,7 +1017,7 @@ public void setSeriesItemLabelGenerator(int series, * * @see #setSeriesItemLabelPaint(int, Paint) */ - public Paint getSeriesItemLabelPaint(int series); + public Paint getSeriesItemLabelPaint(/*@NonNegative*/ int series); /** * Sets the item label paint for a series and sends a @@ -1024,7 +1028,7 @@ public void setSeriesItemLabelGenerator(int series, * * @see #getSeriesItemLabelPaint(int) */ - public void setSeriesItemLabelPaint(int series, Paint paint); + public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint); /** * Returns the default item label paint. @@ -1060,7 +1064,7 @@ public void setSeriesItemLabelGenerator(int series, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getSeriesPositiveItemLabelPosition(int series); + public ItemLabelPosition getSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series); /** * Sets the item label position for all positive values in a series and @@ -1069,7 +1073,7 @@ public void setSeriesItemLabelGenerator(int series, * @param series the series index (zero-based). * @param position the position ({@code null} permitted). */ - public void setSeriesPositiveItemLabelPosition(int series, + public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position); /** @@ -1081,7 +1085,7 @@ public void setSeriesPositiveItemLabelPosition(int series, * @param position the position ({@code null} permitted). * @param notify notify registered listeners? */ - public void setSeriesPositiveItemLabelPosition(int series, + public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position, boolean notify); /** @@ -1130,7 +1134,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getSeriesNegativeItemLabelPosition(int series); + public ItemLabelPosition getSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series); /** * Sets the item label position for negative values in a series and sends a @@ -1139,7 +1143,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * @param series the series index (zero-based). * @param position the position ({@code null} permitted). */ - public void setSeriesNegativeItemLabelPosition(int series, + public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position); /** @@ -1151,7 +1155,7 @@ public void setSeriesNegativeItemLabelPosition(int series, * @param position the position ({@code null} permitted). * @param notify notify registered listeners? */ - public void setSeriesNegativeItemLabelPosition(int series, + public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, ItemLabelPosition position, boolean notify); /** @@ -1182,13 +1186,13 @@ public void setDefaultNegativeItemLabelPosition(ItemLabelPosition position, // CREATE ENTITIES - public boolean getItemCreateEntity(int series, int item); + public boolean getItemCreateEntity(/*@NonNegative*/ int series, int item); - public Boolean getSeriesCreateEntities(int series); + public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series); - public void setSeriesCreateEntities(int series, Boolean create); + public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create); - public void setSeriesCreateEntities(int series, Boolean create, + public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, boolean notify); public boolean getDefaultCreateEntities(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java index d226037e4..891fee1dc 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java @@ -48,6 +48,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.geom.Line2D; import org.jfree.chart.plot.PlotRenderingInfo; @@ -167,7 +171,7 @@ public int getLastItemIndex() { * * @since 1.0.11 */ - public void startSeriesPass(XYDataset dataset, int series, int firstItem, + public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, int firstItem, int lastItem, int pass, int passCount) { this.firstItemIndex = firstItem; this.lastItemIndex = lastItem; @@ -190,7 +194,7 @@ public void startSeriesPass(XYDataset dataset, int series, int firstItem, * * @since 1.0.11 */ - public void endSeriesPass(XYDataset dataset, int series, int firstItem, + public void endSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, int firstItem, int lastItem, int pass, int passCount) { // do nothing...this is just a hook for subclasses } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index 1e1949ea8..e586533e2 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -73,6 +73,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; @@ -254,7 +258,7 @@ public int getPassCount() { * * @return A boolean. */ - public boolean getItemLineVisible(int series, int item) { + public boolean getItemLineVisible(/*@NonNegative*/ int series, int item) { Boolean flag = getSeriesLinesVisible(series); if (flag != null) { return flag; @@ -272,7 +276,7 @@ public boolean getItemLineVisible(int series, int item) { * * @see #setSeriesLinesVisible(int, Boolean) */ - public Boolean getSeriesLinesVisible(int series) { + public Boolean getSeriesLinesVisible(/*@NonNegative*/ int series) { return this.seriesLinesVisible.getBoolean(series); } @@ -285,7 +289,7 @@ public Boolean getSeriesLinesVisible(int series) { * * @see #getSeriesLinesVisible(int) */ - public void setSeriesLinesVisible(int series, Boolean flag) { + public void setSeriesLinesVisible(/*@NonNegative*/ int series, Boolean flag) { this.seriesLinesVisible.setBoolean(series, flag); fireChangeEvent(); } @@ -299,7 +303,7 @@ public void setSeriesLinesVisible(int series, Boolean flag) { * * @see #getSeriesLinesVisible(int) */ - public void setSeriesLinesVisible(int series, boolean visible) { + public void setSeriesLinesVisible(/*@NonNegative*/ int series, boolean visible) { setSeriesLinesVisible(series, Boolean.valueOf(visible)); } @@ -367,7 +371,7 @@ public void setLegendLine(Shape line) { * * @return A boolean. */ - public boolean getItemShapeVisible(int series, int item) { + public boolean getItemShapeVisible(/*@NonNegative*/ int series, int item) { Boolean flag = getSeriesShapesVisible(series); if (flag != null) { return flag; @@ -385,7 +389,7 @@ public boolean getItemShapeVisible(int series, int item) { * * @see #setSeriesShapesVisible(int, Boolean) */ - public Boolean getSeriesShapesVisible(int series) { + public Boolean getSeriesShapesVisible(/*@NonNegative*/ int series) { return this.seriesShapesVisible.getBoolean(series); } @@ -398,7 +402,7 @@ public Boolean getSeriesShapesVisible(int series) { * * @see #getSeriesShapesVisible(int) */ - public void setSeriesShapesVisible(int series, boolean visible) { + public void setSeriesShapesVisible(/*@NonNegative*/ int series, boolean visible) { setSeriesShapesVisible(series, Boolean.valueOf(visible)); } @@ -411,7 +415,7 @@ public void setSeriesShapesVisible(int series, boolean visible) { * * @see #getSeriesShapesVisible(int) */ - public void setSeriesShapesVisible(int series, Boolean flag) { + public void setSeriesShapesVisible(/*@NonNegative*/ int series, Boolean flag) { this.seriesShapesVisible.setBoolean(series, flag); fireChangeEvent(); } @@ -455,7 +459,7 @@ public void setDefaultShapesVisible(boolean flag) { * * @return A boolean. */ - public boolean getItemShapeFilled(int series, int item) { + public boolean getItemShapeFilled(/*@NonNegative*/ int series, int item) { Boolean flag = getSeriesShapesFilled(series); if (flag != null) { return flag; @@ -474,7 +478,7 @@ public boolean getItemShapeFilled(int series, int item) { * * @see #setSeriesShapesFilled(int, Boolean) */ - public Boolean getSeriesShapesFilled(int series) { + public Boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { return this.seriesShapesFilled.getBoolean(series); } @@ -487,7 +491,7 @@ public Boolean getSeriesShapesFilled(int series) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(int series, boolean flag) { + public void setSeriesShapesFilled(/*@NonNegative*/ int series, boolean flag) { setSeriesShapesFilled(series, Boolean.valueOf(flag)); } @@ -500,7 +504,7 @@ public void setSeriesShapesFilled(int series, boolean flag) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(int series, Boolean flag) { + public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean flag) { this.seriesShapesFilled.setBoolean(series, flag); fireChangeEvent(); } @@ -678,7 +682,7 @@ public void setLastPointGood(boolean good) { * @param passCount the number of passes. */ @Override - public void startSeriesPass(XYDataset dataset, int series, + public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, int firstItem, int lastItem, int pass, int passCount) { this.seriesPath.reset(); this.lastPointGood = false; @@ -871,7 +875,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @param item the item index. * @param shape the shape. */ - protected void drawFirstPassShape(Graphics2D g2, int pass, int series, + protected void drawFirstPassShape(Graphics2D g2, int pass, /*@NonNegative*/ int series, int item, Shape shape) { g2.setStroke(getItemStroke(series, item)); g2.setPaint(getItemPaint(series, item)); @@ -958,7 +962,7 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, * @param entities the entity collection. */ protected void drawSecondaryPass(Graphics2D g2, XYPlot plot, - XYDataset dataset, int pass, int series, int item, + XYDataset dataset, int pass, /*@NonNegative*/ int series, int item, ValueAxis domainAxis, Rectangle2D dataArea, ValueAxis rangeAxis, CrosshairState crosshairState, EntityCollection entities) { @@ -1045,7 +1049,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return A legend item for the series (possibly {@code null}). */ @Override - public LegendItem getLegendItem(int datasetIndex, int series) { + public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { XYPlot plot = getPlot(); if (plot == null) { return null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 941aaa603..505eadcfd 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -47,6 +47,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; @@ -510,7 +514,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * * @return The paint. */ - protected Paint getPaint(XYDataset dataset, int series, int item) { + protected Paint getPaint(XYDataset dataset, /*@NonNegative*/ int series, int item) { Paint p; if (dataset instanceof XYZDataset) { double z = ((XYZDataset) dataset).getZValue(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index d8efeac33..8dba7af4d 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -50,6 +50,10 @@ package org.jfree.chart.renderer.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; @@ -261,7 +265,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @param y the y coordinate (in Java2D space). */ private void drawAdditionalItemLabel(Graphics2D g2, - PlotOrientation orientation, XYDataset dataset, int series, + PlotOrientation orientation, XYDataset dataset, /*@NonNegative*/ int series, int item, double x, double y) { if (this.additionalItemLabelGenerator == null) { diff --git a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java index 12c95f537..02dd72db9 100644 --- a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java +++ b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java @@ -42,6 +42,10 @@ package org.jfree.chart.title; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.Rectangle2D; @@ -81,7 +85,7 @@ public class LegendItemBlockContainer extends BlockContainer { private int datasetIndex; /** The series index. */ - private int series; + private /*@NonNegative*/ int series; /** The tool tip text (can be {@code null}). */ private String toolTipText; diff --git a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java index e6cc16bf2..799d279f2 100644 --- a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java @@ -52,6 +52,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.category.CategoryDataset; /** @@ -72,7 +76,7 @@ public interface CategoryURLGenerator { * * @return A string containing the URL. */ - public String generateURL(CategoryDataset dataset, int series, + public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, int category); } diff --git a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java index 740036215..52fd57d74 100644 --- a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java @@ -41,6 +41,10 @@ */ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -97,7 +101,7 @@ public int getURLCount(int list) { * * @return The URL (possibly {@code null}). */ - public String getURL(int series, int item) { + public String getURL(/*@NonNegative*/ int series, int item) { String result = null; if (series < getListCount()) { List urls = (List) this.urlSeries.get(series); @@ -120,7 +124,7 @@ public String getURL(int series, int item) { * @return A string containing the URL (possibly {@code null}). */ @Override - public String generateURL(CategoryDataset dataset, int series, int item) { + public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, int item) { return getURL(series, item); } diff --git a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java index e348c9894..f5d497d93 100644 --- a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java @@ -47,6 +47,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -106,7 +110,7 @@ public int getURLCount(int list) { * * @return The URL (possibly {@code null}). */ - public String getURL(int series, int item) { + public String getURL(/*@NonNegative*/ int series, int item) { String result = null; if (series < getListCount()) { List urls = (List) this.urlSeries.get(series); @@ -129,7 +133,7 @@ public String getURL(int series, int item) { * @return A string containing the URL (possibly {@code null}). */ @Override - public String generateURL(XYDataset dataset, int series, int item) { + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, int item) { return getURL(series, item); } diff --git a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java index eae090b38..b29f2678d 100644 --- a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java @@ -55,6 +55,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -132,7 +136,7 @@ public StandardCategoryURLGenerator(String prefix, * @return The generated URL. */ @Override - public String generateURL(CategoryDataset dataset, int series, + public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, int category) { String url = this.prefix; Comparable seriesKey = dataset.getRowKey(series); diff --git a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java index a87b904b7..88985427a 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java @@ -49,6 +49,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import org.jfree.chart.util.ObjectUtils; import org.jfree.chart.util.Args; @@ -129,7 +133,7 @@ public StandardXYURLGenerator(String prefix, String seriesParameterName, * @return The generated URL. */ @Override - public String generateURL(XYDataset dataset, int series, int item) { + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, int item) { // TODO: URLEncode? String url = this.prefix; boolean firstParameter = url.indexOf("?") == -1; diff --git a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java index 0e60c9a9a..7f83caba2 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java @@ -40,6 +40,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.xy.XYZDataset; /** @@ -58,7 +62,7 @@ public class StandardXYZURLGenerator extends StandardXYURLGenerator * @return A string containing the generated URL. */ @Override - public String generateURL(XYZDataset dataset, int series, int item) { + public String generateURL(XYZDataset dataset, /*@NonNegative*/ int series, int item) { return super.generateURL(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java index b94769e3b..aafb5f424 100644 --- a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java @@ -51,6 +51,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -165,7 +169,7 @@ public String getItemParameterName() { * @return The generated URL. */ @Override - public String generateURL(XYDataset dataset, int series, int item) { + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, int item) { String result = this.prefix; boolean firstParameter = !result.contains("?"); Comparable seriesKey = dataset.getSeriesKey(series); diff --git a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java index 90e468629..f7e6b0873 100644 --- a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java @@ -45,6 +45,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.xy.XYDataset; /** @@ -66,6 +70,6 @@ public interface XYURLGenerator { * @return A string containing the generated URL (possibly * {@code null}). */ - public String generateURL(XYDataset dataset, int series, int item); + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java index f63e6dc0b..dfa400cc9 100644 --- a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java @@ -41,6 +41,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.xy.XYZDataset; /** @@ -61,6 +65,6 @@ public interface XYZURLGenerator extends XYURLGenerator { * * @return A string containing the generated URL. */ - public String generateURL(XYZDataset dataset, int series, int item); + public String generateURL(XYZDataset dataset, /*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index 89c25e7c1..070480c74 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -28,6 +28,15 @@ package org.jfree.chart.util; +/*>>> +import org.checkerframework.common.value.qual.IntVal; +import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.index.qual.GTENegativeOne; +import org.checkerframework.checker.index.qual.LengthOf; +import org.checkerframework.checker.index.qual.LTLengthOf; +import org.checkerframework.checker.index.qual.IndexFor; + */ + import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -43,16 +52,16 @@ public class AbstractObjectList implements Cloneable, Serializable { private static final long serialVersionUID = 7789833772597351595L; /** The default initial capacity of the list. */ - public static final int DEFAULT_INITIAL_CAPACITY = 8; + public static final /*@IntVal(8)*/ int DEFAULT_INITIAL_CAPACITY = 8; /** Storage for the objects. */ private transient Object[] objects; /** The current list size. */ - private int size = 0; + private /*@LengthOf("this.objects")*/ int size = 0; /** The default increment. */ - private int increment = DEFAULT_INITIAL_CAPACITY; + private /*@NonNegative*/ int increment = DEFAULT_INITIAL_CAPACITY; /** * Creates a new list with the default initial capacity. @@ -66,7 +75,7 @@ protected AbstractObjectList() { * * @param initialCapacity the initial capacity. */ - protected AbstractObjectList(int initialCapacity) { + protected AbstractObjectList(/*@NonNegative*/ int initialCapacity) { this (initialCapacity, initialCapacity); } @@ -76,7 +85,7 @@ protected AbstractObjectList(int initialCapacity) { * @param initialCapacity the initial capacity. * @param increment the increment. */ - protected AbstractObjectList(int initialCapacity, int increment) { + protected AbstractObjectList(/*@NonNegative*/ int initialCapacity, /*@NonNegative*/ int increment) { this.objects = new Object[initialCapacity]; this.increment = increment; } @@ -103,15 +112,20 @@ protected Object get(int index) { * @param index the object index. * @param object the object ({@code null} permitted). */ - protected void set(int index, Object object) { + protected void set(/*@NonNegative*/ int index, Object object) { if (index < 0) { throw new IllegalArgumentException("Requires index >= 0."); } if (index >= this.objects.length) { Object[] enlarged = new Object[index + this.increment]; - System.arraycopy(this.objects, 0, enlarged, 0, this.objects.length); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/176 + /*@LTLengthOf(value={"this.objects", "enlarged"}, offset={"0 - 1", "0 - 1"})*/ int tmp = this.objects.length; + System.arraycopy(this.objects, 0, enlarged, 0, tmp); this.objects = enlarged; } + @SuppressWarnings("index") // if index wasn't large enough before, this.objects was enlarged by the code above + /*@IndexFor("this.objects")*/ int newIndex = index; + index = newIndex; this.objects[index] = object; this.size = Math.max(this.size, index + 1); } @@ -254,7 +268,8 @@ private void readObject(ObjectInputStream stream) this.objects = new Object[this.size]; final int count = stream.readInt(); for (int i = 0; i < count; i++) { - final int index = stream.readInt(); + @SuppressWarnings("index") // stream only contains GTEN1 ints? or is this a bug? + final /*@GTENegativeOne*/ int index = stream.readInt(); if (index != -1) { set(index, stream.readObject()); } diff --git a/src/main/java/org/jfree/chart/util/ObjectList.java b/src/main/java/org/jfree/chart/util/ObjectList.java index ec115580d..7f34a298c 100644 --- a/src/main/java/org/jfree/chart/util/ObjectList.java +++ b/src/main/java/org/jfree/chart/util/ObjectList.java @@ -28,6 +28,10 @@ package org.jfree.chart.util; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * A list of objects that can grow as required. *

@@ -46,7 +50,7 @@ public ObjectList() { * * @param initialCapacity the initial capacity. */ - public ObjectList(int initialCapacity) { + public ObjectList(/*@NonNegative*/ int initialCapacity) { super(initialCapacity); } @@ -75,7 +79,7 @@ public Object get(int index) { * @param object the object ({@code null} permitted). */ @Override - public void set(int index, Object object) { + public void set(/*@NonNegative*/ int index, Object object) { super.set(index, object); } diff --git a/src/main/java/org/jfree/chart/util/PaintList.java b/src/main/java/org/jfree/chart/util/PaintList.java index f3f02994c..144698819 100644 --- a/src/main/java/org/jfree/chart/util/PaintList.java +++ b/src/main/java/org/jfree/chart/util/PaintList.java @@ -28,6 +28,10 @@ package org.jfree.chart.util; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Paint; import java.io.IOException; import java.io.ObjectInputStream; @@ -54,7 +58,7 @@ public PaintList() { * * @return The object. */ - public Paint getPaint(int index) { + public Paint getPaint(/*@NonNegative*/ int index) { return (Paint) get(index); } @@ -64,7 +68,7 @@ public Paint getPaint(int index) { * @param index the index (zero-based). * @param paint the {@link Paint}. */ - public void setPaint(int index, Paint paint) { + public void setPaint(/*@NonNegative*/ int index, Paint paint) { set(index, paint); } @@ -139,6 +143,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { * @throws IOException if there is an I/O error. * @throws ClassNotFoundException if there is a classpath problem. */ + @SuppressWarnings("index") // stream must have been constructed from an instance of this class private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); diff --git a/src/main/java/org/jfree/chart/util/StrokeList.java b/src/main/java/org/jfree/chart/util/StrokeList.java index 72cf3208f..e6f92a6f6 100644 --- a/src/main/java/org/jfree/chart/util/StrokeList.java +++ b/src/main/java/org/jfree/chart/util/StrokeList.java @@ -28,6 +28,10 @@ package org.jfree.chart.util; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.awt.Stroke; import java.io.IOException; import java.io.ObjectInputStream; @@ -52,7 +56,7 @@ public StrokeList() { * * @return The object. */ - public Stroke getStroke(int index) { + public Stroke getStroke(/*@NonNegative*/ int index) { return (Stroke) get(index); } @@ -62,7 +66,7 @@ public Stroke getStroke(int index) { * @param index the index (zero-based). * @param stroke the {@link Stroke}. */ - public void setStroke(int index, Stroke stroke) { + public void setStroke(/*@NonNegative*/ int index, Stroke stroke) { set(index, stroke); } @@ -145,6 +149,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { * @throws IOException if there is an I/O error. * @throws ClassNotFoundException if there is a classpath problem. */ + @SuppressWarnings("index") // stream must have been constructed from an instance of this class private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index 458ce1e47..900d8b223 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -48,6 +48,10 @@ package org.jfree.data.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -264,7 +268,7 @@ public int getSeriesIndex(Comparable seriesKey) { * @see #getSeriesIndex(Comparable) */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { if ((series >= getSeriesCount()) || (series < 0)) { throw new IllegalArgumentException("No such series : " + series); } @@ -394,7 +398,7 @@ public Number getValue(Comparable series, Comparable category) { * @see #getEndValue(int, int) */ @Override - public Number getValue(int series, int category) { + public Number getValue(/*@NonNegative*/ int series, int category) { return getEndValue(series, category); } @@ -434,7 +438,7 @@ public Number getStartValue(Comparable series, Comparable category) { * @see #getStartValue(Comparable, Comparable) */ @Override - public Number getStartValue(int series, int category) { + public Number getStartValue(/*@NonNegative*/ int series, int category) { // check arguments... if ((series < 0) || (series >= getSeriesCount())) { @@ -488,7 +492,7 @@ public Number getEndValue(Comparable series, Comparable category) { * @see #getEndValue(Comparable, Comparable) */ @Override - public Number getEndValue(int series, int category) { + public Number getEndValue(/*@NonNegative*/ int series, int category) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException( "DefaultIntervalCategoryDataset.getValue(): " @@ -514,7 +518,7 @@ public Number getEndValue(int series, int category) { * * @see #setEndValue(int, Comparable, Number) */ - public void setStartValue(int series, Comparable category, Number value) { + public void setStartValue(/*@NonNegative*/ int series, Comparable category, Number value) { // does the series exist? if ((series < 0) || (series > getSeriesCount() - 1)) { @@ -547,7 +551,7 @@ public void setStartValue(int series, Comparable category, Number value) { * * @see #setStartValue(int, Comparable, Number) */ - public void setEndValue(int series, Comparable category, Number value) { + public void setEndValue(/*@NonNegative*/ int series, Comparable category, Number value) { // does the series exist? if ((series < 0) || (series > getSeriesCount() - 1)) { diff --git a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java index 1dc829105..0c9a53e3d 100644 --- a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java @@ -46,6 +46,10 @@ package org.jfree.data.category; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * A category dataset that defines a value range for each series/category * combination. @@ -62,7 +66,7 @@ public interface IntervalCategoryDataset extends CategoryDataset { * * @see #getEndValue(int, int) */ - public Number getStartValue(int series, int category); + public Number getStartValue(/*@NonNegative*/ int series, int category); /** * Returns the start value for the interval for a given series and category. @@ -86,7 +90,7 @@ public interface IntervalCategoryDataset extends CategoryDataset { * * @see #getStartValue(int, int) */ - public Number getEndValue(int series, int category); + public Number getEndValue(/*@NonNegative*/ int series, int category); /** * Returns the end value for the interval for a given series and category. diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index b53cebbdc..988df1b58 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -40,6 +40,10 @@ package org.jfree.data.gantt; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.Collections; import java.util.List; import org.jfree.chart.util.PublicCloneable; @@ -402,7 +406,7 @@ public Number getEndValue(int row, int column, int subinterval) { * @return The percent complete. */ @Override - public Number getPercentComplete(int series, int category) { + public Number getPercentComplete(/*@NonNegative*/ int series, int category) { return this.underlying.getPercentComplete(series, category + this.firstCategoryIndex); } @@ -575,7 +579,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey) { * @return The end value (possibly {@code null}). */ @Override - public Number getEndValue(int series, int category) { + public Number getEndValue(/*@NonNegative*/ int series, int category) { return this.underlying.getEndValue(series, category + this.firstCategoryIndex); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 7894844a5..151a3677c 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -51,6 +51,10 @@ package org.jfree.data.gantt; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.Iterator; import java.util.List; @@ -120,7 +124,7 @@ public TaskSeries getSeries(Comparable key) { * * @since 1.0.1 */ - public TaskSeries getSeries(int series) { + public TaskSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -145,7 +149,7 @@ public int getSeriesCount() { * @return The name of a series. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { TaskSeries ts = (TaskSeries) this.data.get(series); return ts.getKey(); } @@ -297,7 +301,7 @@ public void remove(TaskSeries series) { * * @param series the series (zero based index). */ - public void remove(int series) { + public void remove(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException( "TaskSeriesCollection.remove(): index outside valid range."); diff --git a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java index 3f4a27894..63ab2e510 100644 --- a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java +++ b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java @@ -41,6 +41,10 @@ package org.jfree.data.gantt; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.Date; import org.jfree.chart.axis.SymbolAxis; @@ -169,7 +173,7 @@ public int getSeriesCount() { * @return The name of a series. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.underlying.getSeriesKey(series); } @@ -181,7 +185,7 @@ public Comparable getSeriesKey(int series) { * @return The item count. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getSeries(series).getItemCount(); } @@ -194,7 +198,7 @@ public int getItemCount(int series) { * @return The value. */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { if (!this.transposed) { return getSeriesValue(series); } @@ -214,7 +218,7 @@ public double getXValue(int series, int item) { * @return The start date/time. */ @Override - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { if (!this.transposed) { return getSeriesStartValue(series); } @@ -234,7 +238,7 @@ public double getStartXValue(int series, int item) { * @return The end date/time. */ @Override - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { if (!this.transposed) { return getSeriesEndValue(series); } @@ -252,7 +256,7 @@ public double getEndXValue(int series, int item) { * @return The x-value (in milliseconds). */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Double(getXValue(series, item)); } @@ -267,7 +271,7 @@ public Number getX(int series, int item) { * @return The start date/time. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return new Double(getStartXValue(series, item)); } @@ -282,7 +286,7 @@ public Number getStartX(int series, int item) { * @return The end date/time. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return new Double(getEndXValue(series, item)); } @@ -295,7 +299,7 @@ public Number getEndX(int series, int item) { * @return The value. */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { if (!this.transposed) { return getItemValue(series, item); } @@ -314,7 +318,7 @@ public double getYValue(int series, int item) { * @return The y-interval start. */ @Override - public double getStartYValue(int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, int item) { if (!this.transposed) { return getItemStartValue(series, item); } @@ -333,7 +337,7 @@ public double getStartYValue(int series, int item) { * @return The y-interval end. */ @Override - public double getEndYValue(int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, int item) { if (!this.transposed) { return getItemEndValue(series, item); } @@ -353,7 +357,7 @@ public double getEndYValue(int series, int item) { * @return The y-value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return new Double(getYValue(series, item)); } @@ -367,7 +371,7 @@ public Number getY(int series, int item) { * @return The y-interval start. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return new Double(getStartYValue(series, item)); } @@ -381,23 +385,23 @@ public Number getStartY(int series, int item) { * @return The y-interval end. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return new Double(getEndYValue(series, item)); } - private double getSeriesValue(int series) { + private double getSeriesValue(/*@NonNegative*/ int series) { return series; } - private double getSeriesStartValue(int series) { + private double getSeriesStartValue(/*@NonNegative*/ int series) { return series - this.seriesWidth / 2.0; } - private double getSeriesEndValue(int series) { + private double getSeriesEndValue(/*@NonNegative*/ int series) { return series + this.seriesWidth / 2.0; } - private double getItemValue(int series, int item) { + private double getItemValue(/*@NonNegative*/ int series, int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); @@ -406,7 +410,7 @@ private double getItemValue(int series, int item) { return (start.getTime() + end.getTime()) / 2.0; } - private double getItemStartValue(int series, int item) { + private double getItemStartValue(/*@NonNegative*/ int series, int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); @@ -414,7 +418,7 @@ private double getItemStartValue(int series, int item) { return start.getTime(); } - private double getItemEndValue(int series, int item) { + private double getItemEndValue(/*@NonNegative*/ int series, int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); diff --git a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java index 060ee959d..49acc085f 100644 --- a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java +++ b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java @@ -44,6 +44,10 @@ package org.jfree.data.general; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; /** @@ -84,7 +88,7 @@ protected AbstractSeriesDataset() { * @return The series key. */ @Override - public abstract Comparable getSeriesKey(int series); + public abstract Comparable getSeriesKey(/*@NonNegative*/ int series); /** * Returns the index of the named series, or -1. diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 57fedbdb6..00f8f7b50 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -129,6 +129,10 @@ package org.jfree.data.general; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -2243,7 +2247,7 @@ public static Range findCumulativeRangeBounds(CategoryDataset dataset) { * * @since 1.0.16 */ - public static double findYValue(XYDataset dataset, int series, double x) { + public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, double x) { // delegate null check on dataset int[] indices = findItemIndicesForX(dataset, series, x); if (indices[0] == -1) { @@ -2280,7 +2284,7 @@ public static double findYValue(XYDataset dataset, int series, double x) { * * @see #findYValue(org.jfree.data.xy.XYDataset, int, double) */ - public static int[] findItemIndicesForX(XYDataset dataset, int series, + public static int[] findItemIndicesForX(XYDataset dataset, /*@NonNegative*/ int series, double x) { Args.nullNotPermitted(dataset, "dataset"); int itemCount = dataset.getItemCount(series); diff --git a/src/main/java/org/jfree/data/general/SeriesDataset.java b/src/main/java/org/jfree/data/general/SeriesDataset.java index aa04441a7..2bbe69432 100644 --- a/src/main/java/org/jfree/data/general/SeriesDataset.java +++ b/src/main/java/org/jfree/data/general/SeriesDataset.java @@ -43,6 +43,10 @@ package org.jfree.data.general; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.category.CategoryDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.IntervalXYZDataset; @@ -75,7 +79,7 @@ public interface SeriesDataset extends Dataset { * * @return The key for the series. */ - public Comparable getSeriesKey(int series); + public Comparable getSeriesKey(/*@NonNegative*/ int series); /** * Returns the index of the series with the specified key, or -1 if there diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java index fa3dc3097..3565fc01c 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java @@ -52,6 +52,10 @@ package org.jfree.data.statistics; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.List; import org.jfree.data.xy.XYDataset; @@ -73,7 +77,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The mean for the specified series and item. */ - public Number getMeanValue(int series, int item); + public Number getMeanValue(/*@NonNegative*/ int series, int item); /** * Returns the median-value for the specified series and item. @@ -83,7 +87,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The median-value for the specified series and item. */ - public Number getMedianValue(int series, int item); + public Number getMedianValue(/*@NonNegative*/ int series, int item); /** * Returns the Q1 median-value for the specified series and item. @@ -93,7 +97,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The Q1 median-value for the specified series and item. */ - public Number getQ1Value(int series, int item); + public Number getQ1Value(/*@NonNegative*/ int series, int item); /** * Returns the Q3 median-value for the specified series and item. @@ -103,7 +107,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The Q3 median-value for the specified series and item. */ - public Number getQ3Value(int series, int item); + public Number getQ3Value(/*@NonNegative*/ int series, int item); /** * Returns the min-value for the specified series and item. @@ -113,7 +117,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The min-value for the specified series and item. */ - public Number getMinRegularValue(int series, int item); + public Number getMinRegularValue(/*@NonNegative*/ int series, int item); /** * Returns the max-value for the specified series and item. @@ -123,7 +127,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The max-value for the specified series and item. */ - public Number getMaxRegularValue(int series, int item); + public Number getMaxRegularValue(/*@NonNegative*/ int series, int item); /** * Returns the minimum value which is not a farout. @@ -132,7 +136,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return A {@code Number} representing the maximum non-farout value. */ - public Number getMinOutlier(int series, int item); + public Number getMinOutlier(/*@NonNegative*/ int series, int item); /** * Returns the maximum value which is not a farout, ie Q3 + (interquartile @@ -143,7 +147,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return A {@code Number} representing the maximum non-farout value. */ - public Number getMaxOutlier(int series, int item); + public Number getMaxOutlier(/*@NonNegative*/ int series, int item); /** * Returns a list of outliers for the specified series and item. @@ -154,7 +158,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * @return The list of outliers for the specified series and item * (possibly {@code null}). */ - public List getOutliers(int series, int item); + public List getOutliers(/*@NonNegative*/ int series, int item); /** * Returns the value used as the outlier coefficient. The outlier diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java index 086a37709..a9a132746 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java @@ -56,6 +56,10 @@ package org.jfree.data.statistics; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.List; import org.jfree.chart.util.ObjectUtils; import org.jfree.chart.util.PublicCloneable; diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index a4fbbf6c3..9d6e4f8d8 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -60,6 +60,10 @@ package org.jfree.data.statistics; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -212,7 +216,7 @@ public int getSeriesCount() { * @return The number of items in the specified series. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return this.dates.size(); } @@ -270,7 +274,7 @@ public Comparable getSeriesKey(int i) { * * @return The item. */ - public BoxAndWhiskerItem getItem(int series, int item) { + public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, int item) { return (BoxAndWhiskerItem) this.items.get(item); } @@ -286,7 +290,7 @@ public BoxAndWhiskerItem getItem(int series, int item) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Long(((Date) this.dates.get(item)).getTime()); } @@ -300,7 +304,7 @@ public Number getX(int series, int item) { * * @return The x-value as a Date. */ - public Date getXDate(int series, int item) { + public Date getXDate(/*@NonNegative*/ int series, int item) { return (Date) this.dates.get(item); } @@ -316,7 +320,7 @@ public Date getXDate(int series, int item) { * @return The y-value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return getMeanValue(series, item); } @@ -329,7 +333,7 @@ public Number getY(int series, int item) { * @return The mean for the specified series and item. */ @Override - public Number getMeanValue(int series, int item) { + public Number getMeanValue(/*@NonNegative*/ int series, int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -347,7 +351,7 @@ public Number getMeanValue(int series, int item) { * @return The median-value for the specified series and item. */ @Override - public Number getMedianValue(int series, int item) { + public Number getMedianValue(/*@NonNegative*/ int series, int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -365,7 +369,7 @@ public Number getMedianValue(int series, int item) { * @return The Q1 median-value for the specified series and item. */ @Override - public Number getQ1Value(int series, int item) { + public Number getQ1Value(/*@NonNegative*/ int series, int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -383,7 +387,7 @@ public Number getQ1Value(int series, int item) { * @return The Q3 median-value for the specified series and item. */ @Override - public Number getQ3Value(int series, int item) { + public Number getQ3Value(/*@NonNegative*/ int series, int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -401,7 +405,7 @@ public Number getQ3Value(int series, int item) { * @return The min-value for the specified series and item. */ @Override - public Number getMinRegularValue(int series, int item) { + public Number getMinRegularValue(/*@NonNegative*/ int series, int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -419,7 +423,7 @@ public Number getMinRegularValue(int series, int item) { * @return The max-value for the specified series and item. */ @Override - public Number getMaxRegularValue(int series, int item) { + public Number getMaxRegularValue(/*@NonNegative*/ int series, int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -436,7 +440,7 @@ public Number getMaxRegularValue(int series, int item) { * @return A {@code Number} representing the maximum non-farout value. */ @Override - public Number getMinOutlier(int series, int item) { + public Number getMinOutlier(/*@NonNegative*/ int series, int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -455,7 +459,7 @@ public Number getMinOutlier(int series, int item) { * @return A {@code Number} representing the maximum non-farout value. */ @Override - public Number getMaxOutlier(int series, int item) { + public Number getMaxOutlier(/*@NonNegative*/ int series, int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -474,7 +478,7 @@ public Number getMaxOutlier(int series, int item) { * (possibly {@code null}). */ @Override - public List getOutliers(int series, int item) { + public List getOutliers(/*@NonNegative*/ int series, int item) { List result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index 12d386421..2d165837c 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -62,6 +62,10 @@ package org.jfree.data.statistics; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; @@ -263,7 +267,7 @@ private double getMaximum(double[] values) { * @throws IndexOutOfBoundsException if {@code series} is outside the * specified range. */ - List getBins(int series) { + List getBins(/*@NonNegative*/ int series) { Map map = (Map) this.list.get(series); return (List) map.get("bins"); } @@ -275,7 +279,7 @@ List getBins(int series) { * * @return The total. */ - private int getTotal(int series) { + private int getTotal(/*@NonNegative*/ int series) { Map map = (Map) this.list.get(series); return ((Integer) map.get("values.length")).intValue(); } @@ -287,7 +291,7 @@ private int getTotal(int series) { * * @return The bin width. */ - private double getBinWidth(int series) { + private double getBinWidth(/*@NonNegative*/ int series) { Map map = (Map) this.list.get(series); return ((Double) map.get("bin width")).doubleValue(); } @@ -314,7 +318,7 @@ public int getSeriesCount() { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { Map map = (Map) this.list.get(series); return (Comparable) map.get("key"); } @@ -331,7 +335,7 @@ public Comparable getSeriesKey(int series) { * specified range. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return getBins(series).size(); } @@ -351,7 +355,7 @@ public int getItemCount(int series) { * specified range. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); double x = (bin.getStartBoundary() + bin.getEndBoundary()) / 2.; @@ -372,7 +376,7 @@ public Number getX(int series, int item) { * specified range. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); double total = getTotal(series); @@ -405,7 +409,7 @@ else if (this.type == HistogramType.SCALE_AREA_TO_1) { * specified range. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); return new Double(bin.getStartBoundary()); @@ -424,7 +428,7 @@ public Number getStartX(int series, int item) { * specified range. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); return new Double(bin.getEndBoundary()); @@ -445,7 +449,7 @@ public Number getEndX(int series, int item) { * specified range. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -464,7 +468,7 @@ public Number getStartY(int series, int item) { * specified range. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index 83b126b35..7f7f9d0f2 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -46,6 +46,10 @@ package org.jfree.data.statistics; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.chart.util.Args; import org.jfree.data.xy.XYDataset; @@ -107,7 +111,7 @@ public static double[] getOLSRegression(double[][] data) { * * @return The parameters. */ - public static double[] getOLSRegression(XYDataset data, int series) { + public static double[] getOLSRegression(XYDataset data, /*@NonNegative*/ int series) { int n = data.getItemCount(series); if (n < 2) { @@ -194,7 +198,7 @@ public static double[] getPowerRegression(double[][] data) { * * @return The parameters. */ - public static double[] getPowerRegression(XYDataset data, int series) { + public static double[] getPowerRegression(XYDataset data, /*@NonNegative*/ int series) { int n = data.getItemCount(series); if (n < 2) { diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index be6b95832..5eca406da 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -43,6 +43,10 @@ package org.jfree.data.statistics; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -139,7 +143,7 @@ public int getSeriesCount() { * @return The key for the series. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.key; } @@ -162,7 +166,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return this.bins.size(); } @@ -282,7 +286,7 @@ public void removeAllBins() { * @return The x-value (never {@code null}). */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Double(getXValue(series, item)); } @@ -295,7 +299,7 @@ public Number getX(int series, int item) { * @return The x-value. */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return (bin.getLowerBound() + bin.getUpperBound()) / 2.0; } @@ -309,7 +313,7 @@ public double getXValue(int series, int item) { * @return The y-value (possibly {@code null}). */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return new Double(getYValue(series, item)); } @@ -324,7 +328,7 @@ public Number getY(int series, int item) { * @see #getAdjustForBinSize() */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); if (this.adjustForBinSize) { return bin.getItemCount() @@ -344,7 +348,7 @@ public double getYValue(int series, int item) { * @return The value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return new Double(getStartXValue(series, item)); } @@ -358,7 +362,7 @@ public Number getStartX(int series, int item) { * @return The start x-value. */ @Override - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return bin.getLowerBound(); } @@ -372,7 +376,7 @@ public double getStartXValue(int series, int item) { * @return The value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return new Double(getEndXValue(series, item)); } @@ -386,7 +390,7 @@ public Number getEndX(int series, int item) { * @return The end x-value. */ @Override - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return bin.getUpperBound(); } @@ -400,7 +404,7 @@ public double getEndXValue(int series, int item) { * @return The value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -414,7 +418,7 @@ public Number getStartY(int series, int item) { * @return The start y-value. */ @Override - public double getStartYValue(int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, int item) { return getYValue(series, item); } @@ -427,7 +431,7 @@ public double getStartYValue(int series, int item) { * @return The value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -441,7 +445,7 @@ public Number getEndY(int series, int item) { * @return The end y-value. */ @Override - public double getEndYValue(int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, int item) { return getYValue(series, item); } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 288c573f2..4b45d3506 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -62,6 +62,10 @@ package org.jfree.data.time; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.Calendar; import java.util.TimeZone; @@ -476,7 +480,7 @@ public int getSeriesCount() { * @return The item count. */ @Override - public int getItemCount(int series) { // all arrays equal length, + public int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, // so ignore argument: return this.historyCount; } @@ -726,7 +730,7 @@ public RegularTimePeriod getOldestTime() { // getXxx() ftns can ignore the "series" argument: // Don't synchronize this!! Instead, synchronize the loop that calls it. @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(getX(tp)); } @@ -740,7 +744,7 @@ public Number getX(int series, int item) { * @return The value. */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { // Don't synchronize this!! // Instead, synchronize the loop that calls it. ValueSequence values = this.valueHistory[series]; @@ -756,7 +760,7 @@ public double getYValue(int series, int item) { * @return The value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return new Float(getYValue(series, item)); } @@ -769,7 +773,7 @@ public Number getY(int series, int item) { * @return The value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(tp.getFirstMillisecond(this.workingCalendar)); } @@ -783,7 +787,7 @@ public Number getStartX(int series, int item) { * @return The value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(tp.getLastMillisecond(this.workingCalendar)); } @@ -797,7 +801,7 @@ public Number getEndX(int series, int item) { * @return The value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -810,7 +814,7 @@ public Number getStartY(int series, int item) { * @return The value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -833,7 +837,7 @@ public float getUntranslatedY(int series, int item) * @return The key. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.seriesKeys[series]; } diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index aef830e63..657d0385e 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -50,6 +50,10 @@ package org.jfree.data.time; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.Iterator; import java.util.List; @@ -146,7 +150,7 @@ public int getSeriesCount() { * * @return The series. */ - public TimePeriodValues getSeries(int series) { + public TimePeriodValues getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Index 'series' out of range."); } @@ -161,7 +165,7 @@ public TimePeriodValues getSeries(int series) { * @return The key for a series. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getKey(); } @@ -215,7 +219,7 @@ public void removeSeries(int index) { * @return The number of items in the specified series. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } @@ -228,7 +232,7 @@ public int getItemCount(int series) { * @return The x-value for the specified series and item. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); TimePeriod period = dp.getPeriod(); @@ -269,7 +273,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The starting X value for the specified series and item. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return new Long(dp.getPeriod().getStart().getTime()); @@ -284,7 +288,7 @@ public Number getStartX(int series, int item) { * @return The ending X value for the specified series and item. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return new Long(dp.getPeriod().getEnd().getTime()); @@ -299,7 +303,7 @@ public Number getEndX(int series, int item) { * @return The y-value for the specified series and item. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return dp.getValue(); @@ -314,7 +318,7 @@ public Number getY(int series, int item) { * @return The starting Y value for the specified series and item. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -327,7 +331,7 @@ public Number getStartY(int series, int item) { * @return The ending Y value for the specified series and item. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index 05e502888..d7b26231a 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -88,6 +88,10 @@ package org.jfree.data.time; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; @@ -264,7 +268,7 @@ public int indexOf(TimeSeries series) { * * @return The series. */ - public TimeSeries getSeries(int series) { + public TimeSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException( "The 'series' argument is out of bounds (" + series + ")."); @@ -301,7 +305,7 @@ public TimeSeries getSeries(Comparable key) { * @return The key for a series. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // check arguments...delegated // fetch the series name... return getSeries(series).getKey(); @@ -398,7 +402,7 @@ public void removeAllSeries() { * @return The item count. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } @@ -411,7 +415,7 @@ public int getItemCount(int series) { * @return The x-value. */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { TimeSeries s = (TimeSeries) this.data.get(series); RegularTimePeriod period = s.getTimePeriod(item); return getX(period); @@ -426,7 +430,7 @@ public double getXValue(int series, int item) { * @return The value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { TimeSeries ts = (TimeSeries) this.data.get(series); RegularTimePeriod period = ts.getTimePeriod(item); return new Long(getX(period)); @@ -462,7 +466,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The value. */ @Override - public synchronized Number getStartX(int series, int item) { + public synchronized Number getStartX(/*@NonNegative*/ int series, int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return new Long(ts.getTimePeriod(item).getFirstMillisecond( this.workingCalendar)); @@ -477,7 +481,7 @@ public synchronized Number getStartX(int series, int item) { * @return The value. */ @Override - public synchronized Number getEndX(int series, int item) { + public synchronized Number getEndX(/*@NonNegative*/ int series, int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return new Long(ts.getTimePeriod(item).getLastMillisecond( this.workingCalendar)); @@ -492,7 +496,7 @@ public synchronized Number getEndX(int series, int item) { * @return The value (possibly {@code null}). */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return ts.getValue(item); } @@ -506,7 +510,7 @@ public Number getY(int series, int item) { * @return The value (possibly {@code null}). */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -519,7 +523,7 @@ public Number getStartY(int series, int item) { * @return The value (possibly {@code null}). */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -534,7 +538,7 @@ public Number getEndY(int series, int item) { * @return An array containing the (two) indices of the items surrounding * the time. */ - public int[] getSurroundingItems(int series, long milliseconds) { + public int[] getSurroundingItems(/*@NonNegative*/ int series, long milliseconds) { int[] result = new int[] {-1, -1}; TimeSeries timeSeries = getSeries(series); for (int i = 0; i < timeSeries.getItemCount(); i++) { diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index 0cb32d047..59fce145a 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -57,6 +57,10 @@ package org.jfree.data.time; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.Calendar; import java.util.List; import java.util.Locale; @@ -322,7 +326,7 @@ public int getItemCount() { * @return The number of items within the series. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return getItemCount(); } @@ -344,7 +348,7 @@ public int getSeriesCount() { * @return The key for the series. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.values.getColumnKey(series); } @@ -359,7 +363,7 @@ public Comparable getSeriesKey(int series) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Double(getXValue(series, item)); } @@ -372,7 +376,7 @@ public Number getX(int series, int item) { * @return The value. */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return getXValue(period); } @@ -388,7 +392,7 @@ public double getXValue(int series, int item) { * @see #getStartXValue(int, int) */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return new Double(getStartXValue(series, item)); } @@ -402,7 +406,7 @@ public Number getStartX(int series, int item) { * @return The value. */ @Override - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return period.getStart().getTime(); } @@ -418,7 +422,7 @@ public double getStartXValue(int series, int item) { * @see #getEndXValue(int, int) */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return new Double(getEndXValue(series, item)); } @@ -432,7 +436,7 @@ public Number getEndX(int series, int item) { * @return The value. */ @Override - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return period.getEnd().getTime(); } @@ -446,7 +450,7 @@ public double getEndXValue(int series, int item) { * @return The y-value (possibly {@code null}). */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return this.values.getValue(item, series); } @@ -459,7 +463,7 @@ public Number getY(int series, int item) { * @return The starting Y value for the specified series and item. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -472,7 +476,7 @@ public Number getStartY(int series, int item) { * @return The ending Y value for the specified series and item. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index f14315fcb..3b53e6c78 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -44,6 +44,10 @@ package org.jfree.data.time.ohlc; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.List; @@ -139,7 +143,7 @@ public int getSeriesCount() { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public OHLCSeries getSeries(int series) { + public OHLCSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -158,7 +162,7 @@ public OHLCSeries getSeries(int series) { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getKey(); } @@ -174,7 +178,7 @@ public Comparable getSeriesKey(int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -209,7 +213,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The x-value. */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); RegularTimePeriod period = di.getPeriod(); @@ -225,7 +229,7 @@ public double getXValue(int series, int item) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Double(getXValue(series, item)); } @@ -238,7 +242,7 @@ public Number getX(int series, int item) { * @return The y-value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return new Double(di.getYValue()); @@ -253,7 +257,7 @@ public Number getY(int series, int item) { * @return The open-value. */ @Override - public double getOpenValue(int series, int item) { + public double getOpenValue(/*@NonNegative*/ int series, int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getOpenValue(); @@ -268,7 +272,7 @@ public double getOpenValue(int series, int item) { * @return The open-value. */ @Override - public Number getOpen(int series, int item) { + public Number getOpen(/*@NonNegative*/ int series, int item) { return new Double(getOpenValue(series, item)); } @@ -281,7 +285,7 @@ public Number getOpen(int series, int item) { * @return The close-value. */ @Override - public double getCloseValue(int series, int item) { + public double getCloseValue(/*@NonNegative*/ int series, int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getCloseValue(); @@ -296,7 +300,7 @@ public double getCloseValue(int series, int item) { * @return The close-value. */ @Override - public Number getClose(int series, int item) { + public Number getClose(/*@NonNegative*/ int series, int item) { return new Double(getCloseValue(series, item)); } @@ -309,7 +313,7 @@ public Number getClose(int series, int item) { * @return The high-value. */ @Override - public double getHighValue(int series, int item) { + public double getHighValue(/*@NonNegative*/ int series, int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getHighValue(); @@ -324,7 +328,7 @@ public double getHighValue(int series, int item) { * @return The high-value. */ @Override - public Number getHigh(int series, int item) { + public Number getHigh(/*@NonNegative*/ int series, int item) { return new Double(getHighValue(series, item)); } @@ -337,7 +341,7 @@ public Number getHigh(int series, int item) { * @return The low-value. */ @Override - public double getLowValue(int series, int item) { + public double getLowValue(/*@NonNegative*/ int series, int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getLowValue(); @@ -352,7 +356,7 @@ public double getLowValue(int series, int item) { * @return The low-value. */ @Override - public Number getLow(int series, int item) { + public Number getLow(/*@NonNegative*/ int series, int item) { return new Double(getLowValue(series, item)); } @@ -366,7 +370,7 @@ public Number getLow(int series, int item) { * @return {@code null}. */ @Override - public Number getVolume(int series, int item) { + public Number getVolume(/*@NonNegative*/ int series, int item) { return null; } @@ -380,7 +384,7 @@ public Number getVolume(int series, int item) { * @return {@code Double.NaN}. */ @Override - public double getVolumeValue(int series, int item) { + public double getVolumeValue(/*@NonNegative*/ int series, int item) { return Double.NaN; } diff --git a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java index c8e97a9cb..79d1666f9 100644 --- a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java @@ -43,6 +43,9 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ /** * An base class that you can use to create new implementations of the @@ -61,7 +64,7 @@ public abstract class AbstractIntervalXYDataset extends AbstractXYDataset * @return The value. */ @Override - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number x = getStartX(series, item); if (x != null) { @@ -80,7 +83,7 @@ public double getStartXValue(int series, int item) { * @return The value. */ @Override - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number x = getEndX(series, item); if (x != null) { @@ -99,7 +102,7 @@ public double getEndXValue(int series, int item) { * @return The value. */ @Override - public double getStartYValue(int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number y = getStartY(series, item); if (y != null) { @@ -118,7 +121,7 @@ public double getStartYValue(int series, int item) { * @return The value. */ @Override - public double getEndYValue(int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number y = getEndY(series, item); if (y != null) { diff --git a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java index 45bca666c..c57659cd7 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java @@ -43,6 +43,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.DomainOrder; import org.jfree.data.general.AbstractSeriesDataset; @@ -72,7 +76,7 @@ public DomainOrder getDomainOrder() { * @return The value. */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number x = getX(series, item); if (x != null) { @@ -90,7 +94,7 @@ public double getXValue(int series, int item) { * @return The value. */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number y = getY(series, item); if (y != null) { diff --git a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java index 859a60e58..ae3f7b776 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java @@ -41,6 +41,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * An base class that you can use to create new implementations of the * {@link XYZDataset} interface. @@ -57,7 +61,7 @@ public abstract class AbstractXYZDataset extends AbstractXYDataset * @return The z-value. */ @Override - public double getZValue(int series, int item) { + public double getZValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number z = getZ(series, item); if (z != null) { diff --git a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java index 0c2431513..6517c6740 100644 --- a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java @@ -49,6 +49,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.chart.util.PublicCloneable; import org.jfree.data.DefaultKeyedValues2D; import org.jfree.data.DomainInfo; @@ -171,7 +175,7 @@ public int getSeriesCount() { * @return The key for a series. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.values.getColumnKey(series); } @@ -194,7 +198,7 @@ public int getItemCount() { * @return The item count. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return getItemCount(); // all series have the same number of items in // this dataset } @@ -208,7 +212,7 @@ public int getItemCount(int series) { * @return The value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return (Number) this.values.getRowKey(item); } @@ -221,7 +225,7 @@ public Number getX(int series, int item) { * @return The starting X value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return this.intervalDelegate.getStartX(series, item); } @@ -234,7 +238,7 @@ public Number getStartX(int series, int item) { * @return The ending X value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return this.intervalDelegate.getEndX(series, item); } @@ -247,7 +251,7 @@ public Number getEndX(int series, int item) { * @return The y value (possibly {@code null}). */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return this.values.getValue(item, series); } @@ -260,7 +264,7 @@ public Number getY(int series, int item) { * @return The starting Y value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -273,7 +277,7 @@ public Number getStartY(int series, int item) { * @return The ending Y value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java index 1b3ed72c8..2372f1ed5 100644 --- a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java @@ -49,6 +49,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.Arrays; import java.util.Date; import org.jfree.chart.util.Args; @@ -123,7 +127,7 @@ public DefaultHighLowDataset(Comparable seriesKey, Date[] date, * @return The series key (never {@code null}). */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.seriesKey; } @@ -142,7 +146,7 @@ public Comparable getSeriesKey(int series) { * @see #getXDate(int, int) */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Long(this.date[item].getTime()); } @@ -158,7 +162,7 @@ public Number getX(int series, int item) { * * @see #getX(int, int) */ - public Date getXDate(int series, int item) { + public Date getXDate(/*@NonNegative*/ int series, int item) { return this.date[item]; } @@ -176,7 +180,7 @@ public Date getXDate(int series, int item) { * @see #getYValue(int, int) */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return getClose(series, item); } @@ -191,7 +195,7 @@ public Number getY(int series, int item) { * @see #getHighValue(int, int) */ @Override - public Number getHigh(int series, int item) { + public Number getHigh(/*@NonNegative*/ int series, int item) { return this.high[item]; } @@ -207,7 +211,7 @@ public Number getHigh(int series, int item) { * @see #getHigh(int, int) */ @Override - public double getHighValue(int series, int item) { + public double getHighValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number h = getHigh(series, item); if (h != null) { @@ -227,7 +231,7 @@ public double getHighValue(int series, int item) { * @see #getLowValue(int, int) */ @Override - public Number getLow(int series, int item) { + public Number getLow(/*@NonNegative*/ int series, int item) { return this.low[item]; } @@ -243,7 +247,7 @@ public Number getLow(int series, int item) { * @see #getLow(int, int) */ @Override - public double getLowValue(int series, int item) { + public double getLowValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number l = getLow(series, item); if (l != null) { @@ -263,7 +267,7 @@ public double getLowValue(int series, int item) { * @see #getOpenValue(int, int) */ @Override - public Number getOpen(int series, int item) { + public Number getOpen(/*@NonNegative*/ int series, int item) { return this.open[item]; } @@ -279,7 +283,7 @@ public Number getOpen(int series, int item) { * @see #getOpen(int, int) */ @Override - public double getOpenValue(int series, int item) { + public double getOpenValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number open = getOpen(series, item); if (open != null) { @@ -299,7 +303,7 @@ public double getOpenValue(int series, int item) { * @see #getCloseValue(int, int) */ @Override - public Number getClose(int series, int item) { + public Number getClose(/*@NonNegative*/ int series, int item) { return this.close[item]; } @@ -315,7 +319,7 @@ public Number getClose(int series, int item) { * @see #getClose(int, int) */ @Override - public double getCloseValue(int series, int item) { + public double getCloseValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number c = getClose(series, item); if (c != null) { @@ -335,7 +339,7 @@ public double getCloseValue(int series, int item) { * @see #getVolumeValue(int, int) */ @Override - public Number getVolume(int series, int item) { + public Number getVolume(/*@NonNegative*/ int series, int item) { return this.volume[item]; } @@ -351,7 +355,7 @@ public Number getVolume(int series, int item) { * @see #getVolume(int, int) */ @Override - public double getVolumeValue(int series, int item) { + public double getVolumeValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number v = getVolume(series, item); if (v != null) { @@ -380,7 +384,7 @@ public int getSeriesCount() { * @return The number of items in the specified series. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return this.date.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java index 9003e532e..9032f092c 100644 --- a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java @@ -45,6 +45,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -109,7 +113,7 @@ public int getSeriesCount() { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -128,7 +132,7 @@ public Comparable getSeriesKey(int series) { * specified range. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -154,7 +158,7 @@ public int getItemCount(int series) { * @see #getX(int, int) */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[0][item]; } @@ -177,7 +181,7 @@ public double getXValue(int series, int item) { * @see #getY(int, int) */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[3][item]; } @@ -200,7 +204,7 @@ public double getYValue(int series, int item) { * @see #getStartX(int, int) */ @Override - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[1][item]; } @@ -223,7 +227,7 @@ public double getStartXValue(int series, int item) { * @see #getEndX(int, int) */ @Override - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[2][item]; } @@ -246,7 +250,7 @@ public double getEndXValue(int series, int item) { * @see #getStartY(int, int) */ @Override - public double getStartYValue(int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[4][item]; } @@ -269,7 +273,7 @@ public double getStartYValue(int series, int item) { * @see #getEndY(int, int) */ @Override - public double getEndYValue(int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[5][item]; } @@ -292,7 +296,7 @@ public double getEndYValue(int series, int item) { * @see #getEndXValue(int, int) */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return new Double(getEndXValue(series, item)); } @@ -314,7 +318,7 @@ public Number getEndX(int series, int item) { * @see #getEndYValue(int, int) */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return new Double(getEndYValue(series, item)); } @@ -336,7 +340,7 @@ public Number getEndY(int series, int item) { * @see #getStartXValue(int, int) */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return new Double(getStartXValue(series, item)); } @@ -358,7 +362,7 @@ public Number getStartX(int series, int item) { * @see #getStartYValue(int, int) */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return new Double(getStartYValue(series, item)); } @@ -380,7 +384,7 @@ public Number getStartY(int series, int item) { * @see #getXValue(int, int) */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Double(getXValue(series, item)); } @@ -402,7 +406,7 @@ public Number getX(int series, int item) { * @see #getYValue(int, int) */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return new Double(getYValue(series, item)); } diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index 61d564a99..0a4592f1e 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -45,6 +45,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.Arrays; import java.util.Date; import org.jfree.chart.util.PublicCloneable; @@ -81,7 +85,7 @@ public DefaultOHLCDataset(Comparable key, OHLCDataItem[] data) { * @return The series key. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.key; } @@ -94,7 +98,7 @@ public Comparable getSeriesKey(int series) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Long(this.data[item].getDate().getTime()); } @@ -106,7 +110,7 @@ public Number getX(int series, int item) { * * @return The x-value as a date. */ - public Date getXDate(int series, int item) { + public Date getXDate(/*@NonNegative*/ int series, int item) { return this.data[item].getDate(); } @@ -119,7 +123,7 @@ public Date getXDate(int series, int item) { * @return The y value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return getClose(series, item); } @@ -132,7 +136,7 @@ public Number getY(int series, int item) { * @return The high value. */ @Override - public Number getHigh(int series, int item) { + public Number getHigh(/*@NonNegative*/ int series, int item) { return this.data[item].getHigh(); } @@ -146,7 +150,7 @@ public Number getHigh(int series, int item) { * @return The high-value. */ @Override - public double getHighValue(int series, int item) { + public double getHighValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number high = getHigh(series, item); if (high != null) { @@ -164,7 +168,7 @@ public double getHighValue(int series, int item) { * @return The low value. */ @Override - public Number getLow(int series, int item) { + public Number getLow(/*@NonNegative*/ int series, int item) { return this.data[item].getLow(); } @@ -178,7 +182,7 @@ public Number getLow(int series, int item) { * @return The low-value. */ @Override - public double getLowValue(int series, int item) { + public double getLowValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number low = getLow(series, item); if (low != null) { @@ -196,7 +200,7 @@ public double getLowValue(int series, int item) { * @return The open value. */ @Override - public Number getOpen(int series, int item) { + public Number getOpen(/*@NonNegative*/ int series, int item) { return this.data[item].getOpen(); } @@ -210,7 +214,7 @@ public Number getOpen(int series, int item) { * @return The open-value. */ @Override - public double getOpenValue(int series, int item) { + public double getOpenValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number open = getOpen(series, item); if (open != null) { @@ -228,7 +232,7 @@ public double getOpenValue(int series, int item) { * @return The close value. */ @Override - public Number getClose(int series, int item) { + public Number getClose(/*@NonNegative*/ int series, int item) { return this.data[item].getClose(); } @@ -242,7 +246,7 @@ public Number getClose(int series, int item) { * @return The close-value. */ @Override - public double getCloseValue(int series, int item) { + public double getCloseValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number close = getClose(series, item); if (close != null) { @@ -260,7 +264,7 @@ public double getCloseValue(int series, int item) { * @return The trading volume. */ @Override - public Number getVolume(int series, int item) { + public Number getVolume(/*@NonNegative*/ int series, int item) { return this.data[item].getVolume(); } @@ -274,7 +278,7 @@ public Number getVolume(int series, int item) { * @return The volume-value. */ @Override - public double getVolumeValue(int series, int item) { + public double getVolumeValue(/*@NonNegative*/ int series, int item) { double result = Double.NaN; Number volume = getVolume(series, item); if (volume != null) { @@ -301,7 +305,7 @@ public int getSeriesCount() { * @return The item count. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return this.data.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index 3481a774f..7621c7b3d 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -63,6 +63,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -237,7 +241,7 @@ public int getItemCount() { * * @return The series (never {@code null}). */ - public XYSeries getSeries(int series) { + public XYSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Index outside valid range."); } @@ -252,7 +256,7 @@ public XYSeries getSeries(int series) { * @return The key for a series. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // check arguments...delegated return getSeries(series).getKey(); } @@ -265,7 +269,7 @@ public Comparable getSeriesKey(int series) { * @return The number of items in the specified series. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { // check arguments...delegated return getSeries(series).getItemCount(); } @@ -279,7 +283,7 @@ public int getItemCount(int series) { * @return The x-value for the specified series and item. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { XYSeries s = (XYSeries) this.data.get(series); return s.getX(item); @@ -294,7 +298,7 @@ public Number getX(int series, int item) { * @return The starting X value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return this.intervalDelegate.getStartX(series, item); } @@ -307,7 +311,7 @@ public Number getStartX(int series, int item) { * @return The ending X value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return this.intervalDelegate.getEndX(series, item); } @@ -321,7 +325,7 @@ public Number getEndX(int series, int item) { * {@code null}). */ @Override - public Number getY(int series, int index) { + public Number getY(/*@NonNegative*/ int series, int index) { XYSeries s = (XYSeries) this.data.get(series); return s.getY(index); } @@ -335,7 +339,7 @@ public Number getY(int series, int index) { * @return The starting Y value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -348,7 +352,7 @@ public Number getStartY(int series, int item) { * @return The ending Y value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -395,7 +399,7 @@ public void removeSeries(XYSeries series) { * * @param series the series (zero based index). */ - public void removeSeries(int series) { + public void removeSeries(/*@NonNegative*/ int series) { // check arguments... if ((series < 0) || (series > getSeriesCount())) { diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index 155d0daa1..2e512bd5e 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -47,6 +47,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.Arrays; import java.util.Collections; @@ -184,7 +188,7 @@ public int getSeriesCount() { * @return The item count. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { if (series < 0 || series >= getSeriesCount()) { throw new IllegalArgumentException("Invalid series index: " + series); @@ -201,7 +205,7 @@ public int getItemCount(int series) { * @return The series key. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { if (series < 0 || series >= getSeriesCount()) { throw new IllegalArgumentException("Invalid series index: " + series); @@ -220,7 +224,7 @@ public Comparable getSeriesKey(int series) { * @return The x-value for the item within the series. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getX(); @@ -237,7 +241,7 @@ public Number getX(int series, int item) { * @return The y-value for the item within the series. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return getWindForce(series, item); } @@ -251,7 +255,7 @@ public Number getY(int series, int item) { * @return The wind direction for the item within the series. */ @Override - public Number getWindDirection(int series, int item) { + public Number getWindDirection(/*@NonNegative*/ int series, int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getWindDirection(); @@ -267,7 +271,7 @@ public Number getWindDirection(int series, int item) { * @return The wind force for the item within the series. */ @Override - public Number getWindForce(int series, int item) { + public Number getWindForce(/*@NonNegative*/ int series, int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getWindForce(); diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index 8f027540b..ff27ace01 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -43,6 +43,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -104,7 +108,7 @@ public int getSeriesCount() { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -148,7 +152,7 @@ public DomainOrder getDomainOrder() { * specified range. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -174,7 +178,7 @@ public int getItemCount(int series) { * @see #getX(int, int) */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[0][item]; } @@ -197,7 +201,7 @@ public double getXValue(int series, int item) { * @see #getXValue(int, int) */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Double(getXValue(series, item)); } @@ -219,7 +223,7 @@ public Number getX(int series, int item) { * @see #getY(int, int) */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[1][item]; } @@ -242,7 +246,7 @@ public double getYValue(int series, int item) { * @see #getX(int, int) */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return new Double(getYValue(series, item)); } diff --git a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java index 580cd05d4..9af8797b6 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java @@ -44,6 +44,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -105,7 +109,7 @@ public int getSeriesCount() { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -149,7 +153,7 @@ public DomainOrder getDomainOrder() { * specified range. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -175,7 +179,7 @@ public int getItemCount(int series) { * @see #getX(int, int) */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[0][item]; } @@ -198,7 +202,7 @@ public double getXValue(int series, int item) { * @see #getXValue(int, int) */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Double(getXValue(series, item)); } @@ -220,7 +224,7 @@ public Number getX(int series, int item) { * @see #getY(int, int) */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[1][item]; } @@ -243,7 +247,7 @@ public double getYValue(int series, int item) { * @see #getX(int, int) */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return new Double(getYValue(series, item)); } @@ -265,7 +269,7 @@ public Number getY(int series, int item) { * @see #getZ(int, int) */ @Override - public double getZValue(int series, int item) { + public double getZValue(/*@NonNegative*/ int series, int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[2][item]; } @@ -288,7 +292,7 @@ public double getZValue(int series, int item) { * @see #getZ(int, int) */ @Override - public Number getZ(int series, int item) { + public Number getZ(/*@NonNegative*/ int series, int item) { return new Double(getZValue(series, item)); } diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java index 8483e976c..f731b563c 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java @@ -43,6 +43,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * An extension of the {@link XYDataset} interface that allows an x-interval * and a y-interval to be defined. Note that the x and y values defined @@ -62,7 +66,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The lower bound of the x-interval ({@code null} permitted). */ - public Number getStartX(int series, int item); + public Number getStartX(/*@NonNegative*/ int series, int item); /** * Returns the lower bound of the x-interval (as a double primitive) for @@ -75,7 +79,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getStartX(int, int) */ - public double getStartXValue(int series, int item); + public double getStartXValue(/*@NonNegative*/ int series, int item); /** * Returns the upper bound of the x-interval for the specified series and @@ -87,7 +91,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The upper bound of the x-interval ({@code null} permitted). */ - public Number getEndX(int series, int item); + public Number getEndX(/*@NonNegative*/ int series, int item); /** * Returns the upper bound of the x-interval (as a double primitive) for @@ -100,7 +104,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getEndX(int, int) */ - public double getEndXValue(int series, int item); + public double getEndXValue(/*@NonNegative*/ int series, int item); /** * Returns the lower bound of the y-interval for the specified series and @@ -112,7 +116,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The lower bound of the y-interval ({@code null} permitted). */ - public Number getStartY(int series, int item); + public Number getStartY(/*@NonNegative*/ int series, int item); /** * Returns the lower bound of the y-interval (as a double primitive) for @@ -125,7 +129,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getStartY(int, int) */ - public double getStartYValue(int series, int item); + public double getStartYValue(/*@NonNegative*/ int series, int item); /** * Returns the upper bound of the y-interval for the specified series and @@ -137,7 +141,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The upper bound of the y-interval ({@code null} permitted). */ - public Number getEndY(int series, int item); + public Number getEndY(/*@NonNegative*/ int series, int item); /** * Returns the upper bound of the y-interval (as a double primitive) for @@ -150,6 +154,6 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getEndY(int, int) */ - public double getEndYValue(int series, int item); + public double getEndYValue(/*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java index d1c67ba55..ac0de9af9 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java @@ -53,6 +53,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import org.jfree.chart.HashUtils; @@ -257,7 +261,7 @@ public double getIntervalWidth() { * * @see #getStartXValue(int, int) */ - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { Number startX = null; Number x = this.dataset.getX(series, item); if (x != null) { @@ -277,7 +281,7 @@ public Number getStartX(int series, int item) { * * @see #getStartX(int, int) */ - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { return this.dataset.getXValue(series, item) - getIntervalPositionFactor() * getIntervalWidth(); } @@ -292,7 +296,7 @@ public double getStartXValue(int series, int item) { * * @see #getEndXValue(int, int) */ - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { Number endX = null; Number x = this.dataset.getX(series, item); if (x != null) { @@ -312,7 +316,7 @@ public Number getEndX(int series, int item) { * * @see #getEndX(int, int) */ - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { return this.dataset.getXValue(series, item) + (1.0 - getIntervalPositionFactor()) * getIntervalWidth(); } @@ -415,7 +419,7 @@ private double recalculateInterval() { * * @return The interval width. */ - private double calculateIntervalForSeries(int series) { + private double calculateIntervalForSeries(/*@NonNegative*/ int series) { double result = Double.POSITIVE_INFINITY; int itemCount = this.dataset.getItemCount(series); if (itemCount > 1) { diff --git a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java index 2a217747d..7ddef0513 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java @@ -40,6 +40,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * An extension of the {@link XYZDataset} interface that allows a range of data * to be defined for any of the X values, the Y values, and the Z values. @@ -54,7 +58,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting X value for the specified series and item. */ - public Number getStartXValue(int series, int item); + public Number getStartXValue(/*@NonNegative*/ int series, int item); /** * Returns the ending X value for the specified series and item. @@ -64,7 +68,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending X value for the specified series and item. */ - public Number getEndXValue(int series, int item); + public Number getEndXValue(/*@NonNegative*/ int series, int item); /** * Returns the starting Y value for the specified series and item. @@ -74,7 +78,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting Y value for the specified series and item. */ - public Number getStartYValue(int series, int item); + public Number getStartYValue(/*@NonNegative*/ int series, int item); /** * Returns the ending Y value for the specified series and item. @@ -84,7 +88,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending Y value for the specified series and item. */ - public Number getEndYValue(int series, int item); + public Number getEndYValue(/*@NonNegative*/ int series, int item); /** * Returns the starting Z value for the specified series and item. @@ -94,7 +98,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting Z value for the specified series and item. */ - public Number getStartZValue(int series, int item); + public Number getStartZValue(/*@NonNegative*/ int series, int item); /** * Returns the ending Z value for the specified series and item. @@ -104,6 +108,6 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending Z value for the specified series and item. */ - public Number getEndZValue(int series, int item); + public Number getEndZValue(/*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/data/xy/OHLCDataset.java b/src/main/java/org/jfree/data/xy/OHLCDataset.java index c75943223..a4ca8bf14 100644 --- a/src/main/java/org/jfree/data/xy/OHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/OHLCDataset.java @@ -48,6 +48,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * An interface that defines data in the form of (x, high, low, open, close) * tuples. @@ -62,7 +66,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getHigh(int series, int item); + public Number getHigh(/*@NonNegative*/ int series, int item); /** * Returns the high-value (as a double primitive) for an item within a @@ -73,7 +77,7 @@ public interface OHLCDataset extends XYDataset { * * @return The high-value. */ - public double getHighValue(int series, int item); + public double getHighValue(/*@NonNegative*/ int series, int item); /** * Returns the low-value for the specified series and item. @@ -83,7 +87,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getLow(int series, int item); + public Number getLow(/*@NonNegative*/ int series, int item); /** * Returns the low-value (as a double primitive) for an item within a @@ -94,7 +98,7 @@ public interface OHLCDataset extends XYDataset { * * @return The low-value. */ - public double getLowValue(int series, int item); + public double getLowValue(/*@NonNegative*/ int series, int item); /** * Returns the open-value for the specified series and item. @@ -104,7 +108,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getOpen(int series, int item); + public Number getOpen(/*@NonNegative*/ int series, int item); /** * Returns the open-value (as a double primitive) for an item within a @@ -115,7 +119,7 @@ public interface OHLCDataset extends XYDataset { * * @return The open-value. */ - public double getOpenValue(int series, int item); + public double getOpenValue(/*@NonNegative*/ int series, int item); /** * Returns the y-value for the specified series and item. @@ -125,7 +129,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getClose(int series, int item); + public Number getClose(/*@NonNegative*/ int series, int item); /** * Returns the close-value (as a double primitive) for an item within a @@ -136,7 +140,7 @@ public interface OHLCDataset extends XYDataset { * * @return The close-value. */ - public double getCloseValue(int series, int item); + public double getCloseValue(/*@NonNegative*/ int series, int item); /** * Returns the volume for the specified series and item. @@ -146,7 +150,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getVolume(int series, int item); + public Number getVolume(/*@NonNegative*/ int series, int item); /** * Returns the volume-value (as a double primitive) for an item within a @@ -157,6 +161,6 @@ public interface OHLCDataset extends XYDataset { * * @return The volume-value. */ - public double getVolumeValue(int series, int item); + public double getVolumeValue(/*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java index 5b838b37f..68b7dfcd0 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java @@ -45,6 +45,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.List; import org.jfree.chart.util.ObjectUtils; @@ -142,7 +146,7 @@ public int getSeriesCount() { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public VectorSeries getSeries(int series) { + public VectorSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -161,7 +165,7 @@ public VectorSeries getSeries(int series) { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getKey(); } @@ -190,7 +194,7 @@ public int indexOf(VectorSeries series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -204,7 +208,7 @@ public int getItemCount(int series) { * @return The x-value. */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getXValue(); @@ -221,7 +225,7 @@ public double getXValue(int series, int item) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return new Double(getXValue(series, item)); } @@ -234,7 +238,7 @@ public Number getX(int series, int item) { * @return The y-value. */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getYValue(); @@ -251,7 +255,7 @@ public double getYValue(int series, int item) { * @return The y-value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return new Double(getYValue(series, item)); } @@ -264,7 +268,7 @@ public Number getY(int series, int item) { * @return The vector (possibly {@code null}). */ @Override - public Vector getVector(int series, int item) { + public Vector getVector(/*@NonNegative*/ int series, int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVector(); @@ -279,7 +283,7 @@ public Vector getVector(int series, int item) { * @return The x-component of the vector. */ @Override - public double getVectorXValue(int series, int item) { + public double getVectorXValue(/*@NonNegative*/ int series, int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVectorX(); @@ -294,7 +298,7 @@ public double getVectorXValue(int series, int item) { * @return The y-component of the vector. */ @Override - public double getVectorYValue(int series, int item) { + public double getVectorYValue(/*@NonNegative*/ int series, int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVectorY(); diff --git a/src/main/java/org/jfree/data/xy/VectorXYDataset.java b/src/main/java/org/jfree/data/xy/VectorXYDataset.java index 6d170722b..e4c88d97b 100644 --- a/src/main/java/org/jfree/data/xy/VectorXYDataset.java +++ b/src/main/java/org/jfree/data/xy/VectorXYDataset.java @@ -44,6 +44,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * An extension of the {@link XYDataset} interface that allows a vector to be * defined at a specific (x, y) location. @@ -60,7 +64,7 @@ public interface VectorXYDataset extends XYDataset { * * @return The x-component of the vector. */ - public double getVectorXValue(int series, int item); + public double getVectorXValue(/*@NonNegative*/ int series, int item); /** * Returns the y-component of the vector for an item in a series. @@ -70,7 +74,7 @@ public interface VectorXYDataset extends XYDataset { * * @return The y-component of the vector. */ - public double getVectorYValue(int series, int item); + public double getVectorYValue(/*@NonNegative*/ int series, int item); /** * Returns the vector for an item in a series. Depending on the particular @@ -84,6 +88,6 @@ public interface VectorXYDataset extends XYDataset { * * @return The vector (possibly {@code null}). */ - public Vector getVector(int series, int item); + public Vector getVector(/*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/data/xy/WindDataset.java b/src/main/java/org/jfree/data/xy/WindDataset.java index 0d59ef22b..36b71d31c 100644 --- a/src/main/java/org/jfree/data/xy/WindDataset.java +++ b/src/main/java/org/jfree/data/xy/WindDataset.java @@ -41,6 +41,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * Interface for a dataset that supplies wind intensity and direction values * observed at various points in time. @@ -58,7 +62,7 @@ public interface WindDataset extends XYDataset { * * @return The wind direction. */ - public Number getWindDirection(int series, int item); + public Number getWindDirection(/*@NonNegative*/ int series, int item); /** * Returns the wind force on the Beaufort scale (0 to 12). See: @@ -72,6 +76,6 @@ public interface WindDataset extends XYDataset { * * @return The wind force. */ - public Number getWindForce(int series, int item); + public Number getWindForce(/*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java index 36ce99a37..cf8d6227b 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java @@ -44,6 +44,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.List; import org.jfree.chart.util.ObjectUtils; @@ -105,7 +109,7 @@ public int getSeriesCount() { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public XIntervalSeries getSeries(int series) { + public XIntervalSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -124,7 +128,7 @@ public XIntervalSeries getSeries(int series) { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getKey(); } @@ -140,7 +144,7 @@ public Comparable getSeriesKey(int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -154,7 +158,7 @@ public int getItemCount(int series) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return di.getX(); @@ -170,7 +174,7 @@ public Number getX(int series, int item) { * @return The value. */ @Override - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getXLowValue(item); } @@ -185,7 +189,7 @@ public double getStartXValue(int series, int item) { * @return The value. */ @Override - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getXHighValue(item); } @@ -200,7 +204,7 @@ public double getEndXValue(int series, int item) { * @return The value. */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -214,7 +218,7 @@ public double getYValue(int series, int item) { * @return The y-value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getYValue()); @@ -229,7 +233,7 @@ public Number getY(int series, int item) { * @return The x-value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getXLowValue()); @@ -244,7 +248,7 @@ public Number getStartX(int series, int item) { * @return The x-value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getXHighValue()); @@ -260,7 +264,7 @@ public Number getEndX(int series, int item) { * @return The start y-value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -274,7 +278,7 @@ public Number getStartY(int series, int item) { * @return The end y-value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -286,7 +290,7 @@ public Number getEndY(int series, int item) { * * @since 1.0.10 */ - public void removeSeries(int series) { + public void removeSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds."); } diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index 5763f1cc1..4cb120e4b 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -49,6 +49,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.chart.util.PublicCloneable; import org.jfree.data.general.DatasetChangeEvent; import org.jfree.data.general.DatasetChangeListener; @@ -135,7 +139,7 @@ public int getSeriesCount() { * @return The series key. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { return this.underlying.getSeriesKey(series); } @@ -147,7 +151,7 @@ public Comparable getSeriesKey(int series) { * @return The item count. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getItemCount(series); } @@ -162,7 +166,7 @@ public int getItemCount(int series) { * @see #getXValue(int, int) */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { return this.underlying.getX(series, item); } @@ -177,7 +181,7 @@ public Number getX(int series, int item) { * @see #getX(int, int) */ @Override - public double getXValue(int series, int item) { + public double getXValue(/*@NonNegative*/ int series, int item) { return this.underlying.getXValue(series, item); } @@ -192,7 +196,7 @@ public double getXValue(int series, int item) { * @see #getYValue(int, int) */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return this.underlying.getY(series, item); } @@ -207,7 +211,7 @@ public Number getY(int series, int item) { * @see #getY(int, int) */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { return this.underlying.getYValue(series, item); } @@ -220,7 +224,7 @@ public double getYValue(int series, int item) { * @return The value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { Number result = null; Number xnum = this.underlying.getX(series, item); if (xnum != null) { @@ -241,7 +245,7 @@ public Number getStartX(int series, int item) { * @see #getXValue(int, int) */ @Override - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { return getXValue(series, item) - this.barWidth / 2.0; } @@ -254,7 +258,7 @@ public double getStartXValue(int series, int item) { * @return The value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { Number result = null; Number xnum = this.underlying.getX(series, item); if (xnum != null) { @@ -275,7 +279,7 @@ public Number getEndX(int series, int item) { * @see #getXValue(int, int) */ @Override - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { return getXValue(series, item) + this.barWidth / 2.0; } @@ -288,7 +292,7 @@ public double getEndXValue(int series, int item) { * @return The value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return this.underlying.getY(series, item); } @@ -304,7 +308,7 @@ public Number getStartY(int series, int item) { * @see #getYValue(int, int) */ @Override - public double getStartYValue(int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, int item) { return getYValue(series, item); } @@ -317,7 +321,7 @@ public double getStartYValue(int series, int item) { * @return The value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return this.underlying.getY(series, item); } @@ -333,7 +337,7 @@ public Number getEndY(int series, int item) { * @see #getYValue(int, int) */ @Override - public double getEndYValue(int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, int item) { return getYValue(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYDataset.java b/src/main/java/org/jfree/data/xy/XYDataset.java index 4306de7dc..d43b75a84 100644 --- a/src/main/java/org/jfree/data/xy/XYDataset.java +++ b/src/main/java/org/jfree/data/xy/XYDataset.java @@ -47,6 +47,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import org.jfree.data.DomainOrder; import org.jfree.data.general.SeriesDataset; @@ -74,7 +78,7 @@ public interface XYDataset extends SeriesDataset { * * @return The item count. */ - public int getItemCount(int series); + public int getItemCount(/*@NonNegative*/ int series); /** * Returns the x-value for an item within a series. The x-values may or @@ -88,7 +92,7 @@ public interface XYDataset extends SeriesDataset { * * @return The x-value (never {@code null}). */ - public Number getX(int series, int item); + public Number getX(/*@NonNegative*/ int series, int item); /** * Returns the x-value for an item within a series. @@ -100,7 +104,7 @@ public interface XYDataset extends SeriesDataset { * * @return The x-value. */ - public double getXValue(int series, int item); + public double getXValue(/*@NonNegative*/ int series, int item); /** * Returns the y-value for an item within a series. @@ -112,7 +116,7 @@ public interface XYDataset extends SeriesDataset { * * @return The y-value (possibly {@code null}). */ - public Number getY(int series, int item); + public Number getY(/*@NonNegative*/ int series, int item); /** * Returns the y-value (as a double primitive) for an item within a series. @@ -124,6 +128,6 @@ public interface XYDataset extends SeriesDataset { * * @return The y-value. */ - public double getYValue(int series, int item); + public double getYValue(/*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java index 13efceff2..a276f575e 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java @@ -46,6 +46,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.List; import org.jfree.chart.util.ObjectUtils; @@ -107,7 +111,7 @@ public int getSeriesCount() { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public XYIntervalSeries getSeries(int series) { + public XYIntervalSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -126,7 +130,7 @@ public XYIntervalSeries getSeries(int series) { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getKey(); } @@ -142,7 +146,7 @@ public Comparable getSeriesKey(int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -156,7 +160,7 @@ public int getItemCount(int series) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getX(item); } @@ -171,7 +175,7 @@ public Number getX(int series, int item) { * @return The value. */ @Override - public double getStartXValue(int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getXLowValue(item); } @@ -186,7 +190,7 @@ public double getStartXValue(int series, int item) { * @return The value. */ @Override - public double getEndXValue(int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getXHighValue(item); } @@ -201,7 +205,7 @@ public double getEndXValue(int series, int item) { * @return The value. */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -216,7 +220,7 @@ public double getYValue(int series, int item) { * @return The value. */ @Override - public double getStartYValue(int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYLowValue(item); } @@ -231,7 +235,7 @@ public double getStartYValue(int series, int item) { * @return The value. */ @Override - public double getEndYValue(int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYHighValue(item); } @@ -245,7 +249,7 @@ public double getEndYValue(int series, int item) { * @return The y-value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { return new Double(getYValue(series, item)); } @@ -258,7 +262,7 @@ public Number getY(int series, int item) { * @return The x-value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return new Double(getStartXValue(series, item)); } @@ -271,7 +275,7 @@ public Number getStartX(int series, int item) { * @return The x-value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return new Double(getEndXValue(series, item)); } @@ -285,7 +289,7 @@ public Number getEndX(int series, int item) { * @return The start y-value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return new Double(getStartYValue(series, item)); } @@ -299,7 +303,7 @@ public Number getStartY(int series, int item) { * @return The end y-value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return new Double(getEndYValue(series, item)); } @@ -311,7 +315,7 @@ public Number getEndY(int series, int item) { * * @since 1.0.10 */ - public void removeSeries(int series) { + public void removeSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds."); } diff --git a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java index a55625036..02e7ef808 100644 --- a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java @@ -65,6 +65,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; @@ -170,7 +174,7 @@ public void addSeries(XYSeries series) { * * @param series the series index (zero-based). */ - public void removeSeries(int series) { + public void removeSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds."); } @@ -258,7 +262,7 @@ public int indexOf(XYSeries series) { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public XYSeries getSeries(int series) { + public XYSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -301,7 +305,7 @@ public XYSeries getSeries(Comparable key) { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getKey(); } @@ -339,7 +343,7 @@ public int getSeriesIndex(Comparable key) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -353,7 +357,7 @@ public int getItemCount(int series) { * @return The value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { XYSeries s = (XYSeries) this.data.get(series); return s.getX(item); } @@ -367,7 +371,7 @@ public Number getX(int series, int item) { * @return The starting X value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return this.intervalDelegate.getStartX(series, item); } @@ -380,7 +384,7 @@ public Number getStartX(int series, int item) { * @return The ending X value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return this.intervalDelegate.getEndX(series, item); } @@ -393,7 +397,7 @@ public Number getEndX(int series, int item) { * @return The value (possibly {@code null}). */ @Override - public Number getY(int series, int index) { + public Number getY(/*@NonNegative*/ int series, int index) { XYSeries s = (XYSeries) this.data.get(series); return s.getY(index); } @@ -407,7 +411,7 @@ public Number getY(int series, int index) { * @return The starting Y value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { return getY(series, item); } @@ -420,7 +424,7 @@ public Number getStartY(int series, int item) { * @return The ending Y value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYZDataset.java b/src/main/java/org/jfree/data/xy/XYZDataset.java index 15adba35f..ef321e512 100644 --- a/src/main/java/org/jfree/data/xy/XYZDataset.java +++ b/src/main/java/org/jfree/data/xy/XYZDataset.java @@ -43,6 +43,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * The interface through which JFreeChart obtains data in the form of (x, y, z) * items - used for XY and XYZ plots. @@ -57,7 +61,7 @@ public interface XYZDataset extends XYDataset { * * @return The z-value (possibly {@code null}). */ - public Number getZ(int series, int item); + public Number getZ(/*@NonNegative*/ int series, int item); /** * Returns the z-value (as a double primitive) for an item within a series. @@ -67,6 +71,6 @@ public interface XYZDataset extends XYDataset { * * @return The z-value. */ - public double getZValue(int series, int item); + public double getZValue(/*@NonNegative*/ int series, int item); } diff --git a/src/main/java/org/jfree/data/xy/XisSymbolic.java b/src/main/java/org/jfree/data/xy/XisSymbolic.java index 5ae72153e..b1cc9d344 100644 --- a/src/main/java/org/jfree/data/xy/XisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/XisSymbolic.java @@ -42,6 +42,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * Represent a data set where X is a symbolic values. Each symbolic value is * linked with an Integer. @@ -64,7 +68,7 @@ public interface XisSymbolic { * * @return The symbolic value. */ - public String getXSymbolicValue(int series, int item); + public String getXSymbolicValue(/*@NonNegative*/ int series, int item); /** * Returns the symbolic value linked with the specified {@code Integer}. diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java index c136cf57b..31593d238 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java @@ -46,6 +46,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + import java.io.Serializable; import java.util.List; import org.jfree.chart.util.ObjectUtils; @@ -107,7 +111,7 @@ public int getSeriesCount() { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public YIntervalSeries getSeries(int series) { + public YIntervalSeries getSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -126,7 +130,7 @@ public YIntervalSeries getSeries(int series) { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getKey(); } @@ -142,7 +146,7 @@ public Comparable getSeriesKey(int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(int series) { + public int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -156,7 +160,7 @@ public int getItemCount(int series) { * @return The x-value. */ @Override - public Number getX(int series, int item) { + public Number getX(/*@NonNegative*/ int series, int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getX(item); } @@ -171,7 +175,7 @@ public Number getX(int series, int item) { * @return The value. */ @Override - public double getYValue(int series, int item) { + public double getYValue(/*@NonNegative*/ int series, int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -186,7 +190,7 @@ public double getYValue(int series, int item) { * @return The value. */ @Override - public double getStartYValue(int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYLowValue(item); } @@ -201,7 +205,7 @@ public double getStartYValue(int series, int item) { * @return The value. */ @Override - public double getEndYValue(int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYHighValue(item); } @@ -215,7 +219,7 @@ public double getEndYValue(int series, int item) { * @return The y-value. */ @Override - public Number getY(int series, int item) { + public Number getY(/*@NonNegative*/ int series, int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYValue(item)); } @@ -230,7 +234,7 @@ public Number getY(int series, int item) { * @return The x-value. */ @Override - public Number getStartX(int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, int item) { return getX(series, item); } @@ -244,7 +248,7 @@ public Number getStartX(int series, int item) { * @return The x-value. */ @Override - public Number getEndX(int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, int item) { return getX(series, item); } @@ -257,7 +261,7 @@ public Number getEndX(int series, int item) { * @return The start y-value. */ @Override - public Number getStartY(int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYLowValue(item)); } @@ -271,7 +275,7 @@ public Number getStartY(int series, int item) { * @return The end y-value. */ @Override - public Number getEndY(int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYHighValue(item)); } @@ -284,7 +288,7 @@ public Number getEndY(int series, int item) { * * @since 1.0.10 */ - public void removeSeries(int series) { + public void removeSeries(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds."); } diff --git a/src/main/java/org/jfree/data/xy/YisSymbolic.java b/src/main/java/org/jfree/data/xy/YisSymbolic.java index bd5763e39..0613ce740 100644 --- a/src/main/java/org/jfree/data/xy/YisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/YisSymbolic.java @@ -43,6 +43,10 @@ package org.jfree.data.xy; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; + */ + /** * Represent a data set where Y is a symbolic values. Each symbolic value is * linked with an Integer. @@ -65,7 +69,7 @@ public interface YisSymbolic { * * @return The symbolic value. */ - public String getYSymbolicValue(int series, int item); + public String getYSymbolicValue(/*@NonNegative*/ int series, int item); /** * Returns the symbolic value linked with the specified {@code Integer}. diff --git a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java index 9782119e6..a164fecc9 100644 --- a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java +++ b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java @@ -428,7 +428,7 @@ public Object clone() throws CloneNotSupportedException { } @Override - public Number getStartValue(int series, int category) { + public Number getStartValue(/*@NonNegative*/ int series, int category) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(series, category); if (item == null) { @@ -448,7 +448,7 @@ public Number getStartValue(Comparable series, Comparable category) { } @Override - public Number getEndValue(int series, int category) { + public Number getEndValue(/*@NonNegative*/ int series, int category) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(series, category); if (item == null) { From 0c859934119abbe437e74a619c9c2297ed34a7b3 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Wed, 29 Nov 2017 09:33:29 -0800 Subject: [PATCH 05/79] more annotations --- src/main/java/org/jfree/chart/JFreeChart.java | 7 +- src/main/java/org/jfree/chart/LegendItem.java | 6 +- .../org/jfree/chart/LegendItemCollection.java | 3 +- .../java/org/jfree/chart/axis/ValueAxis.java | 3 +- .../jfree/chart/entity/EntityCollection.java | 3 +- .../jfree/chart/entity/PieSectionEntity.java | 5 +- .../entity/StandardEntityCollection.java | 3 +- .../chart/entity/XYAnnotationEntity.java | 3 +- .../org/jfree/chart/entity/XYItemEntity.java | 2 +- .../plot/AbstractPieLabelDistributor.java | 3 +- .../org/jfree/chart/plot/CategoryPlot.java | 121 +++++++++--------- .../org/jfree/chart/plot/CrosshairState.java | 3 +- .../java/org/jfree/chart/plot/PiePlot.java | 3 +- .../jfree/chart/plot/PlotRenderingInfo.java | 3 +- .../java/org/jfree/chart/plot/PolarPlot.java | 10 +- .../java/org/jfree/chart/plot/XYPlot.java | 103 +++++++-------- .../org/jfree/chart/plot/dial/DialPlot.java | 15 ++- .../jfree/chart/plot/dial/DialPointer.java | 3 +- .../chart/plot/dial/DialValueIndicator.java | 3 +- .../chart/plot/dial/StandardDialRange.java | 3 +- .../AbstractCategoryItemRenderer.java | 4 +- .../category/StackedAreaRenderer.java | 3 +- .../renderer/xy/StackedXYAreaRenderer.java | 3 +- .../renderer/xy/StackedXYAreaRenderer2.java | 3 +- .../renderer/xy/StandardXYItemRenderer.java | 4 +- .../chart/title/LegendItemBlockContainer.java | 2 +- .../jfree/chart/util/AbstractObjectList.java | 2 +- .../org/jfree/chart/util/BooleanList.java | 5 +- .../java/org/jfree/chart/util/ObjectList.java | 2 +- .../java/org/jfree/chart/util/ShapeList.java | 5 +- .../jfree/data/ComparableObjectSeries.java | 7 +- .../org/jfree/data/DefaultKeyedValues.java | 5 +- .../java/org/jfree/data/KeyedObjects.java | 5 +- src/main/java/org/jfree/data/KeyedValues.java | 3 +- src/main/java/org/jfree/data/Values.java | 3 +- .../data/category/CategoryToPieDataset.java | 3 +- src/main/java/org/jfree/data/gantt/Task.java | 3 +- .../java/org/jfree/data/gantt/TaskSeries.java | 3 +- .../data/gantt/TaskSeriesCollection.java | 4 +- .../time/DynamicTimeSeriesCollection.java | 6 +- .../org/jfree/data/time/TimePeriodValues.java | 11 +- .../data/time/TimePeriodValuesCollection.java | 2 +- .../java/org/jfree/data/time/TimeSeries.java | 11 +- .../jfree/data/time/TimeSeriesCollection.java | 2 +- .../org/jfree/data/time/ohlc/OHLCSeries.java | 7 +- .../data/time/ohlc/OHLCSeriesCollection.java | 2 +- .../jfree/data/xy/DefaultTableXYDataset.java | 2 +- .../java/org/jfree/data/xy/VectorSeries.java | 13 +- .../org/jfree/data/xy/XIntervalSeries.java | 11 +- .../org/jfree/data/xy/XYIntervalSeries.java | 15 ++- src/main/java/org/jfree/data/xy/XYSeries.java | 13 +- .../org/jfree/data/xy/XYSeriesCollection.java | 2 +- .../org/jfree/data/xy/YIntervalSeries.java | 11 +- 53 files changed, 261 insertions(+), 221 deletions(-) diff --git a/src/main/java/org/jfree/chart/JFreeChart.java b/src/main/java/org/jfree/chart/JFreeChart.java index 0a6201898..9d783d1e7 100644 --- a/src/main/java/org/jfree/chart/JFreeChart.java +++ b/src/main/java/org/jfree/chart/JFreeChart.java @@ -154,6 +154,7 @@ */ package org.jfree.chart; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -714,7 +715,7 @@ public LegendTitle getLegend() { * * @see #addLegend(LegendTitle) */ - public LegendTitle getLegend(int index) { + public LegendTitle getLegend(/*@NonNegative*/ int index) { int seen = 0; Iterator iterator = this.subtitles.iterator(); while (iterator.hasNext()) { @@ -798,7 +799,7 @@ public int getSubtitleCount() { * * @see #addSubtitle(Title) */ - public Title getSubtitle(int index) { + public Title getSubtitle(/*@NonNegative*/ int index) { if ((index < 0) || (index >= getSubtitleCount())) { throw new IllegalArgumentException("Index out of range."); } @@ -829,7 +830,7 @@ public void addSubtitle(Title subtitle) { * * @since 1.0.6 */ - public void addSubtitle(int index, Title subtitle) { + public void addSubtitle(/*@NonNegative*/ int index, Title subtitle) { if (index < 0 || index > getSubtitleCount()) { throw new IllegalArgumentException( "The 'index' argument is out of range."); diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index ae39da2a2..38a6e4fa9 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -575,7 +575,7 @@ public int getDatasetIndex() { * * @see #getDatasetIndex() */ - public void setDatasetIndex(int index) { + public void setDatasetIndex(/*@NonNegative*/ int index) { this.datasetIndex = index; } @@ -610,7 +610,7 @@ public void setSeriesKey(Comparable key) { * * @since 1.0.2 */ - public int getSeriesIndex() { + public /*@NonNegative*/ int getSeriesIndex() { return this.series; } @@ -621,7 +621,7 @@ public int getSeriesIndex() { * * @since 1.0.2 */ - public void setSeriesIndex(int index) { + public void setSeriesIndex(/*@NonNegative*/ int index) { this.series = index; } diff --git a/src/main/java/org/jfree/chart/LegendItemCollection.java b/src/main/java/org/jfree/chart/LegendItemCollection.java index 84dd2b96b..f17067bf1 100644 --- a/src/main/java/org/jfree/chart/LegendItemCollection.java +++ b/src/main/java/org/jfree/chart/LegendItemCollection.java @@ -44,6 +44,7 @@ */ package org.jfree.chart; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Iterator; @@ -94,7 +95,7 @@ public void addAll(LegendItemCollection collection) { * * @return The legend item. */ - public LegendItem get(int index) { + public LegendItem get(/*@NonNegative*/ int index) { return (LegendItem) this.items.get(index); } diff --git a/src/main/java/org/jfree/chart/axis/ValueAxis.java b/src/main/java/org/jfree/chart/axis/ValueAxis.java index 9b19367a7..c4734a4fd 100644 --- a/src/main/java/org/jfree/chart/axis/ValueAxis.java +++ b/src/main/java/org/jfree/chart/axis/ValueAxis.java @@ -113,6 +113,7 @@ */ package org.jfree.chart.axis; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /*>>> import org.checkerframework.common.value.qual.ArrayLen; @@ -1659,7 +1660,7 @@ protected int getAutoTickIndex() { * * @see #getAutoTickIndex() */ - protected void setAutoTickIndex(int index) { + protected void setAutoTickIndex(/*@NonNegative*/ int index) { this.autoTickIndex = index; } diff --git a/src/main/java/org/jfree/chart/entity/EntityCollection.java b/src/main/java/org/jfree/chart/entity/EntityCollection.java index a923881a0..a031d139b 100644 --- a/src/main/java/org/jfree/chart/entity/EntityCollection.java +++ b/src/main/java/org/jfree/chart/entity/EntityCollection.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.entity; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collection; import java.util.Iterator; @@ -92,7 +93,7 @@ public interface EntityCollection { * * @return An entity. */ - public ChartEntity getEntity(int index); + public ChartEntity getEntity(/*@NonNegative*/ int index); /** * Returns the entity count. diff --git a/src/main/java/org/jfree/chart/entity/PieSectionEntity.java b/src/main/java/org/jfree/chart/entity/PieSectionEntity.java index 9551c185a..fdc9b8fa1 100644 --- a/src/main/java/org/jfree/chart/entity/PieSectionEntity.java +++ b/src/main/java/org/jfree/chart/entity/PieSectionEntity.java @@ -53,6 +53,7 @@ */ package org.jfree.chart.entity; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Shape; import java.io.Serializable; @@ -149,7 +150,7 @@ public int getPieIndex() { * * @see #getPieIndex() */ - public void setPieIndex(int index) { + public void setPieIndex(/*@NonNegative*/ int index) { this.pieIndex = index; } @@ -171,7 +172,7 @@ public int getSectionIndex() { * * @see #getSectionIndex() */ - public void setSectionIndex(int index) { + public void setSectionIndex(/*@NonNegative*/ int index) { this.sectionIndex = index; } diff --git a/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java b/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java index 683bd2a14..8732629dd 100644 --- a/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java +++ b/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java @@ -49,6 +49,7 @@ */ package org.jfree.chart.entity; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Collection; @@ -98,7 +99,7 @@ public int getEntityCount() { * @see #add(ChartEntity) */ @Override - public ChartEntity getEntity(int index) { + public ChartEntity getEntity(/*@NonNegative*/ int index) { return (ChartEntity) this.entities.get(index); } diff --git a/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java b/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java index d1e29cead..59319e29e 100644 --- a/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.entity; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Shape; import java.io.Serializable; @@ -84,7 +85,7 @@ public int getRendererIndex() { * * @param index the item index (zero-based). */ - public void setRendererIndex(int index) { + public void setRendererIndex(/*@NonNegative*/ int index) { this.rendererIndex = index; } diff --git a/src/main/java/org/jfree/chart/entity/XYItemEntity.java b/src/main/java/org/jfree/chart/entity/XYItemEntity.java index de4aa78d5..02933b47f 100644 --- a/src/main/java/org/jfree/chart/entity/XYItemEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYItemEntity.java @@ -118,7 +118,7 @@ public void setDataset(XYDataset dataset) { * * @return The series index. */ - public int getSeriesIndex() { + public /*@NonNegative*/ int getSeriesIndex() { return this.series; } diff --git a/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java b/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java index 20bb0dd4d..c059b86b5 100644 --- a/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java +++ b/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.List; @@ -70,7 +71,7 @@ public AbstractPieLabelDistributor() { * * @return The label record. */ - public PieLabelRecord getPieLabelRecord(int index) { + public PieLabelRecord getPieLabelRecord(/*@NonNegative*/ int index) { return (PieLabelRecord) this.labels.get(index); } diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 02c9cc5f1..0d94ff486 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -186,6 +186,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -327,10 +328,10 @@ public class CategoryPlot extends Plot implements ValueAxisPlot, Pannable, private RectangleInsets axisOffset; /** Storage for the domain axes. */ - private Map domainAxes; + private Map domainAxes; /** Storage for the domain axis locations. */ - private Map domainAxisLocations; + private Map domainAxisLocations; /** * A flag that controls whether or not the shared domain axis is drawn @@ -339,30 +340,30 @@ public class CategoryPlot extends Plot implements ValueAxisPlot, Pannable, private boolean drawSharedDomainAxis; /** Storage for the range axes. */ - private Map rangeAxes; + private Map rangeAxes; /** Storage for the range axis locations. */ - private Map rangeAxisLocations; + private Map rangeAxisLocations; /** Storage for the datasets. */ - private Map datasets; + private Map datasets; /** * Storage for keys that map each dataset to one or more domain axes. * Typically a dataset is rendered using the scale of a single axis, but * a dataset can contribute to the "auto-range" of any number of axes. */ - private TreeMap> datasetToDomainAxesMap; + private TreeMap> datasetToDomainAxesMap; /** * Storage for keys that map each dataset to one or more range axes. * Typically a dataset is rendered using the scale of a single axis, but * a dataset can contribute to the "auto-range" of any number of axes. */ - private TreeMap> datasetToRangeAxesMap; + private TreeMap> datasetToRangeAxesMap; /** Storage for the renderers. */ - private Map renderers; + private Map renderers; /** The dataset rendering order. */ private DatasetRenderingOrder renderingOrder @@ -757,7 +758,7 @@ public CategoryAxis getDomainAxis() { * * @see #setDomainAxis(int, CategoryAxis) */ - public CategoryAxis getDomainAxis(int index) { + public CategoryAxis getDomainAxis(/*@NonNegative*/ int index) { CategoryAxis result = (CategoryAxis) this.domainAxes.get(index); if (result == null) { Plot parent = getParent(); @@ -790,7 +791,7 @@ public void setDomainAxis(CategoryAxis axis) { * * @see #getDomainAxis(int) */ - public void setDomainAxis(int index, CategoryAxis axis) { + public void setDomainAxis(/*@NonNegative*/ int index, CategoryAxis axis) { setDomainAxis(index, axis, true); } @@ -802,7 +803,7 @@ public void setDomainAxis(int index, CategoryAxis axis) { * @param axis the axis ({@code null} permitted). * @param notify notify listeners? */ - public void setDomainAxis(int index, CategoryAxis axis, boolean notify) { + public void setDomainAxis(/*@NonNegative*/ int index, CategoryAxis axis, boolean notify) { CategoryAxis existing = (CategoryAxis) this.domainAxes.get(index); if (existing != null) { existing.removeChangeListener(this); @@ -848,7 +849,7 @@ public void setDomainAxes(CategoryAxis[] axes) { * * @since 1.0.3 */ - public int getDomainAxisIndex(CategoryAxis axis) { + public /*@GTENegativeOne*/ int getDomainAxisIndex(CategoryAxis axis) { Args.nullNotPermitted(axis, "axis"); for (Entry entry : this.domainAxes.entrySet()) { if (entry.getValue() == axis) { @@ -878,7 +879,7 @@ public AxisLocation getDomainAxisLocation() { * * @see #setDomainAxisLocation(int, AxisLocation) */ - public AxisLocation getDomainAxisLocation(int index) { + public AxisLocation getDomainAxisLocation(/*@NonNegative*/ int index) { AxisLocation result = this.domainAxisLocations.get(index); if (result == null) { result = AxisLocation.getOpposite(getDomainAxisLocation(0)); @@ -922,7 +923,7 @@ public void setDomainAxisLocation(AxisLocation location, boolean notify) { * @see #getDomainAxisLocation(int) * @see #setRangeAxisLocation(int, AxisLocation) */ - public void setDomainAxisLocation(int index, AxisLocation location) { + public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation location) { // delegate... setDomainAxisLocation(index, location, true); } @@ -940,7 +941,7 @@ public void setDomainAxisLocation(int index, AxisLocation location) { * @see #getDomainAxisLocation(int) * @see #setRangeAxisLocation(int, AxisLocation, boolean) */ - public void setDomainAxisLocation(int index, AxisLocation location, + public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation location, boolean notify) { if (index == 0 && location == null) { throw new IllegalArgumentException( @@ -969,7 +970,7 @@ public RectangleEdge getDomainAxisEdge() { * * @return The edge (never {@code null}). */ - public RectangleEdge getDomainAxisEdge(int index) { + public RectangleEdge getDomainAxisEdge(/*@NonNegative*/ int index) { RectangleEdge result; AxisLocation location = getDomainAxisLocation(index); if (location != null) { @@ -985,7 +986,7 @@ public RectangleEdge getDomainAxisEdge(int index) { * * @return The axis count. */ - public int getDomainAxisCount() { + public /*@NonNegative*/ int getDomainAxisCount() { return this.domainAxes.size(); } @@ -1032,7 +1033,7 @@ public ValueAxis getRangeAxis() { * * @return The axis ({@code null} possible). */ - public ValueAxis getRangeAxis(int index) { + public ValueAxis getRangeAxis(/*@NonNegative*/ int index) { ValueAxis result = this.rangeAxes.get(index); if (result == null) { Plot parent = getParent(); @@ -1061,7 +1062,7 @@ public void setRangeAxis(ValueAxis axis) { * @param index the axis index. * @param axis the axis. */ - public void setRangeAxis(int index, ValueAxis axis) { + public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis) { setRangeAxis(index, axis, true); } @@ -1073,7 +1074,7 @@ public void setRangeAxis(int index, ValueAxis axis) { * @param axis the axis. * @param notify notify listeners? */ - public void setRangeAxis(int index, ValueAxis axis, boolean notify) { + public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis, boolean notify) { ValueAxis existing = this.rangeAxes.get(index); if (existing != null) { existing.removeChangeListener(this); @@ -1119,7 +1120,7 @@ public void setRangeAxes(ValueAxis[] axes) { * * @since 1.0.7 */ - public int getRangeAxisIndex(ValueAxis axis) { + public /*@GTENegativeOne*/ int getRangeAxisIndex(ValueAxis axis) { Args.nullNotPermitted(axis, "axis"); int result = findRangeAxisIndex(axis); if (result < 0) { // try the parent plot @@ -1159,7 +1160,7 @@ public AxisLocation getRangeAxisLocation() { * * @see #setRangeAxisLocation(int, AxisLocation) */ - public AxisLocation getRangeAxisLocation(int index) { + public AxisLocation getRangeAxisLocation(/*@NonNegative*/ int index) { AxisLocation result = this.rangeAxisLocations.get(index); if (result == null) { result = AxisLocation.getOpposite(getRangeAxisLocation(0)); @@ -1204,7 +1205,7 @@ public void setRangeAxisLocation(AxisLocation location, boolean notify) { * @see #getRangeAxisLocation(int) * @see #setRangeAxisLocation(int, AxisLocation, boolean) */ - public void setRangeAxisLocation(int index, AxisLocation location) { + public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation location) { setRangeAxisLocation(index, location, true); } @@ -1219,7 +1220,7 @@ public void setRangeAxisLocation(int index, AxisLocation location) { * @see #getRangeAxisLocation(int) * @see #setDomainAxisLocation(int, AxisLocation, boolean) */ - public void setRangeAxisLocation(int index, AxisLocation location, + public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation location, boolean notify) { if (index == 0 && location == null) { throw new IllegalArgumentException( @@ -1247,7 +1248,7 @@ public RectangleEdge getRangeAxisEdge() { * * @return The edge. */ - public RectangleEdge getRangeAxisEdge(int index) { + public RectangleEdge getRangeAxisEdge(/*@NonNegative*/ int index) { AxisLocation location = getRangeAxisLocation(index); return Plot.resolveRangeAxisLocation(location, this.orientation); } @@ -1257,7 +1258,7 @@ public RectangleEdge getRangeAxisEdge(int index) { * * @return The axis count. */ - public int getRangeAxisCount() { + public /*@NonNegative*/ int getRangeAxisCount() { return this.rangeAxes.size(); } @@ -1307,7 +1308,7 @@ public CategoryDataset getDataset() { * * @see #setDataset(int, CategoryDataset) */ - public CategoryDataset getDataset(int index) { + public CategoryDataset getDataset(/*@NonNegative*/ int index) { return this.datasets.get(index); } @@ -1335,7 +1336,7 @@ public void setDataset(CategoryDataset dataset) { * * @see #getDataset(int) */ - public void setDataset(int index, CategoryDataset dataset) { + public void setDataset(/*@NonNegative*/ int index, CategoryDataset dataset) { CategoryDataset existing = (CategoryDataset) this.datasets.get(index); if (existing != null) { existing.removeChangeListener(this); @@ -1356,7 +1357,7 @@ public void setDataset(int index, CategoryDataset dataset) { * * @since 1.0.2 */ - public int getDatasetCount() { + public /*@NonNegative*/ int getDatasetCount() { return this.datasets.size(); } @@ -1370,7 +1371,7 @@ public int getDatasetCount() { * * @since 1.0.11 */ - public int indexOf(CategoryDataset dataset) { + public /*@GTENegativeOne*/ int indexOf(CategoryDataset dataset) { for (Entry entry: this.datasets.entrySet()) { if (entry.getValue() == dataset) { return entry.getKey(); @@ -1387,7 +1388,7 @@ public int indexOf(CategoryDataset dataset) { * * @see #getDomainAxisForDataset(int) */ - public void mapDatasetToDomainAxis(int index, int axisIndex) { + public void mapDatasetToDomainAxis(/*@NonNegative*/ int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(axisIndex); mapDatasetToDomainAxes(index, axisIndices); @@ -1403,7 +1404,7 @@ public void mapDatasetToDomainAxis(int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToDomainAxes(int index, List axisIndices) { + public void mapDatasetToDomainAxes(/*@NonNegative*/ int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); this.datasetToDomainAxesMap.put(index, new ArrayList(axisIndices)); @@ -1453,14 +1454,14 @@ private void checkAxisIndices(List indices) { * * @see #mapDatasetToDomainAxis(int, int) */ - public CategoryAxis getDomainAxisForDataset(int index) { + public CategoryAxis getDomainAxisForDataset(/*@NonNegative*/ int index) { Args.requireNonNegative(index, "index"); CategoryAxis axis; List axisIndices = (List) this.datasetToDomainAxesMap.get( new Integer(index)); if (axisIndices != null) { - // the first axis in the list is used for data <--> Java2D - Integer axisIndex = (Integer) axisIndices.get(0); + @SuppressWarnings("index") // the first axis in the list is used for data <--> Java2D + /*@NonNegative*/ Integer axisIndex = (Integer) axisIndices.get(0); axis = getDomainAxis(axisIndex.intValue()); } else { axis = getDomainAxis(0); @@ -1476,7 +1477,7 @@ public CategoryAxis getDomainAxisForDataset(int index) { * * @see #getRangeAxisForDataset(int) */ - public void mapDatasetToRangeAxis(int index, int axisIndex) { + public void mapDatasetToRangeAxis(/*@NonNegative*/ int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(new Integer(axisIndex)); mapDatasetToRangeAxes(index, axisIndices); @@ -1492,7 +1493,7 @@ public void mapDatasetToRangeAxis(int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToRangeAxes(int index, List axisIndices) { + public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); this.datasetToRangeAxesMap.put(index, new ArrayList(axisIndices)); @@ -1510,14 +1511,14 @@ public void mapDatasetToRangeAxes(int index, List axisIndices) { * * @see #mapDatasetToRangeAxis(int, int) */ - public ValueAxis getRangeAxisForDataset(int index) { + public ValueAxis getRangeAxisForDataset(/*@NonNegative*/ int index) { Args.requireNonNegative(index, "index"); ValueAxis axis; List axisIndices = (List) this.datasetToRangeAxesMap.get( new Integer(index)); if (axisIndices != null) { - // the first axis in the list is used for data <--> Java2D - Integer axisIndex = (Integer) axisIndices.get(0); + @SuppressWarnings("index") // the first axis in the list is used for data <--> Java2D + /*@NonNegative*/ Integer axisIndex = (Integer) axisIndices.get(0); axis = getRangeAxis(axisIndex.intValue()); } else { axis = getRangeAxis(0); @@ -1532,7 +1533,7 @@ public ValueAxis getRangeAxisForDataset(int index) { * * @since 1.0.11 */ - public int getRendererCount() { + public /*@NonNegative*/ int getRendererCount() { return this.renderers.size(); } @@ -1556,7 +1557,7 @@ public CategoryItemRenderer getRenderer() { * * @see #setRenderer(int, CategoryItemRenderer) */ - public CategoryItemRenderer getRenderer(int index) { + public CategoryItemRenderer getRenderer(/*@NonNegative*/ int index) { CategoryItemRenderer renderer = this.renderers.get(index); if (renderer == null) { return this.renderers.get(0); @@ -1609,7 +1610,7 @@ public void setRenderer(CategoryItemRenderer renderer, boolean notify) { * @see #getRenderer(int) * @see #setRenderer(int, CategoryItemRenderer, boolean) */ - public void setRenderer(int index, CategoryItemRenderer renderer) { + public void setRenderer(/*@NonNegative*/ int index, CategoryItemRenderer renderer) { setRenderer(index, renderer, true); } @@ -1625,7 +1626,7 @@ public void setRenderer(int index, CategoryItemRenderer renderer) { * * @see #getRenderer(int) */ - public void setRenderer(int index, CategoryItemRenderer renderer, + public void setRenderer(/*@NonNegative*/ int index, CategoryItemRenderer renderer, boolean notify) { CategoryItemRenderer existing = this.renderers.get(index); if (existing != null) { @@ -1684,7 +1685,7 @@ public CategoryItemRenderer getRendererForDataset(CategoryDataset dataset) { * * @return The renderer index. */ - public int getIndexOf(CategoryItemRenderer renderer) { + public /*@GTENegativeOne*/ int getIndexOf(CategoryItemRenderer renderer) { for (Entry entry : this.renderers.entrySet()) { if (entry.getValue() == renderer) { @@ -2356,7 +2357,7 @@ public void addDomainMarker(CategoryMarker marker, Layer layer) { * * @see #removeDomainMarker(int, Marker, Layer) */ - public void addDomainMarker(int index, CategoryMarker marker, Layer layer) { + public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, Layer layer) { addDomainMarker(index, marker, layer, true); } @@ -2376,7 +2377,7 @@ public void addDomainMarker(int index, CategoryMarker marker, Layer layer) { * * @see #removeDomainMarker(int, Marker, Layer, boolean) */ - public void addDomainMarker(int index, CategoryMarker marker, Layer layer, + public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, Layer layer, boolean notify) { Args.nullNotPermitted(marker, "marker"); Args.nullNotPermitted(layer, "layer"); @@ -2452,7 +2453,7 @@ public Collection getDomainMarkers(Layer layer) { * * @return A collection of markers (possibly {@code null}). */ - public Collection getDomainMarkers(int index, Layer layer) { + public Collection getDomainMarkers(/*@NonNegative*/ int index, Layer layer) { Collection result = null; Integer key = new Integer(index); if (layer == Layer.FOREGROUND) { @@ -2474,7 +2475,7 @@ else if (layer == Layer.BACKGROUND) { * * @see #clearRangeMarkers(int) */ - public void clearDomainMarkers(int index) { + public void clearDomainMarkers(/*@NonNegative*/ int index) { Integer key = new Integer(index); if (this.backgroundDomainMarkers != null) { Collection markers @@ -2547,7 +2548,7 @@ public boolean removeDomainMarker(Marker marker, Layer layer) { * * @since 1.0.7 */ - public boolean removeDomainMarker(int index, Marker marker, Layer layer) { + public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { return removeDomainMarker(index, marker, layer, true); } @@ -2565,7 +2566,7 @@ public boolean removeDomainMarker(int index, Marker marker, Layer layer) { * * @since 1.0.10 */ - public boolean removeDomainMarker(int index, Marker marker, Layer layer, + public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, boolean notify) { ArrayList markers; if (layer == Layer.FOREGROUND) { @@ -2628,7 +2629,7 @@ public void addRangeMarker(Marker marker, Layer layer) { * * @see #removeRangeMarker(int, Marker, Layer) */ - public void addRangeMarker(int index, Marker marker, Layer layer) { + public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { addRangeMarker(index, marker, layer, true); } @@ -2648,7 +2649,7 @@ public void addRangeMarker(int index, Marker marker, Layer layer) { * * @see #removeRangeMarker(int, Marker, Layer, boolean) */ - public void addRangeMarker(int index, Marker marker, Layer layer, + public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, boolean notify) { Collection markers; if (layer == Layer.FOREGROUND) { @@ -2724,7 +2725,7 @@ public Collection getRangeMarkers(Layer layer) { * * @return A collection of markers (possibly {@code null}). */ - public Collection getRangeMarkers(int index, Layer layer) { + public Collection getRangeMarkers(/*@NonNegative*/ int index, Layer layer) { Collection result = null; Integer key = new Integer(index); if (layer == Layer.FOREGROUND) { @@ -2746,7 +2747,7 @@ else if (layer == Layer.BACKGROUND) { * * @see #clearDomainMarkers(int) */ - public void clearRangeMarkers(int index) { + public void clearRangeMarkers(/*@NonNegative*/ int index) { Integer key = new Integer(index); if (this.backgroundRangeMarkers != null) { Collection markers @@ -2825,7 +2826,7 @@ public boolean removeRangeMarker(Marker marker, Layer layer) { * * @see #addRangeMarker(int, Marker, Layer) */ - public boolean removeRangeMarker(int index, Marker marker, Layer layer) { + public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { return removeRangeMarker(index, marker, layer, true); } @@ -2845,7 +2846,7 @@ public boolean removeRangeMarker(int index, Marker marker, Layer layer) { * * @see #addRangeMarker(int, Marker, Layer, boolean) */ - public boolean removeRangeMarker(int index, Marker marker, Layer layer, + public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, boolean notify) { Args.nullNotPermitted(marker, "marker"); ArrayList markers; @@ -2996,7 +2997,7 @@ public int getCrosshairDatasetIndex() { * * @since 1.0.11 */ - public void setCrosshairDatasetIndex(int index) { + public void setCrosshairDatasetIndex(/*@NonNegative*/ int index) { setCrosshairDatasetIndex(index, true); } @@ -3009,7 +3010,7 @@ public void setCrosshairDatasetIndex(int index) { * * @since 1.0.11 */ - public void setCrosshairDatasetIndex(int index, boolean notify) { + public void setCrosshairDatasetIndex(/*@NonNegative*/ int index, boolean notify) { this.crosshairDatasetIndex = index; if (notify) { fireChangeEvent(); @@ -3867,7 +3868,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, * * @since 1.0.11 */ - public boolean render(Graphics2D g2, Rectangle2D dataArea, int index, + public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int index, PlotRenderingInfo info, CategoryCrosshairState crosshairState) { boolean foundData = false; diff --git a/src/main/java/org/jfree/chart/plot/CrosshairState.java b/src/main/java/org/jfree/chart/plot/CrosshairState.java index effa5437c..0510620ee 100644 --- a/src/main/java/org/jfree/chart/plot/CrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CrosshairState.java @@ -52,6 +52,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.geom.Point2D; @@ -390,7 +391,7 @@ public int getDatasetIndex() { * * @since 1.0.11 */ - public void setDatasetIndex(int index) { + public void setDatasetIndex(/*@NonNegative*/ int index) { this.datasetIndex = index; } } diff --git a/src/main/java/org/jfree/chart/plot/PiePlot.java b/src/main/java/org/jfree/chart/plot/PiePlot.java index 12e0bd5b5..f8a118ddf 100644 --- a/src/main/java/org/jfree/chart/plot/PiePlot.java +++ b/src/main/java/org/jfree/chart/plot/PiePlot.java @@ -174,6 +174,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -673,7 +674,7 @@ public int getPieIndex() { * * @see #getPieIndex() */ - public void setPieIndex(int index) { + public void setPieIndex(/*@NonNegative*/ int index) { this.pieIndex = index; } diff --git a/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java b/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java index 787fc3fbe..66ae62766 100644 --- a/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java +++ b/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -176,7 +177,7 @@ public void addSubplotInfo(PlotRenderingInfo info) { * * @see #addSubplotInfo(PlotRenderingInfo) */ - public PlotRenderingInfo getSubplotInfo(int index) { + public PlotRenderingInfo getSubplotInfo(/*@NonNegative*/ int index) { return (PlotRenderingInfo) this.subplotInfo.get(index); } diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index e1b535501..42b58b6cc 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -358,7 +358,7 @@ public ValueAxis getAxis() { * * @since 1.0.14 */ - public ValueAxis getAxis(int index) { + public ValueAxis getAxis(/*@NonNegative*/ int index) { ValueAxis result = null; if (index < this.axes.size()) { result = (ValueAxis) this.axes.get(index); @@ -654,7 +654,7 @@ public PolarItemRenderer getRenderer() { * * @since 1.0.14 */ - public PolarItemRenderer getRenderer(int index) { + public PolarItemRenderer getRenderer(/*@NonNegative*/ int index) { PolarItemRenderer result = null; if (index < this.renderers.size()) { result = (PolarItemRenderer) this.renderers.get(index); @@ -1234,7 +1234,7 @@ else if (normalizedAngle > 270.0 && normalizedAngle < 360.0) { * * @since 1.0.14 */ - public void mapDatasetToAxis(int index, int axisIndex) { + public void mapDatasetToAxis(/*@NonNegative*/ int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(new Integer(axisIndex)); mapDatasetToAxes(index, axisIndices); @@ -1250,7 +1250,7 @@ public void mapDatasetToAxis(int index, int axisIndex) { * * @since 1.0.14 */ - public void mapDatasetToAxes(int index, List axisIndices) { + public void mapDatasetToAxes(/*@NonNegative*/ int index, List axisIndices) { if (index < 0) { throw new IllegalArgumentException("Requires 'index' >= 0."); } @@ -1301,7 +1301,7 @@ private void checkAxisIndices(List indices) { * * @since 1.0.14 */ - public ValueAxis getAxisForDataset(int index) { + public ValueAxis getAxisForDataset(/*@NonNegative*/ int index) { ValueAxis valueAxis; List axisIndices = (List) this.datasetToAxesMap.get( new Integer(index)); diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 3e1b9a30b..0ac62e56a 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -234,6 +234,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /*>>> import org.checkerframework.common.value.qual.ArrayLen; @@ -358,22 +359,22 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, private RectangleInsets axisOffset; /** The domain axis / axes (used for the x-values). */ - private Map domainAxes; + private Map domainAxes; /** The domain axis locations. */ - private Map domainAxisLocations; + private Map domainAxisLocations; /** The range axis (used for the y-values). */ - private Map rangeAxes; + private Map rangeAxes; /** The range axis location. */ - private Map rangeAxisLocations; + private Map rangeAxisLocations; /** Storage for the datasets. */ - private Map datasets; + private Map datasets; /** Storage for the renderers. */ - private Map renderers; + private Map renderers; /** * Storage for the mapping between datasets/renderers and domain axes. The @@ -383,7 +384,7 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, * entry for a dataset, it is assumed to map to the primary domain axis * (index = 0). */ - private Map> datasetToDomainAxesMap; + private Map> datasetToDomainAxesMap; /** * Storage for the mapping between datasets/renderers and range axes. The @@ -393,7 +394,7 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, * entry for a dataset, it is assumed to map to the primary domain axis * (index = 0). */ - private Map> datasetToRangeAxesMap; + private Map> datasetToRangeAxesMap; /** The origin point for the quadrants (if drawn). */ private transient Point2D quadrantOrigin = new Point2D.Double(0.0, 0.0); @@ -811,7 +812,7 @@ public ValueAxis getDomainAxis() { * * @see #setDomainAxis(int, ValueAxis) */ - public ValueAxis getDomainAxis(int index) { + public ValueAxis getDomainAxis(/*@NonNegative*/ int index) { ValueAxis result = this.domainAxes.get(index); if (result == null) { Plot parent = getParent(); @@ -846,7 +847,7 @@ public void setDomainAxis(ValueAxis axis) { * @see #getDomainAxis(int) * @see #setRangeAxis(int, ValueAxis) */ - public void setDomainAxis(int index, ValueAxis axis) { + public void setDomainAxis(/*@NonNegative*/ int index, ValueAxis axis) { setDomainAxis(index, axis, true); } @@ -860,7 +861,7 @@ public void setDomainAxis(int index, ValueAxis axis) { * * @see #getDomainAxis(int) */ - public void setDomainAxis(int index, ValueAxis axis, boolean notify) { + public void setDomainAxis(/*@NonNegative*/ int index, ValueAxis axis, boolean notify) { ValueAxis existing = getDomainAxis(index); if (existing != null) { existing.removeChangeListener(this); @@ -995,7 +996,7 @@ public void configureDomainAxes() { * * @see #setDomainAxisLocation(int, AxisLocation) */ - public AxisLocation getDomainAxisLocation(int index) { + public AxisLocation getDomainAxisLocation(/*@NonNegative*/ int index) { AxisLocation result = this.domainAxisLocations.get(index); if (result == null) { result = AxisLocation.getOpposite(getDomainAxisLocation()); @@ -1013,7 +1014,7 @@ public AxisLocation getDomainAxisLocation(int index) { * * @see #getDomainAxisLocation(int) */ - public void setDomainAxisLocation(int index, AxisLocation location) { + public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation location) { // delegate... setDomainAxisLocation(index, location, true); } @@ -1032,7 +1033,7 @@ public void setDomainAxisLocation(int index, AxisLocation location) { * @see #getDomainAxisLocation(int) * @see #setRangeAxisLocation(int, AxisLocation, boolean) */ - public void setDomainAxisLocation(int index, AxisLocation location, + public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation location, boolean notify) { if (index == 0 && location == null) { throw new IllegalArgumentException( @@ -1053,7 +1054,7 @@ public void setDomainAxisLocation(int index, AxisLocation location, * * @see #getRangeAxisEdge(int) */ - public RectangleEdge getDomainAxisEdge(int index) { + public RectangleEdge getDomainAxisEdge(/*@NonNegative*/ int index) { AxisLocation location = getDomainAxisLocation(index); return Plot.resolveDomainAxisLocation(location, this.orientation); } @@ -1160,7 +1161,7 @@ public RectangleEdge getRangeAxisEdge() { * * @see #setRangeAxis(int, ValueAxis) */ - public ValueAxis getRangeAxis(int index) { + public ValueAxis getRangeAxis(/*@NonNegative*/ int index) { ValueAxis result = this.rangeAxes.get(index); if (result == null) { Plot parent = getParent(); @@ -1181,7 +1182,7 @@ public ValueAxis getRangeAxis(int index) { * * @see #getRangeAxis(int) */ - public void setRangeAxis(int index, ValueAxis axis) { + public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis) { setRangeAxis(index, axis, true); } @@ -1195,7 +1196,7 @@ public void setRangeAxis(int index, ValueAxis axis) { * * @see #getRangeAxis(int) */ - public void setRangeAxis(int index, ValueAxis axis, boolean notify) { + public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis, boolean notify) { ValueAxis existing = getRangeAxis(index); if (existing != null) { existing.removeChangeListener(this); @@ -1279,7 +1280,7 @@ public void configureRangeAxes() { * * @see #setRangeAxisLocation(int, AxisLocation) */ - public AxisLocation getRangeAxisLocation(int index) { + public AxisLocation getRangeAxisLocation(/*@NonNegative*/ int index) { AxisLocation result = this.rangeAxisLocations.get(index); if (result == null) { result = AxisLocation.getOpposite(getRangeAxisLocation()); @@ -1296,7 +1297,7 @@ public AxisLocation getRangeAxisLocation(int index) { * * @see #getRangeAxisLocation(int) */ - public void setRangeAxisLocation(int index, AxisLocation location) { + public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation location) { // delegate... setRangeAxisLocation(index, location, true); } @@ -1315,7 +1316,7 @@ public void setRangeAxisLocation(int index, AxisLocation location) { * @see #getRangeAxisLocation(int) * @see #setDomainAxisLocation(int, AxisLocation, boolean) */ - public void setRangeAxisLocation(int index, AxisLocation location, + public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation location, boolean notify) { if (index == 0 && location == null) { throw new IllegalArgumentException( @@ -1337,7 +1338,7 @@ public void setRangeAxisLocation(int index, AxisLocation location, * @see #getRangeAxisLocation(int) * @see #getOrientation() */ - public RectangleEdge getRangeAxisEdge(int index) { + public RectangleEdge getRangeAxisEdge(/*@NonNegative*/ int index) { AxisLocation location = getRangeAxisLocation(index); return Plot.resolveRangeAxisLocation(location, this.orientation); } @@ -1364,7 +1365,7 @@ public XYDataset getDataset() { * * @see #setDataset(int, XYDataset) */ - public XYDataset getDataset(int index) { + public XYDataset getDataset(/*@NonNegative*/ int index) { return (XYDataset) this.datasets.get(index); } @@ -1390,7 +1391,7 @@ public void setDataset(XYDataset dataset) { * * @see #getDataset(int) */ - public void setDataset(int index, XYDataset dataset) { + public void setDataset(/*@NonNegative*/ int index, XYDataset dataset) { XYDataset existing = getDataset(index); if (existing != null) { existing.removeChangeListener(this); @@ -1440,7 +1441,7 @@ public int indexOf(XYDataset dataset) { * * @see #mapDatasetToRangeAxis(int, int) */ - public void mapDatasetToDomainAxis(int index, int axisIndex) { + public void mapDatasetToDomainAxis(/*@NonNegative*/ int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(new Integer(axisIndex)); mapDatasetToDomainAxes(index, axisIndices); @@ -1456,7 +1457,7 @@ public void mapDatasetToDomainAxis(int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToDomainAxes(int index, List axisIndices) { + public void mapDatasetToDomainAxes(/*@NonNegative*/ int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); Integer key = new Integer(index); @@ -1474,7 +1475,7 @@ public void mapDatasetToDomainAxes(int index, List axisIndices) { * * @see #mapDatasetToDomainAxis(int, int) */ - public void mapDatasetToRangeAxis(int index, int axisIndex) { + public void mapDatasetToRangeAxis(/*@NonNegative*/ int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(new Integer(axisIndex)); mapDatasetToRangeAxes(index, axisIndices); @@ -1490,7 +1491,7 @@ public void mapDatasetToRangeAxis(int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToRangeAxes(int index, List axisIndices) { + public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); Integer key = new Integer(index); @@ -1557,7 +1558,7 @@ public XYItemRenderer getRenderer() { * * @see #setRenderer(int, XYItemRenderer) */ - public XYItemRenderer getRenderer(int index) { + public XYItemRenderer getRenderer(/*@NonNegative*/ int index) { return (XYItemRenderer) this.renderers.get(index); } @@ -1585,7 +1586,7 @@ public void setRenderer(XYItemRenderer renderer) { * * @see #getRenderer(int) */ - public void setRenderer(int index, XYItemRenderer renderer) { + public void setRenderer(/*@NonNegative*/ int index, XYItemRenderer renderer) { setRenderer(index, renderer, true); } @@ -1601,7 +1602,7 @@ public void setRenderer(int index, XYItemRenderer renderer) { * * @see #getRenderer(int) */ - public void setRenderer(int index, XYItemRenderer renderer, + public void setRenderer(/*@NonNegative*/ int index, XYItemRenderer renderer, boolean notify) { XYItemRenderer existing = getRenderer(index); if (existing != null) { @@ -2365,7 +2366,7 @@ public void setQuadrantOrigin(Point2D origin) { * * @see #setQuadrantPaint(int, Paint) */ - public Paint getQuadrantPaint(int index) { + public Paint getQuadrantPaint(/*@NonNegative*/ int index) { if (index < 0 || index > 3) { throw new IllegalArgumentException("The index value (" + index + ") should be in the range 0 to 3."); @@ -2382,7 +2383,7 @@ public Paint getQuadrantPaint(int index) { * * @see #getQuadrantPaint(int) */ - public void setQuadrantPaint(int index, Paint paint) { + public void setQuadrantPaint(/*@NonNegative*/ int index, Paint paint) { if (index < 0 || index > 3) { throw new IllegalArgumentException("The index value (" + index + ") should be in the range 0 to 3."); @@ -2432,14 +2433,16 @@ public void addDomainMarker(Marker marker, Layer layer) { */ public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - Set keys = this.backgroundDomainMarkers.keySet(); + @SuppressWarnings("index") // keys in backgroundDomainMarkers are non negative? + Set keys = this.backgroundDomainMarkers.keySet(); for (Integer key : keys) { clearDomainMarkers(key); } this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { - Set keys = this.foregroundDomainMarkers.keySet(); + @SuppressWarnings("index") // keys in foregroundDomainMarkers are non negative? + Set keys = this.foregroundDomainMarkers.keySet(); for (Integer key : keys) { clearDomainMarkers(key); } @@ -2456,7 +2459,7 @@ public void clearDomainMarkers() { * * @see #clearRangeMarkers(int) */ - public void clearDomainMarkers(int index) { + public void clearDomainMarkers(/*@NonNegative*/ int index) { Integer key = new Integer(index); if (this.backgroundDomainMarkers != null) { Collection markers @@ -2500,7 +2503,7 @@ public void clearDomainMarkers(int index) { * @see #clearDomainMarkers(int) * @see #addRangeMarker(int, Marker, Layer) */ - public void addDomainMarker(int index, Marker marker, Layer layer) { + public void addDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { addDomainMarker(index, marker, layer, true); } @@ -2519,7 +2522,7 @@ public void addDomainMarker(int index, Marker marker, Layer layer) { * * @since 1.0.10 */ - public void addDomainMarker(int index, Marker marker, Layer layer, + public void addDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, boolean notify) { Args.nullNotPermitted(marker, "marker"); Args.nullNotPermitted(layer, "layer"); @@ -2592,7 +2595,7 @@ public boolean removeDomainMarker(Marker marker, Layer layer) { * * @since 1.0.7 */ - public boolean removeDomainMarker(int index, Marker marker, Layer layer) { + public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { return removeDomainMarker(index, marker, layer, true); } @@ -2610,7 +2613,7 @@ public boolean removeDomainMarker(int index, Marker marker, Layer layer) { * * @since 1.0.10 */ - public boolean removeDomainMarker(int index, Marker marker, Layer layer, + public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, boolean notify) { ArrayList markers; if (layer == Layer.FOREGROUND) { @@ -2700,7 +2703,7 @@ public void clearRangeMarkers() { * @see #clearRangeMarkers(int) * @see #addDomainMarker(int, Marker, Layer) */ - public void addRangeMarker(int index, Marker marker, Layer layer) { + public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { addRangeMarker(index, marker, layer, true); } @@ -2718,7 +2721,7 @@ public void addRangeMarker(int index, Marker marker, Layer layer) { * * @since 1.0.10 */ - public void addRangeMarker(int index, Marker marker, Layer layer, + public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, boolean notify) { Collection markers; if (layer == Layer.FOREGROUND) { @@ -2751,7 +2754,7 @@ else if (layer == Layer.BACKGROUND) { * * @param index the renderer index. */ - public void clearRangeMarkers(int index) { + public void clearRangeMarkers(/*@NonNegative*/ int index) { Integer key = new Integer(index); if (this.backgroundRangeMarkers != null) { Collection markers @@ -2824,7 +2827,7 @@ public boolean removeRangeMarker(Marker marker, Layer layer) { * * @since 1.0.7 */ - public boolean removeRangeMarker(int index, Marker marker, Layer layer) { + public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { return removeRangeMarker(index, marker, layer, true); } @@ -2842,7 +2845,7 @@ public boolean removeRangeMarker(int index, Marker marker, Layer layer) { * * @since 1.0.10 */ - public boolean removeRangeMarker(int index, Marker marker, Layer layer, + public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, boolean notify) { Args.nullNotPermitted(marker, "marker"); Args.nullNotPermitted(layer, "layer"); @@ -3700,7 +3703,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, * * @return A flag that indicates whether any data was actually rendered. */ - public boolean render(Graphics2D g2, Rectangle2D dataArea, int index, + public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int index, PlotRenderingInfo info, CrosshairState crosshairState) { boolean foundData = false; @@ -3791,7 +3794,7 @@ public boolean render(Graphics2D g2, Rectangle2D dataArea, int index, * * @return The axis. */ - public ValueAxis getDomainAxisForDataset(int index) { + public ValueAxis getDomainAxisForDataset(/*@NonNegative*/ int index) { Args.requireNonNegative(index, "index"); ValueAxis valueAxis; List axisIndices = (List) this.datasetToDomainAxesMap.get( @@ -3814,7 +3817,7 @@ public ValueAxis getDomainAxisForDataset(int index) { * * @return The axis. */ - public ValueAxis getRangeAxisForDataset(int index) { + public ValueAxis getRangeAxisForDataset(/*@NonNegative*/ int index) { Args.requireNonNegative(index, "index"); ValueAxis valueAxis; List axisIndices = (List) this.datasetToRangeAxesMap.get( @@ -4082,7 +4085,7 @@ public Collection getRangeMarkers(Layer layer) { * * @see #getRangeMarkers(int, Layer) */ - public Collection getDomainMarkers(int index, Layer layer) { + public Collection getDomainMarkers(/*@NonNegative*/ int index, Layer layer) { Collection result = null; Integer key = new Integer(index); if (layer == Layer.FOREGROUND) { @@ -4108,7 +4111,7 @@ else if (layer == Layer.BACKGROUND) { * * @see #getDomainMarkers(int, Layer) */ - public Collection getRangeMarkers(int index, Layer layer) { + public Collection getRangeMarkers(/*@NonNegative*/ int index, Layer layer) { Collection result = null; Integer key = new Integer(index); if (layer == Layer.FOREGROUND) { diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java index 4e1950e83..b1eb97096 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.plot.dial; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Shape; @@ -355,7 +356,7 @@ public int getLayerIndex(DialLayer layer) { * * @param index the index. */ - public void removeLayer(int index) { + public void removeLayer(/*@NonNegative*/ int index) { DialLayer layer = (DialLayer) this.layers.get(index); if (layer != null) { layer.removeChangeListener(this); @@ -406,7 +407,7 @@ public int getPointerIndex(DialPointer pointer) { * * @param index the index. */ - public void removePointer(int index) { + public void removePointer(/*@NonNegative*/ int index) { DialPointer pointer = (DialPointer) this.pointers.get(index); if (pointer != null) { pointer.removeChangeListener(this); @@ -462,7 +463,7 @@ public ValueDataset getDataset() { * * @return The dataset (possibly {@code null}). */ - public ValueDataset getDataset(int index) { + public ValueDataset getDataset(/*@NonNegative*/ int index) { ValueDataset result = null; if (this.datasets.size() > index) { result = (ValueDataset) this.datasets.get(index); @@ -487,7 +488,7 @@ public void setDataset(ValueDataset dataset) { * @param index the dataset index. * @param dataset the dataset ({@code null} permitted). */ - public void setDataset(int index, ValueDataset dataset) { + public void setDataset(/*@NonNegative*/ int index, ValueDataset dataset) { ValueDataset existing = (ValueDataset) this.datasets.get(index); if (existing != null) { @@ -643,7 +644,7 @@ public double getValue(int datasetIndex) { * @param index the scale index. * @param scale the scale ({@code null} not permitted). */ - public void addScale(int index, DialScale scale) { + public void addScale(/*@NonNegative*/ int index, DialScale scale) { Args.nullNotPermitted(scale, "scale"); DialScale existing = (DialScale) this.scales.get(index); if (existing != null) { @@ -662,7 +663,7 @@ public void addScale(int index, DialScale scale) { * * @return The scale (possibly {@code null}). */ - public DialScale getScale(int index) { + public DialScale getScale(/*@NonNegative*/ int index) { DialScale result = null; if (this.scales.size() > index) { result = (DialScale) this.scales.get(index); @@ -676,7 +677,7 @@ public DialScale getScale(int index) { * @param index the dataset index (zero-based). * @param scaleIndex the scale index (zero-based). */ - public void mapDatasetToScale(int index, int scaleIndex) { + public void mapDatasetToScale(/*@NonNegative*/ int index, int scaleIndex) { this.datasetToScaleMap.set(index, new Integer(scaleIndex)); fireChangeEvent(); } diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java index 07dcb20a2..bcb8609b2 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.plot.dial; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; import java.awt.Color; @@ -118,7 +119,7 @@ public int getDatasetIndex() { * * @see #getDatasetIndex() */ - public void setDatasetIndex(int index) { + public void setDatasetIndex(/*@NonNegative*/ int index) { this.datasetIndex = index; notifyListeners(new DialLayerChangeEvent(this)); } diff --git a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java index a2fa008ec..9021ac8d4 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.plot.dial; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; import java.awt.Color; @@ -186,7 +187,7 @@ public int getDatasetIndex() { * * @see #getDatasetIndex() */ - public void setDatasetIndex(int index) { + public void setDatasetIndex(/*@NonNegative*/ int index) { this.datasetIndex = index; notifyListeners(new DialLayerChangeEvent(this)); } diff --git a/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java b/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java index 4223d6719..b8b54219f 100644 --- a/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java +++ b/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.plot.dial; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; import java.awt.Color; @@ -142,7 +143,7 @@ public int getScaleIndex() { * * @see #getScaleIndex() */ - public void setScaleIndex(int index) { + public void setScaleIndex(/*@NonNegative*/ int index) { this.scaleIndex = index; notifyListeners(new DialLayerChangeEvent(this)); } diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 4f4ea065c..8542dae55 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -1548,7 +1548,7 @@ public Object clone() throws CloneNotSupportedException { * * @return A domain axis. */ - protected CategoryAxis getDomainAxis(CategoryPlot plot, int index) { + protected CategoryAxis getDomainAxis(CategoryPlot plot, /*@NonNegative*/ int index) { CategoryAxis result = plot.getDomainAxis(index); if (result == null) { result = plot.getDomainAxis(); @@ -1564,7 +1564,7 @@ protected CategoryAxis getDomainAxis(CategoryPlot plot, int index) { * * @return A range axis. */ - protected ValueAxis getRangeAxis(CategoryPlot plot, int index) { + protected ValueAxis getRangeAxis(CategoryPlot plot, /*@NonNegative*/ int index) { ValueAxis result = plot.getRangeAxis(index); if (result == null) { result = plot.getRangeAxis(); diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java index e2037163a..33888da21 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java @@ -67,6 +67,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -413,7 +414,7 @@ else if (pass == 1) { * for {@code index}. */ protected double[] getStackValues(CategoryDataset dataset, - int series, int index, int[] validRows) { + int series, /*@NonNegative*/ int index, int[] validRows) { double[] result = new double[2]; double total = 0.0; if (this.renderAsPercentages) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java index 502868212..2d16655a1 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java @@ -70,6 +70,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -624,7 +625,7 @@ else if (plot.getOrientation() == PlotOrientation.HORIZONTAL) { * {@code series} for {@code index}. */ protected double getPreviousHeight(TableXYDataset dataset, - int series, int index) { + int series, /*@NonNegative*/ int index) { double result = 0.0; for (int i = 0; i < series; i++) { double value = dataset.getYValue(i, index); diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java index c9da1479b..141295168 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java @@ -56,6 +56,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -460,7 +461,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * for {@code index}. */ private double[] getStackValues(TableXYDataset dataset, - int series, int index) { + int series, /*@NonNegative*/ int index) { double[] result = new double[2]; for (int i = 0; i < series; i++) { double v = dataset.getYValue(i, index); diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index 4bed2857f..660efc2f9 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -676,7 +676,7 @@ public void setLastPointGood(boolean good) { * * @return The series index for the current path. */ - public int getSeriesIndex() { + public /*@NonNegative*/ int getSeriesIndex() { return this.seriesIndex; } @@ -685,7 +685,7 @@ public int getSeriesIndex() { * * @param index the index. */ - public void setSeriesIndex(int index) { + public void setSeriesIndex(/*@NonNegative*/ int index) { this.seriesIndex = index; } } diff --git a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java index 02dd72db9..38841422c 100644 --- a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java +++ b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java @@ -136,7 +136,7 @@ public Comparable getSeriesKey() { * * @return The series index. */ - public int getSeriesIndex() { + public /*@NonNegative*/ int getSeriesIndex() { return this.series; } diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index 070480c74..9293e8852 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -98,7 +98,7 @@ protected AbstractObjectList(/*@NonNegative*/ int initialCapacity, /*@NonNegativ * * @return The object or {@code null}. */ - protected Object get(int index) { + protected Object get(/*@NonNegative*/ int index) { Object result = null; if (index >= 0 && index < this.size) { result = this.objects[index]; diff --git a/src/main/java/org/jfree/chart/util/BooleanList.java b/src/main/java/org/jfree/chart/util/BooleanList.java index 4983236fe..1ccfcb471 100644 --- a/src/main/java/org/jfree/chart/util/BooleanList.java +++ b/src/main/java/org/jfree/chart/util/BooleanList.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.util; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /** * A list of {@code Boolean} objects. @@ -49,7 +50,7 @@ public BooleanList() { * * @return a {@link Boolean} from the list. */ - public Boolean getBoolean(int index) { + public Boolean getBoolean(/*@NonNegative*/ int index) { return (Boolean) get(index); } @@ -60,7 +61,7 @@ public Boolean getBoolean(int index) { * @param index the index (zero-based). * @param b the boolean. */ - public void setBoolean(int index, Boolean b) { + public void setBoolean(/*@NonNegative*/ int index, Boolean b) { set(index, b); } diff --git a/src/main/java/org/jfree/chart/util/ObjectList.java b/src/main/java/org/jfree/chart/util/ObjectList.java index 7f34a298c..20a9d8c45 100644 --- a/src/main/java/org/jfree/chart/util/ObjectList.java +++ b/src/main/java/org/jfree/chart/util/ObjectList.java @@ -68,7 +68,7 @@ public ObjectList(/*@NonNegative*/ int initialCapacity) { * @return The object or {@code null}. */ @Override - public Object get(int index) { + public Object get(/*@NonNegative*/ int index) { return super.get(index); } diff --git a/src/main/java/org/jfree/chart/util/ShapeList.java b/src/main/java/org/jfree/chart/util/ShapeList.java index 60cb8c9fa..68ac38f2e 100644 --- a/src/main/java/org/jfree/chart/util/ShapeList.java +++ b/src/main/java/org/jfree/chart/util/ShapeList.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.util; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Shape; import java.io.IOException; @@ -52,7 +53,7 @@ public ShapeList() { * * @return The object. */ - public Shape getShape(int index) { + public Shape getShape(/*@NonNegative*/ int index) { return (Shape) get(index); } @@ -63,7 +64,7 @@ public Shape getShape(int index) { * @param index the index (zero-based). * @param shape the {@link Shape}. */ - public void setShape(int index, Shape shape) { + public void setShape(/*@NonNegative*/ int index, Shape shape) { set(index, shape); } diff --git a/src/main/java/org/jfree/data/ComparableObjectSeries.java b/src/main/java/org/jfree/data/ComparableObjectSeries.java index 34f844ced..458b54af3 100644 --- a/src/main/java/org/jfree/data/ComparableObjectSeries.java +++ b/src/main/java/org/jfree/data/ComparableObjectSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Collections; @@ -314,7 +315,7 @@ protected void update(Comparable x, Object y) { * @param index the item (zero based index). * @param y the new value ({@code null} permitted). */ - protected void updateByIndex(int index, Object y) { + protected void updateByIndex(/*@NonNegative*/ int index, Object y) { ComparableObjectItem item = getDataItem(index); item.setObject(y); fireSeriesChanged(); @@ -327,7 +328,7 @@ protected void updateByIndex(int index, Object y) { * * @return The data item with the specified index. */ - protected ComparableObjectItem getDataItem(int index) { + protected ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { return (ComparableObjectItem) this.data.get(index); } @@ -365,7 +366,7 @@ public void clear() { * * @return The item removed. */ - protected ComparableObjectItem remove(int index) { + protected ComparableObjectItem remove(/*@NonNegative*/ int index) { ComparableObjectItem result = (ComparableObjectItem) this.data.remove( index); fireSeriesChanged(); diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues.java b/src/main/java/org/jfree/data/DefaultKeyedValues.java index 47915a2b8..27060f092 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues.java @@ -59,6 +59,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.ArrayList; @@ -135,7 +136,7 @@ public Number getValue(int item) { * @throws IndexOutOfBoundsException if {@code item} is out of bounds. */ @Override - public Comparable getKey(int index) { + public Comparable getKey(/*@NonNegative*/ int index) { return (Comparable) this.keys.get(index); } @@ -312,7 +313,7 @@ private void rebuildIndex () { * @throws IndexOutOfBoundsException if {@code index} is not within * the specified range. */ - public void removeValue(int index) { + public void removeValue(/*@NonNegative*/ int index) { this.keys.remove(index); this.values.remove(index); rebuildIndex(); diff --git a/src/main/java/org/jfree/data/KeyedObjects.java b/src/main/java/org/jfree/data/KeyedObjects.java index 4a6a3149e..ee461a88e 100644 --- a/src/main/java/org/jfree/data/KeyedObjects.java +++ b/src/main/java/org/jfree/data/KeyedObjects.java @@ -43,6 +43,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Iterator; @@ -106,7 +107,7 @@ public Object getObject(int item) { * * @see #getIndex(Comparable) */ - public Comparable getKey(int index) { + public Comparable getKey(/*@NonNegative*/ int index) { Comparable result = null; KeyedObject item = (KeyedObject) this.data.get(index); if (item != null) { @@ -244,7 +245,7 @@ public void insertValue(int position, Comparable key, Object value) { * * @see #removeValue(Comparable) */ - public void removeValue(int index) { + public void removeValue(/*@NonNegative*/ int index) { this.data.remove(index); } diff --git a/src/main/java/org/jfree/data/KeyedValues.java b/src/main/java/org/jfree/data/KeyedValues.java index ee4f6a2f5..548e6ee94 100644 --- a/src/main/java/org/jfree/data/KeyedValues.java +++ b/src/main/java/org/jfree/data/KeyedValues.java @@ -43,6 +43,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.List; @@ -68,7 +69,7 @@ public interface KeyedValues extends Values { * @throws IndexOutOfBoundsException if {@code index} is not in the * specified range. */ - public Comparable getKey(int index); + public Comparable getKey(/*@NonNegative*/ int index); /** * Returns the index for a given key. diff --git a/src/main/java/org/jfree/data/Values.java b/src/main/java/org/jfree/data/Values.java index f26892f8d..ee8fd29f9 100644 --- a/src/main/java/org/jfree/data/Values.java +++ b/src/main/java/org/jfree/data/Values.java @@ -42,6 +42,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /** * An interface through which (single-dimension) data values can be accessed. @@ -66,6 +67,6 @@ public interface Values { * @throws IndexOutOfBoundsException if {@code index} is not in the * specified range. */ - public Number getValue(int index); + public Number getValue(/*@NonNegative*/ int index); } diff --git a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java index 26cb792d9..def5e3246 100644 --- a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java +++ b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java @@ -48,6 +48,7 @@ */ package org.jfree.data.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collections; import java.util.List; @@ -194,7 +195,7 @@ else if (this.extract == TableOrder.BY_COLUMN) { * specified range. */ @Override - public Comparable getKey(int index) { + public Comparable getKey(/*@NonNegative*/ int index) { Comparable result = null; if (index < 0 || index >= getItemCount()) { // this includes the case where the underlying dataset is null diff --git a/src/main/java/org/jfree/data/gantt/Task.java b/src/main/java/org/jfree/data/gantt/Task.java index 9b2338de3..07228040f 100644 --- a/src/main/java/org/jfree/data/gantt/Task.java +++ b/src/main/java/org/jfree/data/gantt/Task.java @@ -43,6 +43,7 @@ */ package org.jfree.data.gantt; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Date; @@ -201,7 +202,7 @@ public int getSubtaskCount() { * * @return The sub-task. */ - public Task getSubtask(int index) { + public Task getSubtask(/*@NonNegative*/ int index) { return (Task) this.subtasks.get(index); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeries.java b/src/main/java/org/jfree/data/gantt/TaskSeries.java index 852266b64..39105f720 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeries.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeries.java @@ -45,6 +45,7 @@ */ package org.jfree.data.gantt; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collections; import java.util.List; @@ -126,7 +127,7 @@ public int getItemCount() { * * @return The task. */ - public Task get(int index) { + public Task get(/*@NonNegative*/ int index) { return (Task) this.tasks.get(index); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 151a3677c..53b92458a 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -202,7 +202,7 @@ public List getColumnKeys() { * @return The column key. */ @Override - public Comparable getColumnKey(int index) { + public Comparable getColumnKey(/*@NonNegative*/ int index) { return (Comparable) this.keys.get(index); } @@ -248,7 +248,7 @@ public int getRowIndex(Comparable rowKey) { * @return The key. */ @Override - public Comparable getRowKey(int index) { + public Comparable getRowKey(/*@NonNegative*/ int index) { TaskSeries series = (TaskSeries) this.data.get(index); return series.getKey(); } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 4b45d3506..9af13f275 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -158,7 +158,7 @@ public ValueSequence(int length) { * @param index the index. * @param value the value. */ - public void enterData(int index, float value) { + public void enterData(/*@NonNegative*/ int index, float value) { this.dataPoints[index] = value; } @@ -169,7 +169,7 @@ public void enterData(int index, float value) { * * @return The value. */ - public float getData(int index) { + public float getData(/*@NonNegative*/ int index) { return this.dataPoints[index]; } } @@ -439,7 +439,7 @@ public void setSeriesKey(int seriesNumber, Comparable key) { * @param index ??. * @param value the value. */ - public void addValue(int seriesNumber, int index, float value) { + public void addValue(int seriesNumber, /*@NonNegative*/ int index, float value) { invalidateRangeInfo(); if (seriesNumber >= this.valueHistory.length) { throw new IllegalArgumentException( diff --git a/src/main/java/org/jfree/data/time/TimePeriodValues.java b/src/main/java/org/jfree/data/time/TimePeriodValues.java index a9119bebd..a82a395f6 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValues.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValues.java @@ -47,6 +47,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.ArrayList; @@ -201,7 +202,7 @@ public int getItemCount() { * * @return One data item for the series. */ - public TimePeriodValue getDataItem(int index) { + public TimePeriodValue getDataItem(/*@NonNegative*/ int index) { return (TimePeriodValue) this.data.get(index); } @@ -215,7 +216,7 @@ public TimePeriodValue getDataItem(int index) { * * @see #getDataItem(int) */ - public TimePeriod getTimePeriod(int index) { + public TimePeriod getTimePeriod(/*@NonNegative*/ int index) { return getDataItem(index).getPeriod(); } @@ -229,7 +230,7 @@ public TimePeriod getTimePeriod(int index) { * * @see #getDataItem(int) */ - public Number getValue(int index) { + public Number getValue(/*@NonNegative*/ int index) { return getDataItem(index).getValue(); } @@ -252,7 +253,7 @@ public void add(TimePeriodValue item) { * @param period the time period. * @param index the index of the time period. */ - private void updateBounds(TimePeriod period, int index) { + private void updateBounds(TimePeriod period, /*@NonNegative*/ int index) { long start = period.getStart().getTime(); long end = period.getEnd().getTime(); @@ -381,7 +382,7 @@ public void add(TimePeriod period, Number value) { * @param index the index of the data item to update. * @param value the new value ({@code null} not permitted). */ - public void update(int index, Number value) { + public void update(/*@NonNegative*/ int index, Number value) { TimePeriodValue item = getDataItem(index); item.setValue(value); fireSeriesChanged(); diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index 657d0385e..d1881cbae 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -202,7 +202,7 @@ public void removeSeries(TimePeriodValues series) { * * @param index the series index (zero-based). */ - public void removeSeries(int index) { + public void removeSeries(/*@NonNegative*/ int index) { TimePeriodValues series = getSeries(index); if (series != null) { removeSeries(series); diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index 3a2da9e13..c5d6bd128 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -90,6 +90,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.lang.reflect.InvocationTargetException; @@ -476,7 +477,7 @@ public Class getTimePeriodClass() { * * @return The data item. */ - public TimeSeriesDataItem getDataItem(int index) { + public TimeSeriesDataItem getDataItem(/*@NonNegative*/ int index) { TimeSeriesDataItem item = (TimeSeriesDataItem) this.data.get(index); return (TimeSeriesDataItem) item.clone(); } @@ -514,7 +515,7 @@ public TimeSeriesDataItem getDataItem(RegularTimePeriod period) { * * @since 1.0.14 */ - TimeSeriesDataItem getRawDataItem(int index) { + TimeSeriesDataItem getRawDataItem(/*@NonNegative*/ int index) { return (TimeSeriesDataItem) this.data.get(index); } @@ -546,7 +547,7 @@ TimeSeriesDataItem getRawDataItem(RegularTimePeriod period) { * * @return The time period. */ - public RegularTimePeriod getTimePeriod(int index) { + public RegularTimePeriod getTimePeriod(/*@NonNegative*/ int index) { return getRawDataItem(index).getPeriod(); } @@ -616,7 +617,7 @@ public int getIndex(RegularTimePeriod period) { * * @return The value (possibly {@code null}). */ - public Number getValue(int index) { + public Number getValue(/*@NonNegative*/ int index) { return getRawDataItem(index).getValue(); } @@ -809,7 +810,7 @@ public void update(RegularTimePeriod period, Number value) { * @param index the index of the data item. * @param value the new value ({@code null} permitted). */ - public void update(int index, Number value) { + public void update(/*@NonNegative*/ int index, Number value) { TimeSeriesDataItem item = (TimeSeriesDataItem) this.data.get(index); boolean iterate = false; Number oldYN = item.getValue(); diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index d7b26231a..0defca3de 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -366,7 +366,7 @@ public void removeSeries(TimeSeries series) { * * @param index the series index (zero-based). */ - public void removeSeries(int index) { + public void removeSeries(/*@NonNegative*/ int index) { TimeSeries series = getSeries(index); if (series != null) { removeSeries(series); diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java index 81c25be40..1dc3c7750 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data.time.ohlc; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.chart.util.Args; import org.jfree.data.ComparableObjectItem; @@ -74,7 +75,7 @@ public OHLCSeries(Comparable key) { * * @return The time period. */ - public RegularTimePeriod getPeriod(int index) { + public RegularTimePeriod getPeriod(/*@NonNegative*/ int index) { OHLCItem item = (OHLCItem) getDataItem(index); return item.getPeriod(); } @@ -87,7 +88,7 @@ public RegularTimePeriod getPeriod(int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(int index) { + public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { return super.getDataItem(index); } @@ -136,7 +137,7 @@ public void add(OHLCItem item) { * @since 1.0.14 */ @Override - public ComparableObjectItem remove(int index) { + public ComparableObjectItem remove(/*@NonNegative*/ int index) { return super.remove(index); } diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index 3b53e6c78..6706dd250 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -396,7 +396,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, int item) { * * @since 1.0.14 */ - public void removeSeries(int index) { + public void removeSeries(/*@NonNegative*/ int index) { OHLCSeries series = getSeries(index); if (series != null) { removeSeries(series); diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index 7621c7b3d..435ab5224 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -325,7 +325,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, int index) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int index) { XYSeries s = (XYSeries) this.data.get(series); return s.getY(index); } diff --git a/src/main/java/org/jfree/data/xy/VectorSeries.java b/src/main/java/org/jfree/data/xy/VectorSeries.java index f6d21cdf1..a94962400 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeries.java +++ b/src/main/java/org/jfree/data/xy/VectorSeries.java @@ -45,6 +45,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; @@ -117,7 +118,7 @@ public void add(VectorDataItem item, boolean notify) { * @return The item removed. */ @Override - public ComparableObjectItem remove(int index) { + public ComparableObjectItem remove(/*@NonNegative*/ int index) { VectorDataItem result = (VectorDataItem) this.data.remove(index); fireSeriesChanged(); return result; @@ -130,7 +131,7 @@ public ComparableObjectItem remove(int index) { * * @return The x-value. */ - public double getXValue(int index) { + public double getXValue(/*@NonNegative*/ int index) { VectorDataItem item = (VectorDataItem) this.getDataItem(index); return item.getXValue(); } @@ -142,7 +143,7 @@ public double getXValue(int index) { * * @return The y-value. */ - public double getYValue(int index) { + public double getYValue(/*@NonNegative*/ int index) { VectorDataItem item = (VectorDataItem) getDataItem(index); return item.getYValue(); } @@ -154,7 +155,7 @@ public double getYValue(int index) { * * @return The x-component of the vector. */ - public double getVectorXValue(int index) { + public double getVectorXValue(/*@NonNegative*/ int index) { VectorDataItem item = (VectorDataItem) getDataItem(index); return item.getVectorX(); } @@ -166,7 +167,7 @@ public double getVectorXValue(int index) { * * @return The y-component of the vector. */ - public double getVectorYValue(int index) { + public double getVectorYValue(/*@NonNegative*/ int index) { VectorDataItem item = (VectorDataItem) getDataItem(index); return item.getVectorY(); } @@ -179,7 +180,7 @@ public double getVectorYValue(int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(int index) { + public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { // overridden to make public return super.getDataItem(index); } diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeries.java b/src/main/java/org/jfree/data/xy/XIntervalSeries.java index 9d5b4caef..18f337030 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; @@ -114,7 +115,7 @@ public void add(XIntervalDataItem item, boolean notify) { * * @return The x-value (never {@code null}). */ - public Number getX(int index) { + public Number getX(/*@NonNegative*/ int index) { XIntervalDataItem item = (XIntervalDataItem) getDataItem(index); return item.getX(); } @@ -128,7 +129,7 @@ public Number getX(int index) { * * @since 1.0.10 */ - public double getXLowValue(int index) { + public double getXLowValue(/*@NonNegative*/ int index) { XIntervalDataItem item = (XIntervalDataItem) getDataItem(index); return item.getXLowValue(); } @@ -142,7 +143,7 @@ public double getXLowValue(int index) { * * @since 1.0.10 */ - public double getXHighValue(int index) { + public double getXHighValue(/*@NonNegative*/ int index) { XIntervalDataItem item = (XIntervalDataItem) getDataItem(index); return item.getXHighValue(); } @@ -154,7 +155,7 @@ public double getXHighValue(int index) { * * @return The y-value. */ - public double getYValue(int index) { + public double getYValue(/*@NonNegative*/ int index) { XIntervalDataItem item = (XIntervalDataItem) getDataItem(index); return item.getYValue(); } @@ -167,7 +168,7 @@ public double getYValue(int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(int index) { + public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { return super.getDataItem(index); } diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeries.java b/src/main/java/org/jfree/data/xy/XYIntervalSeries.java index 6b8616a11..9b3d1ce12 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; @@ -117,7 +118,7 @@ public void add(XYIntervalDataItem item, boolean notify) { * * @return The x-value (never {@code null}). */ - public Number getX(int index) { + public Number getX(/*@NonNegative*/ int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getX(); } @@ -132,7 +133,7 @@ public Number getX(int index) { * * @since 1.0.5 */ - public double getXLowValue(int index) { + public double getXLowValue(/*@NonNegative*/ int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getXLowValue(); } @@ -147,7 +148,7 @@ public double getXLowValue(int index) { * * @since 1.0.5 */ - public double getXHighValue(int index) { + public double getXHighValue(/*@NonNegative*/ int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getXHighValue(); } @@ -159,7 +160,7 @@ public double getXHighValue(int index) { * * @return The y-value. */ - public double getYValue(int index) { + public double getYValue(/*@NonNegative*/ int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getYValue(); } @@ -174,7 +175,7 @@ public double getYValue(int index) { * * @since 1.0.5 */ - public double getYLowValue(int index) { + public double getYLowValue(/*@NonNegative*/ int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getYLowValue(); } @@ -189,7 +190,7 @@ public double getYLowValue(int index) { * * @since 1.0.5 */ - public double getYHighValue(int index) { + public double getYHighValue(/*@NonNegative*/ int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getYHighValue(); } @@ -202,7 +203,7 @@ public double getYHighValue(int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(int index) { + public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { return super.getDataItem(index); } diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index 040112b57..ca5555215 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -79,6 +79,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Collections; @@ -573,7 +574,7 @@ public void delete(int start, int end) { * * @return The item removed. */ - public XYDataItem remove(int index) { + public XYDataItem remove(/*@NonNegative*/ int index) { XYDataItem removed = (XYDataItem) this.data.remove(index); updateBoundsForRemovedItem(removed); fireSeriesChanged(); @@ -616,7 +617,7 @@ public void clear() { * * @return The data item with the specified index. */ - public XYDataItem getDataItem(int index) { + public XYDataItem getDataItem(/*@NonNegative*/ int index) { XYDataItem item = (XYDataItem) this.data.get(index); return (XYDataItem) item.clone(); } @@ -630,7 +631,7 @@ public XYDataItem getDataItem(int index) { * * @since 1.0.14 */ - XYDataItem getRawDataItem(int index) { + XYDataItem getRawDataItem(/*@NonNegative*/ int index) { return (XYDataItem) this.data.get(index); } @@ -641,7 +642,7 @@ XYDataItem getRawDataItem(int index) { * * @return The x-value (never {@code null}). */ - public Number getX(int index) { + public Number getX(/*@NonNegative*/ int index) { return getRawDataItem(index).getX(); } @@ -652,7 +653,7 @@ public Number getX(int index) { * * @return The y-value (possibly {@code null}). */ - public Number getY(int index) { + public Number getY(/*@NonNegative*/ int index) { return getRawDataItem(index).getY(); } @@ -703,7 +704,7 @@ private double maxIgnoreNaN(double a, double b) { * * @since 1.0.1 */ - public void updateByIndex(int index, Number y) { + public void updateByIndex(/*@NonNegative*/ int index, Number y) { XYDataItem item = getRawDataItem(index); // figure out if we need to iterate through all the y-values diff --git a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java index 02e7ef808..0581fb6fe 100644 --- a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java @@ -397,7 +397,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, int index) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int index) { XYSeries s = (XYSeries) this.data.get(series); return s.getY(index); } diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeries.java b/src/main/java/org/jfree/data/xy/YIntervalSeries.java index d991c170f..936ec6f96 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; @@ -114,7 +115,7 @@ public void add(YIntervalDataItem item, boolean notify) { * * @return The x-value (never {@code null}). */ - public Number getX(int index) { + public Number getX(/*@NonNegative*/ int index) { YIntervalDataItem item = (YIntervalDataItem) getDataItem(index); return item.getX(); } @@ -126,7 +127,7 @@ public Number getX(int index) { * * @return The y-value. */ - public double getYValue(int index) { + public double getYValue(/*@NonNegative*/ int index) { YIntervalDataItem item = (YIntervalDataItem) getDataItem(index); return item.getYValue(); } @@ -141,7 +142,7 @@ public double getYValue(int index) { * * @since 1.0.5 */ - public double getYLowValue(int index) { + public double getYLowValue(/*@NonNegative*/ int index) { YIntervalDataItem item = (YIntervalDataItem) getDataItem(index); return item.getYLowValue(); } @@ -156,7 +157,7 @@ public double getYLowValue(int index) { * * @since 1.0.5 */ - public double getYHighValue(int index) { + public double getYHighValue(/*@NonNegative*/ int index) { YIntervalDataItem item = (YIntervalDataItem) getDataItem(index); return item.getYHighValue(); } @@ -169,7 +170,7 @@ public double getYHighValue(int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(int index) { + public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { return super.getDataItem(index); } From 18d524b95e046ef3be0886902786f3385e98b489 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Tue, 5 Dec 2017 14:26:00 -0800 Subject: [PATCH 06/79] more annotations --- .../org/jfree/chart/LegendItemCollection.java | 4 +- .../jfree/chart/axis/CyclicNumberAxis.java | 29 +++++++++---- .../org/jfree/chart/entity/XYItemEntity.java | 4 +- .../AbstractCategoryItemLabelGenerator.java | 12 +++--- .../labels/AbstractXYItemLabelGenerator.java | 7 ++-- .../labels/BoxAndWhiskerToolTipGenerator.java | 5 ++- .../labels/BubbleXYItemLabelGenerator.java | 6 +-- .../labels/CategoryItemLabelGenerator.java | 7 ++-- .../labels/CategoryToolTipGenerator.java | 3 +- .../labels/CustomXYToolTipGenerator.java | 4 +- .../labels/HighLowItemLabelGenerator.java | 2 +- .../IntervalCategoryItemLabelGenerator.java | 6 ++- .../IntervalCategoryToolTipGenerator.java | 3 +- .../labels/IntervalXYItemLabelGenerator.java | 4 +- .../labels/IntervalXYToolTipGenerator.java | 7 ++-- .../StandardCategoryItemLabelGenerator.java | 3 +- .../StandardCategoryToolTipGenerator.java | 3 +- .../labels/StandardXYItemLabelGenerator.java | 2 +- .../labels/StandardXYToolTipGenerator.java | 2 +- .../labels/StandardXYZToolTipGenerator.java | 9 ++-- .../labels/SymbolicXYItemLabelGenerator.java | 2 +- .../chart/labels/XYItemLabelGenerator.java | 2 +- .../chart/labels/XYToolTipGenerator.java | 2 +- .../chart/labels/XYZToolTipGenerator.java | 2 +- .../plot/AbstractPieLabelDistributor.java | 4 +- .../chart/plot/CategoryCrosshairState.java | 3 +- .../org/jfree/chart/plot/CategoryPlot.java | 38 ++++++++++------- .../org/jfree/chart/plot/CrosshairState.java | 8 ++-- .../java/org/jfree/chart/plot/PolarPlot.java | 3 +- .../java/org/jfree/chart/plot/XYPlot.java | 13 +++--- .../org/jfree/chart/plot/dial/DialPlot.java | 6 +-- .../jfree/chart/plot/dial/DialPointer.java | 6 +-- .../chart/plot/dial/DialValueIndicator.java | 2 +- .../chart/renderer/AbstractRenderer.java | 20 ++++----- .../renderer/DefaultPolarItemRenderer.java | 4 +- .../org/jfree/chart/renderer/OutlierList.java | 3 +- .../chart/renderer/PolarItemRenderer.java | 2 +- .../AbstractCategoryItemRenderer.java | 14 +++---- .../chart/renderer/category/AreaRenderer.java | 4 +- .../chart/renderer/category/BarPainter.java | 5 ++- .../chart/renderer/category/BarRenderer.java | 6 +-- .../category/BoxAndWhiskerRenderer.java | 8 ++-- .../category/CategoryItemRenderer.java | 34 +++++++-------- .../category/CategoryStepRenderer.java | 4 +- .../renderer/category/GanttRenderer.java | 3 +- .../renderer/category/GradientBarPainter.java | 5 ++- .../category/GroupedStackedBarRenderer.java | 5 ++- .../category/IntervalBarRenderer.java | 5 ++- .../renderer/category/LayeredBarRenderer.java | 6 +-- .../renderer/category/LevelRenderer.java | 4 +- .../category/LineAndShapeRenderer.java | 10 ++--- .../category/MinMaxCategoryRenderer.java | 3 +- .../renderer/category/ScatterRenderer.java | 6 +-- .../category/StackedAreaRenderer.java | 2 +- .../renderer/category/StackedBarRenderer.java | 3 +- .../renderer/category/StandardBarPainter.java | 5 ++- .../category/StatisticalBarRenderer.java | 3 +- .../StatisticalLineAndShapeRenderer.java | 3 +- .../category/WaterfallBarRenderer.java | 3 +- .../renderer/xy/AbstractXYItemRenderer.java | 12 +++--- .../renderer/xy/CandlestickRenderer.java | 3 +- .../renderer/xy/ClusteredXYBarRenderer.java | 3 +- .../renderer/xy/CyclicXYItemRenderer.java | 17 ++++---- .../chart/renderer/xy/DeviationRenderer.java | 3 +- .../renderer/xy/GradientXYBarPainter.java | 5 ++- .../chart/renderer/xy/HighLowRenderer.java | 3 +- .../renderer/xy/SamplingXYLineRenderer.java | 2 +- .../renderer/xy/StackedXYAreaRenderer.java | 4 +- .../renderer/xy/StackedXYAreaRenderer2.java | 4 +- .../renderer/xy/StackedXYBarRenderer.java | 3 +- .../renderer/xy/StandardXYBarPainter.java | 5 ++- .../renderer/xy/StandardXYItemRenderer.java | 10 ++--- .../chart/renderer/xy/VectorRenderer.java | 3 +- .../chart/renderer/xy/WindItemRenderer.java | 3 +- .../chart/renderer/xy/XYAreaRenderer.java | 4 +- .../chart/renderer/xy/XYAreaRenderer2.java | 4 +- .../jfree/chart/renderer/xy/XYBarPainter.java | 5 ++- .../chart/renderer/xy/XYBarRenderer.java | 6 +-- .../chart/renderer/xy/XYBlockRenderer.java | 3 +- .../renderer/xy/XYBoxAndWhiskerRenderer.java | 4 +- .../chart/renderer/xy/XYBubbleRenderer.java | 4 +- .../renderer/xy/XYDifferenceRenderer.java | 8 ++-- .../chart/renderer/xy/XYDotRenderer.java | 4 +- .../chart/renderer/xy/XYErrorRenderer.java | 3 +- .../chart/renderer/xy/XYItemRenderer.java | 34 +++++++-------- .../renderer/xy/XYLineAndShapeRenderer.java | 14 +++---- .../chart/renderer/xy/XYShapeRenderer.java | 4 +- .../chart/renderer/xy/XYSplineRenderer.java | 3 +- .../chart/renderer/xy/XYStepAreaRenderer.java | 3 +- .../chart/renderer/xy/XYStepRenderer.java | 3 +- .../chart/renderer/xy/YIntervalRenderer.java | 2 +- .../jfree/chart/ui/NumberCellRenderer.java | 3 +- .../urls/CustomCategoryURLGenerator.java | 4 +- .../chart/urls/CustomXYURLGenerator.java | 4 +- .../chart/urls/StandardXYURLGenerator.java | 2 +- .../chart/urls/StandardXYZURLGenerator.java | 2 +- .../chart/urls/TimeSeriesURLGenerator.java | 2 +- .../org/jfree/chart/urls/XYURLGenerator.java | 2 +- .../org/jfree/chart/urls/XYZURLGenerator.java | 2 +- .../jfree/chart/util/AbstractObjectList.java | 2 +- .../java/org/jfree/chart/util/ObjectList.java | 3 +- .../jfree/data/ComparableObjectSeries.java | 5 ++- src/main/java/org/jfree/data/DataUtils.java | 9 ++-- .../org/jfree/data/DefaultKeyedValues.java | 6 +-- .../org/jfree/data/DefaultKeyedValues2D.java | 7 ++-- .../java/org/jfree/data/KeyedObjects.java | 6 +-- .../java/org/jfree/data/KeyedObjects2D.java | 7 ++-- .../java/org/jfree/data/KeyedValues2D.java | 5 ++- src/main/java/org/jfree/data/Values.java | 4 +- src/main/java/org/jfree/data/Values2D.java | 3 +- .../data/category/CategoryToPieDataset.java | 6 +-- .../data/category/DefaultCategoryDataset.java | 7 ++-- .../DefaultIntervalCategoryDataset.java | 6 +-- .../data/category/SlidingCategoryDataset.java | 7 ++-- .../data/gantt/GanttCategoryDataset.java | 11 ++--- .../gantt/SlidingGanttCategoryDataset.java | 16 +++---- .../java/org/jfree/data/gantt/TaskSeries.java | 4 +- .../data/gantt/TaskSeriesCollection.java | 18 ++++---- .../org/jfree/data/gantt/XYTaskDataset.java | 34 +++++++-------- .../data/general/AbstractSeriesDataset.java | 3 +- .../org/jfree/data/general/DatasetUtils.java | 2 +- .../jfree/data/general/DefaultPieDataset.java | 7 ++-- .../org/jfree/data/general/HeatMapUtils.java | 3 +- .../java/org/jfree/data/general/Series.java | 3 +- .../org/jfree/data/general/SeriesDataset.java | 5 ++- .../org/jfree/data/jdbc/JDBCXYDataset.java | 13 +++--- .../BoxAndWhiskerCategoryDataset.java | 19 +++++---- .../statistics/BoxAndWhiskerXYDataset.java | 18 ++++---- .../DefaultBoxAndWhiskerCategoryDataset.java | 26 ++++++------ .../DefaultBoxAndWhiskerXYDataset.java | 30 ++++++------- .../DefaultMultiValueCategoryDataset.java | 9 ++-- .../DefaultStatisticalCategoryDataset.java | 11 ++--- .../data/statistics/HistogramDataset.java | 16 +++---- .../statistics/MultiValueCategoryDataset.java | 3 +- .../data/statistics/SimpleHistogramBin.java | 3 +- .../statistics/SimpleHistogramDataset.java | 28 ++++++------- .../StatisticalCategoryDataset.java | 5 ++- .../time/DynamicTimeSeriesCollection.java | 22 +++++----- .../org/jfree/data/time/MovingAverage.java | 16 ++++--- .../java/org/jfree/data/time/Quarter.java | 18 ++++---- .../org/jfree/data/time/TimePeriodValues.java | 31 +++++++------- .../data/time/TimePeriodValuesCollection.java | 16 +++---- .../java/org/jfree/data/time/TimeSeries.java | 3 +- .../jfree/data/time/TimeSeriesCollection.java | 21 +++++----- .../jfree/data/time/TimeSeriesTableModel.java | 11 ++--- .../jfree/data/time/TimeTableXYDataset.java | 26 ++++++------ .../data/time/ohlc/OHLCSeriesCollection.java | 30 ++++++------- .../data/xy/AbstractIntervalXYDataset.java | 8 ++-- .../org/jfree/data/xy/AbstractXYDataset.java | 4 +- .../org/jfree/data/xy/AbstractXYZDataset.java | 2 +- .../jfree/data/xy/CategoryTableXYDataset.java | 18 ++++---- .../jfree/data/xy/DefaultHighLowDataset.java | 30 ++++++------- .../data/xy/DefaultIntervalXYDataset.java | 42 +++++++++++-------- .../org/jfree/data/xy/DefaultOHLCDataset.java | 30 ++++++------- .../jfree/data/xy/DefaultTableXYDataset.java | 16 +++---- .../org/jfree/data/xy/DefaultWindDataset.java | 19 +++++---- .../org/jfree/data/xy/DefaultXYDataset.java | 27 +++++++----- .../org/jfree/data/xy/DefaultXYZDataset.java | 31 ++++++++------ .../org/jfree/data/xy/IntervalXYDataset.java | 16 +++---- .../org/jfree/data/xy/IntervalXYDelegate.java | 8 ++-- .../org/jfree/data/xy/IntervalXYZDataset.java | 12 +++--- .../java/org/jfree/data/xy/MatrixSeries.java | 22 +++++----- .../jfree/data/xy/MatrixSeriesCollection.java | 17 ++++---- .../jfree/data/xy/NormalizedMatrixSeries.java | 3 +- .../java/org/jfree/data/xy/OHLCDataset.java | 20 ++++----- .../org/jfree/data/xy/TableXYDataset.java | 3 +- .../jfree/data/xy/VectorSeriesCollection.java | 21 +++++----- .../org/jfree/data/xy/VectorXYDataset.java | 6 +-- .../java/org/jfree/data/xy/WindDataset.java | 4 +- .../data/xy/XIntervalSeriesCollection.java | 22 +++++----- .../java/org/jfree/data/xy/XYBarDataset.java | 28 ++++++------- .../java/org/jfree/data/xy/XYDataset.java | 10 ++--- .../jfree/data/xy/XYDatasetTableModel.java | 9 ++-- .../data/xy/XYIntervalSeriesCollection.java | 26 ++++++------ .../java/org/jfree/data/xy/XYItemKey.java | 3 +- src/main/java/org/jfree/data/xy/XYSeries.java | 5 ++- .../org/jfree/data/xy/XYSeriesCollection.java | 17 ++++---- .../java/org/jfree/data/xy/XYZDataset.java | 4 +- .../java/org/jfree/data/xy/XisSymbolic.java | 2 +- .../data/xy/YIntervalSeriesCollection.java | 22 +++++----- .../java/org/jfree/data/xy/YisSymbolic.java | 2 +- .../category/BoxAndWhiskerRendererTest.java | 4 +- .../general/TestIntervalCategoryDataset.java | 6 +-- 183 files changed, 903 insertions(+), 772 deletions(-) diff --git a/src/main/java/org/jfree/chart/LegendItemCollection.java b/src/main/java/org/jfree/chart/LegendItemCollection.java index f17067bf1..0614ee1b8 100644 --- a/src/main/java/org/jfree/chart/LegendItemCollection.java +++ b/src/main/java/org/jfree/chart/LegendItemCollection.java @@ -44,7 +44,7 @@ */ package org.jfree.chart; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Iterator; @@ -104,7 +104,7 @@ public LegendItem get(/*@NonNegative*/ int index) { * * @return The item count. */ - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.items.size(); } diff --git a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java index 71c1cce8e..569906cb0 100644 --- a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java +++ b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java @@ -52,6 +52,7 @@ /*>>> import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; @@ -480,7 +481,9 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.TOP_RIGHT : TextAnchor.BOTTOM_RIGHT; - result.remove(result.size() - 1); + @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already + /*@NonNegative*/ int lastTickIndex = result.size() - 1; + result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -499,7 +502,9 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.BOTTOM_RIGHT; - result.remove(result.size() - 1); + @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already + /*@NonNegative*/ int lastTickIndex = result.size() - 1; + result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -517,7 +522,9 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.TOP_LEFT : TextAnchor.TOP_RIGHT; - result.remove(result.size() - 1); + @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already + /*@NonNegative*/ int lastTickIndex = result.size() - 1; + result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -628,7 +635,9 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.BOTTOM_RIGHT; - result.remove(result.size() - 1); + @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already + /*@NonNegative*/ int lastTickIndex = result.size() - 1; + result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -647,7 +656,9 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_RIGHT : TextAnchor.BOTTOM_LEFT; - result.remove(result.size() - 1); + @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already + /*@NonNegative*/ int lastTickIndex = result.size() - 1; + result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -668,7 +679,9 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_RIGHT : TextAnchor.TOP_RIGHT; - result.remove(result.size() - 1); + @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already + /*@NonNegative*/ int lastTickIndex = result.size() - 1; + result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -686,7 +699,9 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.TOP_LEFT; - result.remove(result.size() - 1); + @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already + /*@NonNegative*/ int lastTickIndex = result.size() - 1; + result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, diff --git a/src/main/java/org/jfree/chart/entity/XYItemEntity.java b/src/main/java/org/jfree/chart/entity/XYItemEntity.java index 02933b47f..cb2d224c9 100644 --- a/src/main/java/org/jfree/chart/entity/XYItemEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYItemEntity.java @@ -87,7 +87,7 @@ public class XYItemEntity extends ChartEntity { * @param urlText the URL text for HTML image maps. */ public XYItemEntity(Shape area, - XYDataset dataset, /*@NonNegative*/ int series, int item, + XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item, String toolTipText, String urlText) { super(area, toolTipText, urlText); this.dataset = dataset; @@ -145,7 +145,7 @@ public int getItem() { * * @param item the item index (zero-based). */ - public void setItem(int item) { + public void setItem(/*@NonNegative*/ int item) { this.item = item; } diff --git a/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java index 2622e0295..9f622c644 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java @@ -45,6 +45,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.MinLen; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.text.DateFormat; @@ -158,7 +160,7 @@ protected AbstractCategoryItemLabelGenerator(String labelFormat, * * @return The label. */ - public String generateRowLabel(CategoryDataset dataset, int row) { + public String generateRowLabel(CategoryDataset dataset, /*@NonNegative*/ int row) { return dataset.getRowKey(row).toString(); } @@ -170,7 +172,7 @@ public String generateRowLabel(CategoryDataset dataset, int row) { * * @return The label. */ - public String generateColumnLabel(CategoryDataset dataset, int column) { + public String generateColumnLabel(CategoryDataset dataset, /*@NonNegative*/ int column) { return dataset.getColumnKey(column).toString(); } @@ -211,7 +213,7 @@ public DateFormat getDateFormat() { * @return The label (possibly {@code null}). */ protected String generateLabelString(CategoryDataset dataset, - int row, int column) { + int row, /*@NonNegative*/ int column) { Args.nullNotPermitted(dataset, "dataset"); String result; Object[] items = createItemArray(dataset, row, column); @@ -230,8 +232,8 @@ protected String generateLabelString(CategoryDataset dataset, * * @return The items (never {@code null}). */ - protected Object[] createItemArray(CategoryDataset dataset, - int row, int column) { + protected Object /*@MinLen(4)*/ [] createItemArray(CategoryDataset dataset, + /*@NonNegative*/ int row, /*@NonNegative*/ int column) { Object[] result = new Object[4]; result[0] = dataset.getRowKey(row).toString(); result[1] = dataset.getColumnKey(column).toString(); diff --git a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java index d8c532123..758eefa3e 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -237,7 +238,7 @@ public DateFormat getYDateFormat() { * * @return The label (possibly {@code null}). */ - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { String result; Object[] items = createItemArray(dataset, series, item); result = MessageFormat.format(this.formatString, items); @@ -266,8 +267,8 @@ public String getNullYString() { * @return An array of three items from the dataset formatted as * {@code String} objects (never {@code null}). */ - protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - int item) { + protected Object /*@MinLen(3)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, + /*@NonNegative*/ int item) { Object[] result = new Object[3]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java index 133031f1e..73a805347 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -112,8 +113,8 @@ public BoxAndWhiskerToolTipGenerator(String format, * @return The items (never {@code null}). */ @Override - protected Object[] createItemArray(CategoryDataset dataset, /*@NonNegative*/ int series, - int item) { + protected Object /*@MinLen(8)*/ [] createItemArray(CategoryDataset dataset, /*@NonNegative*/ int series, + /*@NonNegative*/ int item) { Object[] result = new Object[8]; result[0] = dataset.getRowKey(series); Number y = dataset.getValue(series, item); diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index c8b4a6f84..d8497d20b 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -165,7 +165,7 @@ public DateFormat getZDateFormat() { * @return The item label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return generateLabelString(dataset, series, item); } @@ -179,7 +179,7 @@ public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int * @return The label (possibly {@code null}). */ @Override - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { String result; Object[] items; if (dataset instanceof XYZDataset) { @@ -203,7 +203,7 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series * @return The items (never {@code null}). */ protected Object[] createItemArray(XYZDataset dataset, - int series, int item) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item) { Object[] result = new Object[4]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java index 8e4a2b178..6be3085f0 100644 --- a/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java @@ -58,6 +58,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.category.CategoryDataset; @@ -80,7 +81,7 @@ public interface CategoryItemLabelGenerator { * * @return The label. */ - public String generateRowLabel(CategoryDataset dataset, int row); + public String generateRowLabel(CategoryDataset dataset, /*@NonNegative*/ int row); /** * Generates a label for the specified row. @@ -90,7 +91,7 @@ public interface CategoryItemLabelGenerator { * * @return The label. */ - public String generateColumnLabel(CategoryDataset dataset, int column); + public String generateColumnLabel(CategoryDataset dataset, /*@NonNegative*/ int column); /** * Generates a label for the specified item. The label is typically a @@ -102,6 +103,6 @@ public interface CategoryItemLabelGenerator { * * @return The label (possibly {@code null}). */ - public String generateLabel(CategoryDataset dataset, int row, int column); + public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column); } diff --git a/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java index dd92e7fdf..dcc64af37 100644 --- a/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.category.CategoryDataset; @@ -66,6 +67,6 @@ public interface CategoryToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(CategoryDataset dataset, int row, int column); + public String generateToolTip(CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column); } diff --git a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java index 0d186b223..7d30b21fa 100644 --- a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java @@ -110,7 +110,7 @@ public int getToolTipCount(int list) { * * @return The tool tip text. */ - public String getToolTipText(/*@NonNegative*/ int series, int item) { + public String getToolTipText(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { String result = null; @@ -145,7 +145,7 @@ public void addToolTipSeries(List toolTips) { * @return The tooltip text. */ @Override - public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, int item) { + public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getToolTipText(series, item); } diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index 0fb9cbc3d..bb534e73a 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -122,7 +122,7 @@ public HighLowItemLabelGenerator(DateFormat dateFormatter, * @return The tooltip text. */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { if (!(dataset instanceof OHLCDataset)) { return null; } diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java index a0d081fcb..1616d7a79 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java @@ -39,6 +39,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.MinLen; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.text.DateFormat; @@ -106,8 +108,8 @@ public IntervalCategoryItemLabelGenerator(String labelFormat, * @return The items (never {@code null}). */ @Override - protected Object[] createItemArray(CategoryDataset dataset, - int row, int column) { + protected Object /*@MinLen(5)*/ [] createItemArray(CategoryDataset dataset, + /*@NonNegative*/ int row, /*@NonNegative*/ int column) { Object[] result = new Object[5]; result[0] = dataset.getRowKey(row).toString(); result[1] = dataset.getColumnKey(column).toString(); diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java index da51a5e41..4612bdadb 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.text.DateFormat; import java.text.NumberFormat; @@ -104,7 +105,7 @@ public IntervalCategoryToolTipGenerator(String labelFormat, */ @Override protected Object[] createItemArray(CategoryDataset dataset, - int row, int column) { + int row, /*@NonNegative*/ int column) { Object[] result = new Object[5]; result[0] = dataset.getRowKey(row).toString(); result[1] = dataset.getColumnKey(column).toString(); diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index d417310d2..620405863 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -154,7 +154,7 @@ public IntervalXYItemLabelGenerator(String formatString, */ @Override protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - int item) { + /*@NonNegative*/ int item) { IntervalXYDataset intervalDataset = null; if (dataset instanceof IntervalXYDataset) { @@ -239,7 +239,7 @@ protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int serie * @return The label text (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index 819c36e58..3acf7a026 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -150,8 +151,8 @@ public IntervalXYToolTipGenerator(String formatString, * {@code String} objects (never {@code null}). */ @Override - protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - int item) { + protected Object/*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, + /*@NonNegative*/ int item) { IntervalXYDataset intervalDataset = null; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; @@ -231,7 +232,7 @@ protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int serie * @return The tool tip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java index b7da96d12..da2f791b3 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java @@ -42,6 +42,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.text.DateFormat; @@ -124,7 +125,7 @@ public StandardCategoryItemLabelGenerator(String labelFormat, * @return The label (possibly {@code null}). */ @Override - public String generateLabel(CategoryDataset dataset, int row, int column) { + public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { return generateLabelString(dataset, row, column); } diff --git a/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java index af6901b2e..25aae45ae 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.text.DateFormat; @@ -107,7 +108,7 @@ public StandardCategoryToolTipGenerator(String labelFormat, */ @Override public String generateToolTip(CategoryDataset dataset, - int row, int column) { + int row, /*@NonNegative*/ int column) { return generateLabelString(dataset, row, column); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java index a736fa17d..a6a64ff12 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java @@ -184,7 +184,7 @@ public StandardXYItemLabelGenerator(String formatString, * @return The label text (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java index 6f9ea7954..70c44dd3a 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java @@ -166,7 +166,7 @@ public StandardXYToolTipGenerator(String formatString, * @return The tooltip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index e7ec700c0..113a76406 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -161,7 +162,7 @@ public DateFormat getZDateFormat() { * @return The tooltip text (possibly {@code null}). */ @Override - public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return generateLabelString(dataset, series, item); } @@ -175,7 +176,7 @@ public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, i * @return The label (possibly {@code null}). */ @Override - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { String result; Object[] items = createItemArray((XYZDataset) dataset, series, item); result = MessageFormat.format(getFormatString(), items); @@ -192,8 +193,8 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series * * @return The items (never {@code null}). */ - protected Object[] createItemArray(XYZDataset dataset, - int series, int item) { + protected Object /*@MinLen(4)*/ [] createItemArray(XYZDataset dataset, + /*@NonNegative*/ int series, /*@NonNegative*/ int item) { Object[] result = new Object[4]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java index 98e3efcfe..139e5a993 100644 --- a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java @@ -82,7 +82,7 @@ public class SymbolicXYItemLabelGenerator implements XYItemLabelGenerator, * @return The tool tip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, int item) { + public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { String xStr, yStr; if (data instanceof YisSymbolic) { diff --git a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java index 2373410ed..39b95235b 100644 --- a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java @@ -70,6 +70,6 @@ public interface XYItemLabelGenerator { * * @return The label (possibly {@code null}). */ - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int item); + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java index 8999cc3c5..a17d6b294 100644 --- a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java @@ -64,6 +64,6 @@ public interface XYToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, int item); + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java index 5a097f8ab..b33e5da7d 100644 --- a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java @@ -63,6 +63,6 @@ public interface XYZToolTipGenerator extends XYToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, int item); + public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java b/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java index c059b86b5..8a7613dd1 100644 --- a/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java +++ b/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.List; @@ -90,7 +90,7 @@ public void addPieLabelRecord(PieLabelRecord record) { * * @return The item count. */ - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.labels.size(); } diff --git a/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java b/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java index 19358c2a8..8df884145 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.geom.Point2D; @@ -122,7 +123,7 @@ public void setColumnKey(Comparable key) { * @param orientation the plot orientation. */ public void updateCrosshairPoint(Comparable rowKey, Comparable columnKey, - double value, int datasetIndex, double transX, double transY, + double value, /*@NonNegative*/ int datasetIndex, double transX, double transY, PlotOrientation orientation) { Point2D anchor = getAnchor(); diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 0d94ff486..cc457406d 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -186,6 +186,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; @@ -592,17 +593,17 @@ public CategoryPlot(CategoryDataset dataset, CategoryAxis domainAxis, this.orientation = PlotOrientation.VERTICAL; // allocate storage for dataset, axes and renderers - this.domainAxes = new HashMap(); - this.domainAxisLocations = new HashMap(); - this.rangeAxes = new HashMap(); - this.rangeAxisLocations = new HashMap(); + this.domainAxes = new HashMap(); + this.domainAxisLocations = new HashMap(); + this.rangeAxes = new HashMap(); + this.rangeAxisLocations = new HashMap(); this.datasetToDomainAxesMap = new TreeMap(); this.datasetToRangeAxesMap = new TreeMap(); - this.renderers = new HashMap(); + this.renderers = new HashMap(); - this.datasets = new HashMap(); + this.datasets = new HashMap(); this.datasets.put(0, dataset); if (dataset != null) { dataset.addChangeListener(this); @@ -1133,7 +1134,7 @@ public void setRangeAxes(ValueAxis[] axes) { return result; } - private int findRangeAxisIndex(ValueAxis axis) { + private /*@GTENegativeOne*/ int findRangeAxisIndex(ValueAxis axis) { for (Entry entry : this.rangeAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); @@ -2185,7 +2186,8 @@ public LegendItemCollection getLegendItems() { // get the legend items for the datasets... for (CategoryDataset dataset: this.datasets.values()) { if (dataset != null) { - int datasetIndex = indexOf(dataset); + @SuppressWarnings("index") // indexOf cannot return -1 here because we're looking up the indexOf an element we already know is in the dataset + /*@NonNegative*/ int datasetIndex = indexOf(dataset); CategoryItemRenderer renderer = getRenderer(datasetIndex); if (renderer != null) { result.addAll(renderer.getLegendItems()); @@ -3384,7 +3386,8 @@ protected AxisSpace calculateDomainAxisSpace(Graphics2D g2, // reserve space for any domain axes... for (CategoryAxis xAxis : this.domainAxes.values()) { if (xAxis != null) { - int i = getDomainAxisIndex(xAxis); + @SuppressWarnings("index") // xAxis is guaranteed to be in the set, so IndexOf returns NN + /*@NonNegative*/ int i = getDomainAxisIndex(xAxis); RectangleEdge edge = getDomainAxisEdge(i); space = xAxis.reserveSpace(g2, this, plotArea, edge, space); } @@ -3428,7 +3431,8 @@ protected AxisSpace calculateRangeAxisSpace(Graphics2D g2, // reserve space for the range axes (if any)... for (ValueAxis yAxis : this.rangeAxes.values()) { if (yAxis != null) { - int i = findRangeAxisIndex(yAxis); + @SuppressWarnings("index") // yAxis is guaranteed to be in the set, so indexOf returns NN + /*@NonNegative*/ int i = findRangeAxisIndex(yAxis); RectangleEdge edge = getRangeAxisEdge(i); space = yAxis.reserveSpace(g2, this, plotArea, edge, space); } @@ -3705,7 +3709,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ - private List getDatasetIndices(DatasetRenderingOrder order) { + private List getDatasetIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Map.Entry entry : this.datasets.entrySet()) { @@ -3728,7 +3732,7 @@ private List getDatasetIndices(DatasetRenderingOrder order) { * * @return A list of indices. */ - private List getRendererIndices(DatasetRenderingOrder order) { + private List getRendererIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Map.Entry entry: this.renderers.entrySet()) { @@ -3778,7 +3782,8 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add domain axes to lists... for (CategoryAxis xAxis : this.domainAxes.values()) { if (xAxis != null) { - int index = getDomainAxisIndex(xAxis); + @SuppressWarnings("index") // xAxis is guaranteed to have an index, so getDomainAxisIndex return NN + /*@NonNegative*/ int index = getDomainAxisIndex(xAxis); axisCollection.add(xAxis, getDomainAxisEdge(index)); } } @@ -3786,7 +3791,8 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add range axes to lists... for (ValueAxis yAxis : this.rangeAxes.values()) { if (yAxis != null) { - int index = findRangeAxisIndex(yAxis); + @SuppressWarnings("index") // yAxis is guaranteed to have an index, so getRangeAxisIndex return NN + /*@NonNegative*/ int index = findRangeAxisIndex(yAxis); axisCollection.add(yAxis, getRangeAxisEdge(index)); } } @@ -4066,7 +4072,7 @@ protected void drawAnnotations(Graphics2D g2, Rectangle2D dataArea) { * @see #drawRangeMarkers(Graphics2D, Rectangle2D, int, Layer) */ protected void drawDomainMarkers(Graphics2D g2, Rectangle2D dataArea, - int index, Layer layer) { + /*@NonNegative*/ int index, Layer layer) { CategoryItemRenderer r = getRenderer(index); if (r == null) { @@ -4164,7 +4170,7 @@ else if (this.orientation == PlotOrientation.VERTICAL) { * @since 1.0.11 */ protected void drawDomainCrosshair(Graphics2D g2, Rectangle2D dataArea, - PlotOrientation orientation, int datasetIndex, + PlotOrientation orientation, /*@NonNegative*/ int datasetIndex, Comparable rowKey, Comparable columnKey, Stroke stroke, Paint paint) { diff --git a/src/main/java/org/jfree/chart/plot/CrosshairState.java b/src/main/java/org/jfree/chart/plot/CrosshairState.java index 0510620ee..ae4a0d136 100644 --- a/src/main/java/org/jfree/chart/plot/CrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CrosshairState.java @@ -52,7 +52,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.geom.Point2D; @@ -157,7 +157,7 @@ public void setCrosshairDistance(double distance) { * @param transY the y-value in Java2D space. * @param orientation the plot orientation ({@code null} not permitted). */ - public void updateCrosshairPoint(double x, double y, int datasetIndex, + public void updateCrosshairPoint(double x, double y, /*@NonNegative*/ int datasetIndex, double transX, double transY, PlotOrientation orientation) { if (this.anchor != null) { @@ -199,7 +199,7 @@ public void updateCrosshairPoint(double x, double y, int datasetIndex, * * @since 1.0.20 */ - public void updateCrosshairX(double x, double transX, int datasetIndex) { + public void updateCrosshairX(double x, double transX, /*@NonNegative*/ int datasetIndex) { if (this.anchor == null) { return; } @@ -224,7 +224,7 @@ public void updateCrosshairX(double x, double transX, int datasetIndex) { * * @since 1.0.20 */ - public void updateCrosshairY(double candidateY, double transY, int datasetIndex) { + public void updateCrosshairY(double candidateY, double transY, /*@NonNegative*/ int datasetIndex) { if (this.anchor == null) { return; } diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index 42b58b6cc..1da7f3612 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -61,6 +61,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -621,7 +622,7 @@ public int getDatasetCount() { * * @since 1.0.14 */ - public int indexOf(XYDataset dataset) { + public /*@GTENegativeOne*/ int indexOf(XYDataset dataset) { int result = -1; for (int i = 0; i < this.datasets.size(); i++) { if (dataset == this.datasets.get(i)) { diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 0ac62e56a..b2e9401f4 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -234,6 +234,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /*>>> @@ -1423,7 +1424,7 @@ public int getDatasetCount() { * * @return The index or -1. */ - public int indexOf(XYDataset dataset) { + public /*@GTENegativeOne*/ int indexOf(XYDataset dataset) { for (Map.Entry entry: this.datasets.entrySet()) { if (dataset == entry.getValue()) { return entry.getKey(); @@ -3375,9 +3376,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ - private List getDatasetIndices(DatasetRenderingOrder order) { + private List< /*@NonNegative*/ Integer> getDatasetIndices(DatasetRenderingOrder order) { List result = new ArrayList(); - for (Entry entry : this.datasets.entrySet()) { + for (Entry< /*@NonNegative*/ Integer, XYDataset> entry : this.datasets.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); } @@ -3389,9 +3390,9 @@ private List getDatasetIndices(DatasetRenderingOrder order) { return result; } - private List getRendererIndices(DatasetRenderingOrder order) { + private List< /*@NonNegative*/ Integer> getRendererIndices(DatasetRenderingOrder order) { List result = new ArrayList(); - for (Entry entry : this.renderers.entrySet()) { + for (Entry< /*@NonNegative*/ Integer, XYItemRenderer> entry : this.renderers.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); } @@ -5238,7 +5239,7 @@ public boolean isRangeZoomable() { * * @return The series count. */ - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { int result = 0; XYDataset dataset = getDataset(); if (dataset != null) { diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java index b1eb97096..4b6b567fd 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java @@ -435,7 +435,7 @@ public void removePointer(DialPointer pointer) { * * @return The pointer. */ - public DialPointer getPointerForDataset(int datasetIndex) { + public DialPointer getPointerForDataset(/*@NonNegative*/ int datasetIndex) { DialPointer result = null; Iterator iterator = this.pointers.iterator(); while (iterator.hasNext()) { @@ -625,7 +625,7 @@ private Rectangle2D viewToFrame(Rectangle2D view) { * * @return The data value. */ - public double getValue(int datasetIndex) { + public double getValue(/*@NonNegative*/ int datasetIndex) { double result = Double.NaN; ValueDataset dataset = getDataset(datasetIndex); if (dataset != null) { @@ -689,7 +689,7 @@ public void mapDatasetToScale(/*@NonNegative*/ int index, int scaleIndex) { * * @return The dial scale. */ - public DialScale getScaleForDataset(int datasetIndex) { + public DialScale getScaleForDataset(/*@NonNegative*/ int datasetIndex) { DialScale result = (DialScale) this.scales.get(0); Integer scaleIndex = (Integer) this.datasetToScaleMap.get(datasetIndex); if (scaleIndex != null) { diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java index bcb8609b2..0233dfadf 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java @@ -95,7 +95,7 @@ protected DialPointer() { * * @param datasetIndex the dataset index. */ - protected DialPointer(int datasetIndex) { + protected DialPointer(/*@NonNegative*/ int datasetIndex) { this.radius = 0.9; this.datasetIndex = datasetIndex; } @@ -236,7 +236,7 @@ public Pin() { * * @param datasetIndex the dataset index. */ - public Pin(int datasetIndex) { + public Pin(/*@NonNegative*/ int datasetIndex) { super(datasetIndex); this.paint = Color.RED; this.stroke = new BasicStroke(3.0f, BasicStroke.CAP_ROUND, @@ -429,7 +429,7 @@ public Pointer() { * * @param datasetIndex the dataset index. */ - public Pointer(int datasetIndex) { + public Pointer(/*@NonNegative*/ int datasetIndex) { super(datasetIndex); this.widthRadius = 0.05; this.fillPaint = Color.GRAY; diff --git a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java index 9021ac8d4..dc57e9a4a 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java @@ -149,7 +149,7 @@ public DialValueIndicator() { * * @param datasetIndex the dataset index. */ - public DialValueIndicator(int datasetIndex) { + public DialValueIndicator(/*@NonNegative*/ int datasetIndex) { this.datasetIndex = datasetIndex; this.angle = -90.0; this.radius = 0.3; diff --git a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java index 0f7eb4d55..c81e346a5 100644 --- a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java @@ -516,7 +516,7 @@ protected void endElementGroup(Graphics2D g2) { * * @return A boolean. */ - public boolean getItemVisible(/*@NonNegative*/ int series, int item) { + public boolean getItemVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return isSeriesVisible(series); } @@ -756,7 +756,7 @@ public void setDefaultSeriesVisibleInLegend(boolean visible, * * @return The paint (never {@code null}). */ - public Paint getItemPaint(int row, int column) { + public Paint getItemPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return lookupSeriesPaint(row); } @@ -925,7 +925,7 @@ public void setAutoPopulateSeriesPaint(boolean auto) { * * @return The paint (never {@code null}). */ - public Paint getItemFillPaint(int row, int column) { + public Paint getItemFillPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return lookupSeriesFillPaint(row); } @@ -1084,7 +1084,7 @@ public void setAutoPopulateSeriesFillPaint(boolean auto) { * * @return The paint (never {@code null}). */ - public Paint getItemOutlinePaint(int row, int column) { + public Paint getItemOutlinePaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return lookupSeriesOutlinePaint(row); } @@ -1241,7 +1241,7 @@ public void setAutoPopulateSeriesOutlinePaint(boolean auto) { * * @return The stroke (never {@code null}). */ - public Stroke getItemStroke(int row, int column) { + public Stroke getItemStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return lookupSeriesStroke(row); } @@ -1411,7 +1411,7 @@ public void setAutoPopulateSeriesStroke(boolean auto) { * * @return The stroke (never {@code null}). */ - public Stroke getItemOutlineStroke(int row, int column) { + public Stroke getItemOutlineStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return lookupSeriesOutlineStroke(row); } @@ -1570,7 +1570,7 @@ public void setAutoPopulateSeriesOutlineStroke(boolean auto) { * * @return The shape (never {@code null}). */ - public Shape getItemShape(int row, int column) { + public Shape getItemShape(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return lookupSeriesShape(row); } @@ -1723,7 +1723,7 @@ public void setAutoPopulateSeriesShape(boolean auto) { * * @return A boolean. */ - public boolean isItemLabelVisible(int row, int column) { + public boolean isItemLabelVisible(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return isSeriesItemLabelsVisible(row); } @@ -1834,7 +1834,7 @@ public void setDefaultItemLabelsVisible(boolean visible, boolean notify) { * * @return The font (never {@code null}). */ - public Font getItemLabelFont(int row, int column) { + public Font getItemLabelFont(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Font result = getSeriesItemLabelFont(row); if (result == null) { result = this.defaultItemLabelFont; @@ -1938,7 +1938,7 @@ public void setDefaultItemLabelFont(Font font, boolean notify) { * * @return The paint (never {@code null}). */ - public Paint getItemLabelPaint(int row, int column) { + public Paint getItemLabelPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Paint result = getSeriesItemLabelPaint(row); if (result == null) { result = this.defaultItemLabelPaint; diff --git a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java index 40116f74f..5eb733393 100644 --- a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java @@ -459,7 +459,7 @@ public void setLegendLine(Shape line) { * used if {@code area} is {@code null}). */ protected void addEntity(EntityCollection entities, Shape area, - XYDataset dataset, /*@NonNegative*/ int series, int item, + XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item, double entityX, double entityY) { if (!getItemCreateEntity(series, item)) { return; @@ -750,7 +750,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int series) { * @since 1.0.14 */ @Override - public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, int item) { + public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYToolTipGenerator generator = (XYToolTipGenerator) this.toolTipGeneratorList.get(series); if (generator == null) { diff --git a/src/main/java/org/jfree/chart/renderer/OutlierList.java b/src/main/java/org/jfree/chart/renderer/OutlierList.java index 2ef1d57f9..2cbb9446d 100644 --- a/src/main/java/org/jfree/chart/renderer/OutlierList.java +++ b/src/main/java/org/jfree/chart/renderer/OutlierList.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.renderer; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.geom.Point2D; import java.util.ArrayList; @@ -103,7 +104,7 @@ public boolean add(Outlier outlier) { * * @return The item count. */ - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.outliers.size(); } diff --git a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java index b385b6e4e..ecc761aab 100644 --- a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java @@ -153,7 +153,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * * @since 1.0.14 */ - public XYToolTipGenerator getToolTipGenerator(int row, int column); + public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the tool tip generator for a series. diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 8542dae55..0f5e3a79a 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -294,7 +294,7 @@ public void setPlot(CategoryPlot plot) { * @return The generator (possibly {@code null}). */ @Override - public CategoryItemLabelGenerator getItemLabelGenerator(int row, + public CategoryItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int row, int column) { return getSeriesItemLabelGenerator(row); } @@ -413,7 +413,7 @@ public void setDefaultItemLabelGenerator( * @return The generator (possibly {@code null}). */ @Override - public CategoryToolTipGenerator getToolTipGenerator(int row, int column) { + public CategoryToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { CategoryToolTipGenerator result = getSeriesToolTipGenerator(row); if (result == null) { @@ -526,7 +526,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, boole * @return The URL generator. */ @Override - public CategoryURLGenerator getItemURLGenerator(int row, int column) { + public CategoryURLGenerator getItemURLGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getSeriesItemURLGenerator(row); } @@ -1250,7 +1250,7 @@ protected Point2D calculateRangeMarkerTextAnchorPoint(Graphics2D g2, * @see #getLegendItems() */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot p = getPlot(); if (p == null) { @@ -1429,7 +1429,7 @@ protected void updateCrosshairValues(CategoryCrosshairState crosshairState, * label position). */ protected void drawItemLabel(Graphics2D g2, PlotOrientation orientation, - CategoryDataset dataset, int row, int column, + CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, double x, double y, boolean negative) { CategoryItemLabelGenerator generator = getItemLabelGenerator(row, @@ -1701,7 +1701,7 @@ public void setLegendItemURLGenerator( * @param hotspot the hotspot ({@code null} not permitted). */ protected void addItemEntity(EntityCollection entities, - CategoryDataset dataset, int row, int column, Shape hotspot) { + CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, Shape hotspot) { Args.nullNotPermitted(hotspot, "hotspot"); if (!getItemCreateEntity(row, column)) { return; @@ -1738,7 +1738,7 @@ protected void addItemEntity(EntityCollection entities, * @since 1.0.13 */ protected void addEntity(EntityCollection entities, Shape hotspot, - CategoryDataset dataset, int row, int column, + CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, double entityX, double entityY) { if (!getItemCreateEntity(row, column)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java index 5c8262591..a7d90975a 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java @@ -161,7 +161,7 @@ public void setEndType(AreaRendererEndType type) { * @return The legend item. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { // if there is no plot, there is no dataset to access... CategoryPlot cp = getPlot(); @@ -225,7 +225,7 @@ public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { // do nothing if item is not visible or null diff --git a/src/main/java/org/jfree/chart/renderer/category/BarPainter.java b/src/main/java/org/jfree/chart/renderer/category/BarPainter.java index 4522152fd..43a0e9d46 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarPainter.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.RectangularShape; @@ -72,7 +73,7 @@ public interface BarPainter { * @param base the base of the bar. */ public void paintBar(Graphics2D g2, BarRenderer renderer, - int row, int column, RectangularShape bar, RectangleEdge base); + int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base); /** * Paints the shadow for a single bar on behalf of a renderer. @@ -86,7 +87,7 @@ public void paintBar(Graphics2D g2, BarRenderer renderer, * @param pegShadow peg the shadow to the base of the bar? */ public void paintBarShadow(Graphics2D g2, BarRenderer renderer, - int row, int column, RectangularShape bar, RectangleEdge base, + int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, boolean pegShadow); } diff --git a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java index 54b157f7a..d5eefa5bb 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java @@ -831,7 +831,7 @@ else if (orientation == PlotOrientation.VERTICAL) { protected double calculateBarW0(CategoryPlot plot, PlotOrientation orientation, Rectangle2D dataArea, CategoryAxis domainAxis, CategoryItemRendererState state, - int row, int column) { + int row, /*@NonNegative*/ int column) { // calculate bar width... double space; if (orientation == PlotOrientation.HORIZONTAL) { @@ -921,7 +921,7 @@ public Range findRangeBounds(CategoryDataset dataset, * @return The legend item (possibly {@code null}). */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot cp = getPlot(); if (cp == null) { @@ -988,7 +988,7 @@ urlText, true, shape, true, paint, isDrawBarOutline(), @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, int column, int pass) { // nothing is drawn if the row index is not included in the list with diff --git a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java index 8cb373070..c47bd64ca 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java @@ -455,7 +455,7 @@ public void setWhiskerWidth(double width) { * @return The legend item (possibly {@code null}). */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot cp = getPlot(); if (cp == null) { @@ -588,7 +588,7 @@ else if (orientation == PlotOrientation.VERTICAL) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { // do nothing if item is not visible @@ -634,7 +634,7 @@ else if (orientation == PlotOrientation.VERTICAL) { public void drawHorizontalItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, - CategoryDataset dataset, int row, int column) { + CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { BoxAndWhiskerCategoryDataset bawDataset = (BoxAndWhiskerCategoryDataset) dataset; @@ -777,7 +777,7 @@ public void drawHorizontalItem(Graphics2D g2, */ public void drawVerticalItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column) { + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { BoxAndWhiskerCategoryDataset bawDataset = (BoxAndWhiskerCategoryDataset) dataset; diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java index b66c489d9..3d2be092f 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java @@ -235,7 +235,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @return A boolean. */ - public boolean getItemVisible(/*@NonNegative*/ int series, int item); + public boolean getItemVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns a boolean that indicates whether or not the specified series @@ -404,7 +404,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemPaint(int row, int column); + public Paint getItemPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the paint used to fill an item drawn by the renderer. @@ -461,7 +461,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemFillPaint(int row, int column); + public Paint getItemFillPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the paint used to fill an item drawn by the renderer. @@ -514,7 +514,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemOutlinePaint(int row, int column); + public Paint getItemOutlinePaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the paint used to outline an item drawn by the renderer. @@ -571,7 +571,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The stroke (never {@code null}). */ - public Stroke getItemStroke(int row, int column); + public Stroke getItemStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the stroke used to draw the items in a series. @@ -632,7 +632,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The stroke (never {@code null}). */ - public Stroke getItemOutlineStroke(int row, int column); + public Stroke getItemOutlineStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the stroke used to outline the items in a series. @@ -689,7 +689,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The shape (never {@code null}). */ - public Shape getItemShape(int row, int column); + public Shape getItemShape(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns a shape used to represent the items in a series. @@ -747,7 +747,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return A boolean. */ - public boolean isItemLabelVisible(int row, int column); + public boolean isItemLabelVisible(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns {@code true} if the item labels for a series are visible, @@ -902,7 +902,7 @@ public void setDefaultItemLabelGenerator(CategoryItemLabelGenerator generator, * * @return The generator (possibly {@code null}). */ - public CategoryToolTipGenerator getToolTipGenerator(int row, int column); + public CategoryToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the tool tip generator for the specified series (a "layer 1" @@ -965,7 +965,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @return The font (never {@code null}). */ - public Font getItemLabelFont(int row, int column); + public Font getItemLabelFont(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the font for all the item labels in a series. @@ -1023,7 +1023,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @return The paint (never {@code null}). */ - public Paint getItemLabelPaint(int row, int column); + public Paint getItemLabelPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the paint used to draw the item labels for a series. @@ -1080,7 +1080,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getPositiveItemLabelPosition(int row, int column); + public ItemLabelPosition getPositiveItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the item label position for all positive values in a series. @@ -1162,7 +1162,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @return The item label position. */ - public ItemLabelPosition getNegativeItemLabelPosition(int row, int column); + public ItemLabelPosition getNegativeItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the item label position for all negative values in a series. @@ -1234,7 +1234,7 @@ public void setDefaultNegativeItemLabelPosition(ItemLabelPosition position, // CREATE ENTITIES - public boolean getItemCreateEntity(/*@NonNegative*/ int series, int item); + public boolean getItemCreateEntity(/*@NonNegative*/ int series, /*@NonNegative*/ int item); public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series); @@ -1260,7 +1260,7 @@ public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, * * @return The item URL generator. */ - public CategoryURLGenerator getItemURLGenerator(/*@NonNegative*/ int series, int item); + public CategoryURLGenerator getItemURLGenerator(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the item URL generator for a series. @@ -1318,7 +1318,7 @@ public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, * * @return The legend item (possibly {@code null}). */ - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series); + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series); /** * Draws a background for the data area. @@ -1356,7 +1356,7 @@ public void drawOutline(Graphics2D g2, CategoryPlot plot, */ public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass); /** diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java index 208a7f694..f7adc1523 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java @@ -170,7 +170,7 @@ public void setStagger(boolean shouldStagger) { * @return The legend item. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot p = getPlot(); if (p == null) { @@ -277,7 +277,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, int column, int pass) { // do nothing if item is not visible diff --git a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java index d0caa30d9..81cf93ccf 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.Graphics2D; @@ -242,7 +243,7 @@ public void setEndPercent(double percent) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, int column, int pass) { if (dataset instanceof GanttCategoryDataset) { diff --git a/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java b/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java index 981aa8b24..20a569e84 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -103,7 +104,7 @@ public GradientBarPainter(double g1, double g2, double g3) { * bar. */ @Override - public void paintBar(Graphics2D g2, BarRenderer renderer, int row, + public void paintBar(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); @@ -205,7 +206,7 @@ else if (base == RectangleEdge.LEFT || base == RectangleEdge.RIGHT) { * @param pegShadow peg the shadow to the base of the bar? */ @Override - public void paintBarShadow(Graphics2D g2, BarRenderer renderer, int row, + public void paintBarShadow(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { diff --git a/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java index bdb103e3d..53ff2a992 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -196,7 +197,7 @@ else if (orientation == PlotOrientation.VERTICAL) { protected double calculateBarW0(CategoryPlot plot, PlotOrientation orientation, Rectangle2D dataArea, CategoryAxis domainAxis, CategoryItemRendererState state, - int row, int column) { + int row, /*@NonNegative*/ int column) { // calculate bar width... double space; if (orientation == PlotOrientation.HORIZONTAL) { @@ -245,7 +246,7 @@ protected double calculateBarW0(CategoryPlot plot, @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, int column, int pass) { // nothing is drawn for null values... diff --git a/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java index 2da70168b..4b4db503c 100644 --- a/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java @@ -68,6 +68,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -137,7 +138,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { if (dataset instanceof IntervalCategoryDataset) { @@ -166,7 +167,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, */ protected void drawInterval(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, IntervalCategoryDataset dataset, int row, + ValueAxis rangeAxis, IntervalCategoryDataset dataset, /*@NonNegative*/ int row, int column) { int visibleRow = state.getVisibleSeriesIndex(row); diff --git a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java index 9c1af4f07..14193e7e3 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java @@ -192,7 +192,7 @@ else if (orientation == PlotOrientation.VERTICAL) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset data, int row, int column, + ValueAxis rangeAxis, CategoryDataset data, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { PlotOrientation orientation = plot.getOrientation(); @@ -222,7 +222,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, protected void drawHorizontalItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, - CategoryDataset dataset, int row, int column) { + CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { // nothing is drawn for null values... Number dataValue = dataset.getValue(row, column); @@ -347,7 +347,7 @@ protected void drawHorizontalItem(Graphics2D g2, protected void drawVerticalItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, - CategoryDataset dataset, int row, int column) { + CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { // nothing is drawn for null values... Number dataValue = dataset.getValue(row, column); diff --git a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java index 3e9c35ec6..7ac51c06a 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java @@ -254,7 +254,7 @@ protected void calculateItemWidth(CategoryPlot plot, */ protected double calculateBarW0(CategoryPlot plot, PlotOrientation orientation, Rectangle2D dataArea, - CategoryAxis domainAxis, CategoryItemRendererState state, int row, + CategoryAxis domainAxis, CategoryItemRendererState state, /*@NonNegative*/ int row, int column) { // calculate bar width... double space; @@ -302,7 +302,7 @@ protected double calculateBarW0(CategoryPlot plot, @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { // nothing is drawn if the row index is not included in the list with diff --git a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java index c8786d12b..14f79b144 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java @@ -234,7 +234,7 @@ public LineAndShapeRenderer(boolean lines, boolean shapes) { * * @return A boolean. */ - public boolean getItemLineVisible(/*@NonNegative*/ int series, int item) { + public boolean getItemLineVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Boolean flag = getSeriesLinesVisible(series); if (flag != null) { return flag; @@ -318,7 +318,7 @@ public void setDefaultLinesVisible(boolean flag) { * * @return A boolean. */ - public boolean getItemShapeVisible(/*@NonNegative*/ int series, int item) { + public boolean getItemShapeVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Boolean flag = getSeriesShapesVisible(series); if (flag != null) { return flag; @@ -459,7 +459,7 @@ public void setUseOutlinePaint(boolean use) { * * @return A boolean. */ - public boolean getItemShapeFilled(/*@NonNegative*/ int series, int item) { + public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getSeriesShapesFilled(series); } @@ -634,7 +634,7 @@ public void setItemMargin(double margin) { * @return The legend item. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot cp = getPlot(); if (cp == null) { @@ -713,7 +713,7 @@ public int getPassCount() { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { // do nothing if item is not visible diff --git a/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java b/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java index c8b8a507d..f9bee7bc7 100644 --- a/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java @@ -59,6 +59,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; import java.awt.Color; @@ -323,7 +324,7 @@ public void setMinIcon(Icon icon) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { // first check the number we are plotting... diff --git a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java index 6ff6942f3..6df72653e 100644 --- a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java @@ -268,7 +268,7 @@ public void setUseOutlinePaint(boolean use) { * @param item the item index (zero-based). * @return A boolean. */ - public boolean getItemShapeFilled(/*@NonNegative*/ int series, int item) { + public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getSeriesShapesFilled(series); } @@ -389,7 +389,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { // do nothing if item is not visible @@ -466,7 +466,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return The legend item. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { CategoryPlot cp = getPlot(); if (cp == null) { diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java index 33888da21..85474eb39 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java @@ -201,7 +201,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { if (!isSeriesVisible(row)) { diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java index 979795ddb..a5399158f 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java @@ -93,6 +93,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -286,7 +287,7 @@ else if (orientation == PlotOrientation.VERTICAL) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, int column, int pass) { if (!isSeriesVisible(row)) { diff --git a/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java b/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java index 3ebc7cbb1..c6dd94dcf 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -81,7 +82,7 @@ public StandardBarPainter() { * bar. */ @Override - public void paintBar(Graphics2D g2, BarRenderer renderer, int row, + public void paintBar(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); @@ -119,7 +120,7 @@ public void paintBar(Graphics2D g2, BarRenderer renderer, int row, * @param pegShadow peg the shadow to the base of the bar? */ @Override - public void paintBarShadow(Graphics2D g2, BarRenderer renderer, int row, + public void paintBarShadow(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { diff --git a/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java index 70e9dfce8..429107b81 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java @@ -63,6 +63,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; import java.awt.Color; @@ -219,7 +220,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset data, int row, int column, + ValueAxis rangeAxis, CategoryDataset data, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { int visibleRow = state.getVisibleSeriesIndex(row); diff --git a/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java index 298fb1144..702c2aa86 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java @@ -57,6 +57,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -221,7 +222,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { // do nothing if item is not visible diff --git a/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java index 5accf8a9b..0b6d23474 100644 --- a/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java @@ -59,6 +59,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -311,7 +312,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, + ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, int pass) { double previous = state.getSeriesRunningTotal(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java index 7c73b7f75..d955ea778 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java @@ -348,7 +348,7 @@ protected void beginElementGroup(Graphics2D g2, Comparable seriesKey, * @return The generator (possibly {@code null}). */ @Override - public XYItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int series, int item) { + public XYItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { // otherwise look up the generator table XYItemLabelGenerator generator @@ -420,7 +420,7 @@ public void setDefaultItemLabelGenerator(XYItemLabelGenerator generator) { * @return The generator (possibly {@code null}). */ @Override - public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, int item) { + public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { // otherwise look up the generator table XYToolTipGenerator generator @@ -841,7 +841,7 @@ public LegendItemCollection getLegendItems() { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { XYPlot xyplot = getPlot(); if (xyplot == null) { return null; @@ -1587,7 +1587,7 @@ public DrawingSupplier getDrawingSupplier() { * @since 1.0.20 */ protected void updateCrosshairValues(CrosshairState crosshairState, - double x, double y, int datasetIndex, + double x, double y, /*@NonNegative*/ int datasetIndex, double transX, double transY, PlotOrientation orientation) { Args.nullNotPermitted(orientation, "orientation"); @@ -1628,7 +1628,7 @@ protected void updateCrosshairValues(CrosshairState crosshairState, * label position). */ protected void drawItemLabel(Graphics2D g2, PlotOrientation orientation, - XYDataset dataset, /*@NonNegative*/ int series, int item, double x, double y, + XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item, double x, double y, boolean negative) { XYItemLabelGenerator generator = getItemLabelGenerator(series, item); @@ -1712,7 +1712,7 @@ else if (layer.equals(Layer.BACKGROUND)) { * {@code hotspot} is {@code null}). */ protected void addEntity(EntityCollection entities, Shape hotspot, - XYDataset dataset, /*@NonNegative*/ int series, int item, double entityX, + XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item, double entityX, double entityY) { if (!getItemCreateEntity(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java index 38db9cd4b..1104fad88 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java @@ -87,6 +87,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; import java.awt.Color; @@ -646,7 +647,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { boolean horiz; PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java index 578d8fd5c..989e862f4 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java @@ -65,6 +65,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -225,7 +226,7 @@ protected Range findDomainBoundsWithOffset(IntervalXYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 52463a143..04fc01b2b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -148,7 +149,7 @@ public CyclicXYItemRenderer(int type, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { if ((!getPlotLines()) || ((!(domainAxis instanceof CyclicNumberAxis)) && (!(rangeAxis instanceof CyclicNumberAxis))) || (item <= 0)) { @@ -367,7 +368,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return this.x.length; } @@ -380,7 +381,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.x[item]; } @@ -394,7 +395,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number xx = getX(series, item); if (xx != null) { @@ -412,7 +413,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.y[item]; } @@ -426,7 +427,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number yy = getY(series, item); if (yy != null) { @@ -441,7 +442,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.delegateSet.getSeriesCount(); } @@ -465,7 +466,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The index. */ @Override - public int indexOf(Comparable seriesName) { + public /*@GTENegativeOne*/ int indexOf(Comparable seriesName) { return this.delegateSet.indexOf(seriesName); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java index 606de1b7c..616334654 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java @@ -44,6 +44,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; import java.awt.Composite; @@ -269,7 +270,7 @@ protected boolean isLinePass(int pass) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java index 0b79ff9a3..196402a41 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -102,7 +103,7 @@ public GradientXYBarPainter(double g1, double g2, double g3) { * bar. */ @Override - public void paintBar(Graphics2D g2, XYBarRenderer renderer, int row, + public void paintBar(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); @@ -203,7 +204,7 @@ else if (base == RectangleEdge.LEFT || base == RectangleEdge.RIGHT) { * @param pegShadow peg the shadow to the base of the bar? */ @Override - public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, int row, + public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java index 380eb16c4..cac876cd4 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java @@ -67,6 +67,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -320,7 +321,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); if (!domainAxis.getRange().contains(x)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java index 9835a0ce7..059b13c04 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java @@ -238,7 +238,7 @@ public XYItemRendererState initialise(Graphics2D g2, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java index 2d16655a1..a49dc8bec 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java @@ -70,7 +70,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -397,7 +397,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); StackedXYAreaRendererState areaState diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java index 141295168..6505e93af 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java @@ -56,7 +56,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -217,7 +217,7 @@ public int getPassCount() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java index 2be1d555b..947fd0916 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -237,7 +238,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java index 369515c71..7149df8a0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -80,7 +81,7 @@ public StandardXYBarPainter() { * bar. */ @Override - public void paintBar(Graphics2D g2, XYBarRenderer renderer, int row, + public void paintBar(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); @@ -118,7 +119,7 @@ public void paintBar(Graphics2D g2, XYBarRenderer renderer, int row, * @param pegShadow peg the shadow to the base of the bar? */ @Override - public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, int row, + public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index 660efc2f9..b878a7e9d 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -330,7 +330,7 @@ public void setBaseShapesVisible(boolean flag) { * * @see #getSeriesShapesFilled(int) */ - public boolean getItemShapeFilled(/*@NonNegative*/ int series, int item) { + public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { // otherwise look up the paint table Boolean flag = this.seriesShapesFilled.getBoolean(series); @@ -578,7 +578,7 @@ public void setLegendLine(Shape line) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { XYPlot plot = getPlot(); if (plot == null) { return null; @@ -739,7 +739,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { boolean itemVisible = getItemVisible(series, item); @@ -1013,7 +1013,7 @@ public Object clone() throws CloneNotSupportedException { * * @see #getPlotImages() */ - protected Image getImage(Plot plot, /*@NonNegative*/ int series, int item, + protected Image getImage(Plot plot, /*@NonNegative*/ int series, /*@NonNegative*/ int item, double x, double y) { // this method must be overridden if you want to display images return null; @@ -1036,7 +1036,7 @@ protected Image getImage(Plot plot, /*@NonNegative*/ int series, int item, * * @return The hotspot used to draw the data item. */ - protected Point getImageHotspot(Plot plot, /*@NonNegative*/ int series, int item, + protected Point getImageHotspot(Plot plot, /*@NonNegative*/ int series, /*@NonNegative*/ int item, double x, double y, Image image) { int height = image.getHeight(null); diff --git a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java index 5e12db54a..d887e06df 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.GeneralPath; @@ -222,7 +223,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java index 888662c10..15b533936 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java @@ -56,6 +56,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.Font; @@ -118,7 +119,7 @@ public WindItemRenderer() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D plotArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { WindDataset windData = (WindDataset) dataset; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index 41b63c2b6..5616078b0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -439,7 +439,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { LegendItem result = null; XYPlot xyplot = getPlot(); if (xyplot != null) { @@ -497,7 +497,7 @@ public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java index 8638fe916..a8dc33f8f 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java @@ -233,7 +233,7 @@ public void setLegendArea(Shape area) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { LegendItem result = null; XYPlot xyplot = getPlot(); if (xyplot != null) { @@ -291,7 +291,7 @@ public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java index def957e46..286f4a92b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.RectangularShape; @@ -72,7 +73,7 @@ public interface XYBarPainter { * @param base the base of the bar. */ public void paintBar(Graphics2D g2, XYBarRenderer renderer, - int row, int column, RectangularShape bar, RectangleEdge base); + int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base); /** * Paints the shadow for a single bar on behalf of a renderer. @@ -86,7 +87,7 @@ public void paintBar(Graphics2D g2, XYBarRenderer renderer, * @param pegShadow peg the shadow to the base of the bar? */ public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, - int row, int column, RectangularShape bar, RectangleEdge base, + int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, boolean pegShadow); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index 1356b71cc..83a4e6065 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -735,7 +735,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { XYPlot xyplot = getPlot(); if (xyplot == null) { return null; @@ -807,7 +807,7 @@ public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; @@ -971,7 +971,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * @param negative a flag indicating a negative value. */ protected void drawItemLabel(Graphics2D g2, XYDataset dataset, - int series, int item, XYPlot plot, XYItemLabelGenerator generator, + /*@NonNegative*/ int series, /*@NonNegative*/ int item, XYPlot plot, XYItemLabelGenerator generator, Rectangle2D bar, boolean negative) { if (generator == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 2a72a137f..8569f051c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; import java.awt.Graphics2D; @@ -349,7 +350,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index 8c0ea898b..7e50e3b91 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -307,7 +307,7 @@ public Range findRangeBounds(XYDataset dataset) { * * @since 1.0.10 */ - protected Paint lookupBoxPaint(/*@NonNegative*/ int series, int item) { + protected Paint lookupBoxPaint(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Paint p = getBoxPaint(); if (p != null) { return p; @@ -342,7 +342,7 @@ protected Paint lookupBoxPaint(/*@NonNegative*/ int series, int item) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index ea7c75697..ad1091f07 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -179,7 +179,7 @@ public int getScaleType() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { // return straight away if the item is not visible if (!getItemVisible(series, item)) { @@ -290,7 +290,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { LegendItem result = null; XYPlot plot = getPlot(); if (plot == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index 47f46c2c2..7e5c6fa47 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -373,7 +373,7 @@ public int getPassCount() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { if (pass == 0) { drawItemPass0(g2, dataArea, info, plot, domainAxis, rangeAxis, @@ -410,7 +410,7 @@ protected void drawItemPass0(Graphics2D x_graphics, ValueAxis x_rangeAxis, XYDataset x_dataset, int x_series, - int x_item, + /*@NonNegative*/ int x_item, CrosshairState x_crosshairState) { if (!((0 == x_series) && (0 == x_item))) { @@ -868,7 +868,7 @@ protected void drawItemPass1(Graphics2D x_graphics, ValueAxis x_rangeAxis, XYDataset x_dataset, int x_series, - int x_item, + /*@NonNegative*/ int x_item, CrosshairState x_crosshairState) { Shape l_entityArea = null; @@ -1119,7 +1119,7 @@ private void createPolygon (Graphics2D x_graphics, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { LegendItem result = null; XYPlot p = getPlot(); if (p != null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java index 486ab470f..b4a0b60be 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java @@ -232,7 +232,7 @@ public void setLegendShape(Shape shape) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -279,7 +279,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return A legend item for the series (possibly {@code null}). */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { // if the renderer isn't assigned to a plot, then we don't have a // dataset... diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java index 8ecaec9ff..52bbb8235 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java @@ -42,6 +42,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -304,7 +305,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { if (pass == 0 && dataset instanceof IntervalXYDataset && getItemVisible(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java index e778b3bb7..f8828175a 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java @@ -201,7 +201,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return A boolean. */ - public boolean getItemVisible(/*@NonNegative*/ int series, int item); + public boolean getItemVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns a boolean that indicates whether or not the specified series @@ -370,7 +370,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemPaint(int row, int column); + public Paint getItemPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the paint used to color an item drawn by the renderer. @@ -427,7 +427,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemFillPaint(int row, int column); + public Paint getItemFillPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the paint used to fill an item drawn by the renderer. @@ -476,7 +476,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemOutlinePaint(int row, int column); + public Paint getItemOutlinePaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the paint used to outline an item drawn by the renderer. @@ -533,7 +533,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The stroke (never {@code null}). */ - public Stroke getItemStroke(int row, int column); + public Stroke getItemStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the stroke used to draw the items in a series. @@ -592,7 +592,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The stroke (never {@code null}). */ - public Stroke getItemOutlineStroke(int row, int column); + public Stroke getItemOutlineStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the stroke used to outline the items in a series. @@ -649,7 +649,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The shape (never {@code null}). */ - public Shape getItemShape(int row, int column); + public Shape getItemShape(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns a shape used to represent the items in a series. @@ -707,7 +707,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The legend item (possibly {@code null}). */ - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series); + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series); //// LEGEND ITEM LABEL GENERATOR ////////////////////////////////////////// @@ -740,7 +740,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The generator (possibly {@code null}). */ - public XYToolTipGenerator getToolTipGenerator(int row, int column); + public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the tool tip generator for a series. @@ -811,7 +811,7 @@ public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, * * @return A boolean. */ - public boolean isItemLabelVisible(int row, int column); + public boolean isItemLabelVisible(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns {@code true} if the item labels for a series are visible, @@ -900,7 +900,7 @@ public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visi * * @return The generator (possibly {@code null}). */ - public XYItemLabelGenerator getItemLabelGenerator(int row, int column); + public XYItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the item label generator for a series. @@ -954,7 +954,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @return The font (never {@code null}). */ - public Font getItemLabelFont(int row, int column); + public Font getItemLabelFont(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the font for all the item labels in a series. @@ -1006,7 +1006,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @return The paint (never {@code null}). */ - public Paint getItemLabelPaint(int row, int column); + public Paint getItemLabelPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the paint used to draw the item labels for a series. @@ -1055,7 +1055,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getPositiveItemLabelPosition(int row, int column); + public ItemLabelPosition getPositiveItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the item label position for all positive values in a series. @@ -1125,7 +1125,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getNegativeItemLabelPosition(int row, int column); + public ItemLabelPosition getNegativeItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the item label position for all negative values in a series. @@ -1186,7 +1186,7 @@ public void setDefaultNegativeItemLabelPosition(ItemLabelPosition position, // CREATE ENTITIES - public boolean getItemCreateEntity(/*@NonNegative*/ int series, int item); + public boolean getItemCreateEntity(/*@NonNegative*/ int series, /*@NonNegative*/ int item); public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series); @@ -1297,7 +1297,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass); + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass); /** * Fills a band between two values on the axis. This can be used to color diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index e586533e2..2b29f312c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -258,7 +258,7 @@ public int getPassCount() { * * @return A boolean. */ - public boolean getItemLineVisible(/*@NonNegative*/ int series, int item) { + public boolean getItemLineVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Boolean flag = getSeriesLinesVisible(series); if (flag != null) { return flag; @@ -371,7 +371,7 @@ public void setLegendLine(Shape line) { * * @return A boolean. */ - public boolean getItemShapeVisible(/*@NonNegative*/ int series, int item) { + public boolean getItemShapeVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Boolean flag = getSeriesShapesVisible(series); if (flag != null) { return flag; @@ -459,7 +459,7 @@ public void setDefaultShapesVisible(boolean flag) { * * @return A boolean. */ - public boolean getItemShapeFilled(/*@NonNegative*/ int series, int item) { + public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Boolean flag = getSeriesShapesFilled(series); if (flag != null) { return flag; @@ -736,7 +736,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -903,7 +903,7 @@ protected void drawFirstPassShape(Graphics2D g2, int pass, /*@NonNegative*/ int */ protected void drawPrimaryLineAsPath(XYItemRendererState state, Graphics2D g2, XYPlot plot, XYDataset dataset, int pass, - int series, int item, ValueAxis domainAxis, ValueAxis rangeAxis, + /*@NonNegative*/ int series, /*@NonNegative*/ int item, ValueAxis domainAxis, ValueAxis rangeAxis, Rectangle2D dataArea) { RectangleEdge xAxisLocation = plot.getDomainAxisEdge(); @@ -962,7 +962,7 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, * @param entities the entity collection. */ protected void drawSecondaryPass(Graphics2D g2, XYPlot plot, - XYDataset dataset, int pass, /*@NonNegative*/ int series, int item, + XYDataset dataset, int pass, /*@NonNegative*/ int series, /*@NonNegative*/ int item, ValueAxis domainAxis, Rectangle2D dataArea, ValueAxis rangeAxis, CrosshairState crosshairState, EntityCollection entities) { @@ -1049,7 +1049,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return A legend item for the series (possibly {@code null}). */ @Override - public LegendItem getLegendItem(int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { XYPlot plot = getPlot(); if (plot == null) { return null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 505eadcfd..6c6b663c6 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -431,7 +431,7 @@ public int getPassCount() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { Shape hotspot; EntityCollection entities = null; @@ -514,7 +514,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * * @return The paint. */ - protected Paint getPaint(XYDataset dataset, /*@NonNegative*/ int series, int item) { + protected Paint getPaint(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { Paint p; if (dataset instanceof XYZDataset) { double z = ((XYZDataset) dataset).getZValue(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java index 2d6ede226..611c2102e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.GradientPaint; import java.awt.Graphics2D; @@ -299,7 +300,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, @Override protected void drawPrimaryLineAsPath(XYItemRendererState state, Graphics2D g2, XYPlot plot, XYDataset dataset, int pass, - int series, int item, ValueAxis xAxis, ValueAxis yAxis, + /*@NonNegative*/ int series, /*@NonNegative*/ int item, ValueAxis xAxis, ValueAxis yAxis, Rectangle2D dataArea) { XYSplineState s = (XYSplineState) state; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java index ca47c4e52..f6bfea381 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java @@ -57,6 +57,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -394,7 +395,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java index 55a7dd0e3..14244ead0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java @@ -72,6 +72,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -200,7 +201,7 @@ public void setStepPoint(double stepPoint) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index 8dba7af4d..47085709e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -181,7 +181,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - int series, int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { diff --git a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java index a909fe2c9..dca5bc4ef 100644 --- a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java +++ b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.ui; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Component; import java.text.NumberFormat; @@ -65,7 +66,7 @@ public NumberCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) { + boolean hasFocus, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { setFont(null); NumberFormat nf = NumberFormat.getNumberInstance(); diff --git a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java index 52fd57d74..90410f893 100644 --- a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java @@ -101,7 +101,7 @@ public int getURLCount(int list) { * * @return The URL (possibly {@code null}). */ - public String getURL(/*@NonNegative*/ int series, int item) { + public String getURL(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { String result = null; if (series < getListCount()) { List urls = (List) this.urlSeries.get(series); @@ -124,7 +124,7 @@ public String getURL(/*@NonNegative*/ int series, int item) { * @return A string containing the URL (possibly {@code null}). */ @Override - public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getURL(series, item); } diff --git a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java index f5d497d93..d1934ea15 100644 --- a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java @@ -110,7 +110,7 @@ public int getURLCount(int list) { * * @return The URL (possibly {@code null}). */ - public String getURL(/*@NonNegative*/ int series, int item) { + public String getURL(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { String result = null; if (series < getListCount()) { List urls = (List) this.urlSeries.get(series); @@ -133,7 +133,7 @@ public String getURL(/*@NonNegative*/ int series, int item) { * @return A string containing the URL (possibly {@code null}). */ @Override - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getURL(series, item); } diff --git a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java index 88985427a..bbf82776e 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java @@ -133,7 +133,7 @@ public StandardXYURLGenerator(String prefix, String seriesParameterName, * @return The generated URL. */ @Override - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { // TODO: URLEncode? String url = this.prefix; boolean firstParameter = url.indexOf("?") == -1; diff --git a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java index 7f83caba2..07be34d64 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java @@ -62,7 +62,7 @@ public class StandardXYZURLGenerator extends StandardXYURLGenerator * @return A string containing the generated URL. */ @Override - public String generateURL(XYZDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateURL(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { return super.generateURL(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java index aafb5f424..9fcee6ae9 100644 --- a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java @@ -169,7 +169,7 @@ public String getItemParameterName() { * @return The generated URL. */ @Override - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, int item) { + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { String result = this.prefix; boolean firstParameter = !result.contains("?"); Comparable seriesKey = dataset.getSeriesKey(series); diff --git a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java index f7e6b0873..f830a4957 100644 --- a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java @@ -70,6 +70,6 @@ public interface XYURLGenerator { * @return A string containing the generated URL (possibly * {@code null}). */ - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, int item); + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java index dfa400cc9..2f5e4295c 100644 --- a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java @@ -65,6 +65,6 @@ public interface XYZURLGenerator extends XYURLGenerator { * * @return A string containing the generated URL. */ - public String generateURL(XYZDataset dataset, /*@NonNegative*/ int series, int item); + public String generateURL(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index 9293e8852..c22d754de 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -155,7 +155,7 @@ public int size() { * * @return The index or -1. */ - protected int indexOf(Object object) { + protected /*@GTENegativeOne*/ int indexOf(Object object) { for (int index = 0; index < this.size; index++) { if (this.objects[index] == object) { return (index); diff --git a/src/main/java/org/jfree/chart/util/ObjectList.java b/src/main/java/org/jfree/chart/util/ObjectList.java index 20a9d8c45..c3e0fb64d 100644 --- a/src/main/java/org/jfree/chart/util/ObjectList.java +++ b/src/main/java/org/jfree/chart/util/ObjectList.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.util; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -91,7 +92,7 @@ public void set(/*@NonNegative*/ int index, Object object) { * @return The index or -1. */ @Override - public int indexOf(Object object) { + public /*@GTENegativeOne*/ int indexOf(Object object) { return super.indexOf(object); } diff --git a/src/main/java/org/jfree/data/ComparableObjectSeries.java b/src/main/java/org/jfree/data/ComparableObjectSeries.java index 458b54af3..b36f53838 100644 --- a/src/main/java/org/jfree/data/ComparableObjectSeries.java +++ b/src/main/java/org/jfree/data/ComparableObjectSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -129,7 +130,7 @@ public boolean getAllowDuplicateXValues() { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.data.size(); } @@ -270,7 +271,7 @@ protected void add(ComparableObjectItem item, boolean notify) { * * @return The index. */ - public int indexOf(Comparable x) { + public /*@GTENegativeOne*/ int indexOf(Comparable x) { if (this.autoSort) { return Collections.binarySearch(this.data, new ComparableObjectItem( x, null)); diff --git a/src/main/java/org/jfree/data/DataUtils.java b/src/main/java/org/jfree/data/DataUtils.java index 2361b4ade..ac97338f0 100644 --- a/src/main/java/org/jfree/data/DataUtils.java +++ b/src/main/java/org/jfree/data/DataUtils.java @@ -47,6 +47,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Arrays; import org.jfree.chart.util.Args; @@ -120,7 +121,7 @@ public static double[][] clone(double[][] source) { * * @return The total of the values in the specified column. */ - public static double calculateColumnTotal(Values2D data, int column) { + public static double calculateColumnTotal(Values2D data, /*@NonNegative*/ int column) { Args.nullNotPermitted(data, "data"); double total = 0.0; int rowCount = data.getRowCount(); @@ -145,7 +146,7 @@ public static double calculateColumnTotal(Values2D data, int column) { * * @since 1.0.13 */ - public static double calculateColumnTotal(Values2D data, int column, + public static double calculateColumnTotal(Values2D data, /*@NonNegative*/ int column, int[] validRows) { Args.nullNotPermitted(data, "data"); double total = 0.0; @@ -171,7 +172,7 @@ public static double calculateColumnTotal(Values2D data, int column, * * @return The total of the values in the specified row. */ - public static double calculateRowTotal(Values2D data, int row) { + public static double calculateRowTotal(Values2D data, /*@NonNegative*/ int row) { Args.nullNotPermitted(data, "data"); double total = 0.0; int columnCount = data.getColumnCount(); @@ -196,7 +197,7 @@ public static double calculateRowTotal(Values2D data, int row) { * * @since 1.0.13 */ - public static double calculateRowTotal(Values2D data, int row, + public static double calculateRowTotal(Values2D data, /*@NonNegative*/ int row, int[] validCols) { Args.nullNotPermitted(data, "data"); double total = 0.0; diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues.java b/src/main/java/org/jfree/data/DefaultKeyedValues.java index 27060f092..ea479b4ed 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues.java @@ -59,7 +59,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.ArrayList; @@ -108,7 +108,7 @@ public DefaultKeyedValues() { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.indexMap.size(); } @@ -122,7 +122,7 @@ public int getItemCount() { * @throws IndexOutOfBoundsException if {@code item} is out of bounds. */ @Override - public Number getValue(int item) { + public Number getValue(/*@NonNegative*/ int item) { return (Number) this.values.get(item); } diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java index 16cd05775..e511ece88 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java @@ -57,6 +57,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Collections; @@ -143,7 +144,7 @@ public int getColumnCount() { * @see #getValue(Comparable, Comparable) */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; DefaultKeyedValues rowData = (DefaultKeyedValues) this.rows.get(row); if (rowData != null) { @@ -169,7 +170,7 @@ public Number getValue(int row, int column) { * @see #getColumnKey(int) */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return (Comparable) this.rowKeys.get(row); } @@ -218,7 +219,7 @@ public List getRowKeys() { * @see #getRowKey(int) */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return (Comparable) this.columnKeys.get(column); } diff --git a/src/main/java/org/jfree/data/KeyedObjects.java b/src/main/java/org/jfree/data/KeyedObjects.java index ee461a88e..18f287392 100644 --- a/src/main/java/org/jfree/data/KeyedObjects.java +++ b/src/main/java/org/jfree/data/KeyedObjects.java @@ -43,7 +43,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Iterator; @@ -74,7 +74,7 @@ public KeyedObjects() { * * @return The item count. */ - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.data.size(); } @@ -87,7 +87,7 @@ public int getItemCount() { * * @throws IndexOutOfBoundsException if {@code item} is out of bounds. */ - public Object getObject(int item) { + public Object getObject(/*@NonNegative*/ int item) { Object result = null; KeyedObject kobj = (KeyedObject) this.data.get(item); if (kobj != null) { diff --git a/src/main/java/org/jfree/data/KeyedObjects2D.java b/src/main/java/org/jfree/data/KeyedObjects2D.java index c02ab6210..8101320e1 100644 --- a/src/main/java/org/jfree/data/KeyedObjects2D.java +++ b/src/main/java/org/jfree/data/KeyedObjects2D.java @@ -44,6 +44,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Collections; @@ -110,7 +111,7 @@ public int getColumnCount() { * * @see #getObject(Comparable, Comparable) */ - public Object getObject(int row, int column) { + public Object getObject(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Object result = null; KeyedObjects rowData = (KeyedObjects) this.rows.get(row); if (rowData != null) { @@ -134,7 +135,7 @@ public Object getObject(int row, int column) { * * @see #getRowIndex(Comparable) */ - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return (Comparable) this.rowKeys.get(row); } @@ -173,7 +174,7 @@ public List getRowKeys() { * * @see #getColumnIndex(Comparable) */ - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return (Comparable) this.columnKeys.get(column); } diff --git a/src/main/java/org/jfree/data/KeyedValues2D.java b/src/main/java/org/jfree/data/KeyedValues2D.java index af15e5c38..9bcb72fa5 100644 --- a/src/main/java/org/jfree/data/KeyedValues2D.java +++ b/src/main/java/org/jfree/data/KeyedValues2D.java @@ -40,6 +40,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.List; @@ -58,7 +59,7 @@ public interface KeyedValues2D extends Values2D { * * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ - public Comparable getRowKey(int row); + public Comparable getRowKey(/*@NonNegative*/ int row); /** * Returns the row index for a given key. @@ -85,7 +86,7 @@ public interface KeyedValues2D extends Values2D { * * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ - public Comparable getColumnKey(int column); + public Comparable getColumnKey(/*@NonNegative*/ int column); /** * Returns the column index for a given key. diff --git a/src/main/java/org/jfree/data/Values.java b/src/main/java/org/jfree/data/Values.java index ee8fd29f9..ea1b74ee5 100644 --- a/src/main/java/org/jfree/data/Values.java +++ b/src/main/java/org/jfree/data/Values.java @@ -42,7 +42,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /** * An interface through which (single-dimension) data values can be accessed. @@ -54,7 +54,7 @@ public interface Values { * * @return The item count (possibly zero). */ - public int getItemCount(); + public /*@NonNegative*/ int getItemCount(); /** * Returns the value with the specified index. diff --git a/src/main/java/org/jfree/data/Values2D.java b/src/main/java/org/jfree/data/Values2D.java index 0fd3df209..f7b74afaf 100644 --- a/src/main/java/org/jfree/data/Values2D.java +++ b/src/main/java/org/jfree/data/Values2D.java @@ -39,6 +39,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /** * A general purpose interface that can be used to access a table of values. @@ -70,6 +71,6 @@ public interface Values2D { * @throws IndexOutOfBoundsException if the {@code row} * or {@code column} is out of bounds. */ - public Number getValue(int row, int column); + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); } diff --git a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java index def5e3246..bded6df58 100644 --- a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java +++ b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java @@ -48,7 +48,7 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collections; import java.util.List; @@ -143,7 +143,7 @@ public int getExtractIndex() { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { int result = 0; if (this.source != null) { if (this.extract == TableOrder.BY_ROW) { @@ -167,7 +167,7 @@ else if (this.extract == TableOrder.BY_COLUMN) { * range {@code 0} to {@code getItemCount() -1}. */ @Override - public Number getValue(int item) { + public Number getValue(/*@NonNegative*/ int item) { Number result = null; if (item < 0 || item >= getItemCount()) { // this will include the case where the underlying dataset is null diff --git a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java index 9c2b7bfc5..b2531b8af 100644 --- a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java @@ -47,6 +47,7 @@ */ package org.jfree.data.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.List; @@ -112,7 +113,7 @@ public int getColumnCount() { * @see #removeValue(Comparable, Comparable) */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.data.getValue(row, column); } @@ -128,7 +129,7 @@ public Number getValue(int row, int column) { * @see #getColumnKey(int) */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return this.data.getRowKey(row); } @@ -169,7 +170,7 @@ public List getRowKeys() { * @see #getColumnIndex(Comparable) */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.data.getColumnKey(column); } diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index 900d8b223..6a1646fc7 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -229,7 +229,7 @@ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, * @see #getCategoryCount() */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { int result = 0; if (this.startData != null) { result = this.startData.length; @@ -623,7 +623,7 @@ private Comparable[] generateKeys(int count, String prefix) { * @see #getRowKey(int) */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.categoryKeys[column]; } @@ -686,7 +686,7 @@ public List getRowKeys() { * @see #getColumnKey(int) */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { if ((row >= getRowCount()) || (row < 0)) { throw new IllegalArgumentException( "The 'row' argument is out of bounds."); diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index fb956d656..58ab92724 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -40,6 +40,7 @@ */ package org.jfree.data.category; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collections; import java.util.List; @@ -188,7 +189,7 @@ public int getColumnIndex(Comparable key) { * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.underlying.getColumnKey(column + this.firstCategoryIndex); } @@ -231,7 +232,7 @@ public int getRowIndex(Comparable key) { * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return this.underlying.getRowKey(row); } @@ -302,7 +303,7 @@ public int getRowCount() { * @return The value (possibly {@code null}). */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.underlying.getValue(row, column + this.firstCategoryIndex); } diff --git a/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java index 300d73f2f..57cdc7353 100644 --- a/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java @@ -41,6 +41,7 @@ */ package org.jfree.data.gantt; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.category.IntervalCategoryDataset; @@ -60,7 +61,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getPercentComplete(Comparable, Comparable) */ - public Number getPercentComplete(int row, int column); + public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the percent complete for a given item. @@ -84,7 +85,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getSubIntervalCount(Comparable, Comparable) */ - public int getSubIntervalCount(int row, int column); + public int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the number of sub-intervals for a given item. @@ -109,7 +110,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getEndValue(int, int, int) */ - public Number getStartValue(int row, int column, int subinterval); + public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval); /** * Returns the start value of a sub-interval for a given item. @@ -136,7 +137,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * * @see #getStartValue(int, int, int) */ - public Number getEndValue(int row, int column, int subinterval); + public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval); /** * Returns the end value of a sub-interval for a given item. @@ -163,7 +164,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * * @see #getPercentComplete(Comparable, Comparable, int) */ - public Number getPercentComplete(int row, int column, int subinterval); + public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval); /** * Returns the percentage complete value of a sub-interval for a given item. diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index 988df1b58..1758127f1 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -191,7 +191,7 @@ public int getColumnIndex(Comparable key) { * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.underlying.getColumnKey(column + this.firstCategoryIndex); } @@ -234,7 +234,7 @@ public int getRowIndex(Comparable key) { * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return this.underlying.getRowKey(row); } @@ -305,7 +305,7 @@ public int getRowCount() { * @return The value (possibly {@code null}). */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.underlying.getValue(row, column + this.firstCategoryIndex); } @@ -392,7 +392,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * @see #getStartValue(int, int, int) */ @Override - public Number getEndValue(int row, int column, int subinterval) { + public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { return this.underlying.getEndValue(row, column + this.firstCategoryIndex, subinterval); } @@ -423,7 +423,7 @@ public Number getPercentComplete(/*@NonNegative*/ int series, int category) { * @see #getPercentComplete(Comparable, Comparable, int) */ @Override - public Number getPercentComplete(int row, int column, int subinterval) { + public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { return this.underlying.getPercentComplete(row, column + this.firstCategoryIndex, subinterval); } @@ -465,7 +465,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * @see #getEndValue(int, int, int) */ @Override - public Number getStartValue(int row, int column, int subinterval) { + public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { return this.underlying.getStartValue(row, column + this.firstCategoryIndex, subinterval); } @@ -504,7 +504,7 @@ public int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { * @see #getSubIntervalCount(Comparable, Comparable) */ @Override - public int getSubIntervalCount(int row, int column) { + public int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.underlying.getSubIntervalCount(row, column + this.firstCategoryIndex); } @@ -543,7 +543,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey) { * @see #getEndValue(int, int) */ @Override - public Number getStartValue(int row, int column) { + public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.underlying.getStartValue(row, column + this.firstCategoryIndex); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeries.java b/src/main/java/org/jfree/data/gantt/TaskSeries.java index 39105f720..f2c3781f4 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeries.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeries.java @@ -45,7 +45,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collections; import java.util.List; @@ -116,7 +116,7 @@ public void removeAll() { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.tasks.size(); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 53b92458a..13e7caf30 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -137,7 +137,7 @@ public TaskSeries getSeries(/*@NonNegative*/ int series) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return getRowCount(); } @@ -358,7 +358,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The start value. */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getStartValue(row, column); } @@ -395,7 +395,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey) { * @return The start value. */ @Override - public Number getStartValue(int row, int column) { + public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getStartValue(rowKey, columnKey); @@ -434,7 +434,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey) { * @return The end value. */ @Override - public Number getEndValue(int row, int column) { + public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getEndValue(rowKey, columnKey); @@ -449,7 +449,7 @@ public Number getEndValue(int row, int column) { * @return The percent complete (possibly {@code null}). */ @Override - public Number getPercentComplete(int row, int column) { + public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getPercentComplete(rowKey, columnKey); @@ -484,7 +484,7 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { * @return The sub-interval count. */ @Override - public int getSubIntervalCount(int row, int column) { + public int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getSubIntervalCount(rowKey, columnKey); @@ -520,7 +520,7 @@ public int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { * @return The start value (possibly {@code null}). */ @Override - public Number getStartValue(int row, int column, int subinterval) { + public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getStartValue(rowKey, columnKey, subinterval); @@ -562,7 +562,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * @return The end value (possibly {@code null}). */ @Override - public Number getEndValue(int row, int column, int subinterval) { + public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getEndValue(rowKey, columnKey, subinterval); @@ -604,7 +604,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * @return The percent complete value (possibly {@code null}). */ @Override - public Number getPercentComplete(int row, int column, int subinterval) { + public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getPercentComplete(rowKey, columnKey, subinterval); diff --git a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java index 63ab2e510..a6005d718 100644 --- a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java +++ b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java @@ -161,7 +161,7 @@ public void setTransposed(boolean transposed) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.underlying.getSeriesCount(); } @@ -185,7 +185,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getSeries(series).getItemCount(); } @@ -198,7 +198,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { if (!this.transposed) { return getSeriesValue(series); } @@ -218,7 +218,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @return The start date/time. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { if (!this.transposed) { return getSeriesStartValue(series); } @@ -238,7 +238,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * @return The end date/time. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { if (!this.transposed) { return getSeriesEndValue(series); } @@ -256,7 +256,7 @@ public double getEndXValue(/*@NonNegative*/ int series, int item) { * @return The x-value (in milliseconds). */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getXValue(series, item)); } @@ -271,7 +271,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The start date/time. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getStartXValue(series, item)); } @@ -286,7 +286,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The end date/time. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getEndXValue(series, item)); } @@ -299,7 +299,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { if (!this.transposed) { return getItemValue(series, item); } @@ -318,7 +318,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The y-interval start. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { if (!this.transposed) { return getItemStartValue(series, item); } @@ -337,7 +337,7 @@ public double getStartYValue(/*@NonNegative*/ int series, int item) { * @return The y-interval end. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { if (!this.transposed) { return getItemEndValue(series, item); } @@ -357,7 +357,7 @@ public double getEndYValue(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getYValue(series, item)); } @@ -371,7 +371,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The y-interval start. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getStartYValue(series, item)); } @@ -385,7 +385,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The y-interval end. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getEndYValue(series, item)); } @@ -401,7 +401,7 @@ private double getSeriesEndValue(/*@NonNegative*/ int series) { return series + this.seriesWidth / 2.0; } - private double getItemValue(/*@NonNegative*/ int series, int item) { + private double getItemValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); @@ -410,7 +410,7 @@ private double getItemValue(/*@NonNegative*/ int series, int item) { return (start.getTime() + end.getTime()) / 2.0; } - private double getItemStartValue(/*@NonNegative*/ int series, int item) { + private double getItemStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); @@ -418,7 +418,7 @@ private double getItemStartValue(/*@NonNegative*/ int series, int item) { return start.getTime(); } - private double getItemEndValue(/*@NonNegative*/ int series, int item) { + private double getItemEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); diff --git a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java index 49acc085f..7d49cb0a1 100644 --- a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java +++ b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java @@ -43,6 +43,7 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -98,7 +99,7 @@ protected AbstractSeriesDataset() { * @return The index. */ @Override - public int indexOf(Comparable seriesKey) { + public /*@GTENegativeOne*/ int indexOf(Comparable seriesKey) { int seriesCount = getSeriesCount(); for (int s = 0; s < seriesCount; s++) { if (getSeriesKey(s).equals(seriesKey)) { diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 00f8f7b50..8c6186457 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -2182,7 +2182,7 @@ public static Range findStackedRangeBounds(TableXYDataset dataset, * * @since 1.0.5 */ - public static double calculateStackTotal(TableXYDataset dataset, int item) { + public static double calculateStackTotal(TableXYDataset dataset, /*@NonNegative*/ int item) { double total = 0.0; int seriesCount = dataset.getSeriesCount(); for (int s = 0; s < seriesCount; s++) { diff --git a/src/main/java/org/jfree/data/general/DefaultPieDataset.java b/src/main/java/org/jfree/data/general/DefaultPieDataset.java index 7078722ce..7075eda3e 100644 --- a/src/main/java/org/jfree/data/general/DefaultPieDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultPieDataset.java @@ -56,6 +56,7 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Collections; @@ -107,7 +108,7 @@ public DefaultPieDataset(KeyedValues data) { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.data.getItemCount(); } @@ -134,7 +135,7 @@ public List getKeys() { * specified range. */ @Override - public Comparable getKey(int item) { + public Comparable getKey(/*@NonNegative*/ int item) { return this.data.getKey(item); } @@ -161,7 +162,7 @@ public int getIndex(Comparable key) { * @return The value (possibly {@code null}). */ @Override - public Number getValue(int item) { + public Number getValue(/*@NonNegative*/ int item) { Number result = null; if (getItemCount() > item) { result = this.data.getValue(item); diff --git a/src/main/java/org/jfree/data/general/HeatMapUtils.java b/src/main/java/org/jfree/data/general/HeatMapUtils.java index ec43459f4..bb5606801 100644 --- a/src/main/java/org/jfree/data/general/HeatMapUtils.java +++ b/src/main/java/org/jfree/data/general/HeatMapUtils.java @@ -40,6 +40,7 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.Paint; @@ -89,7 +90,7 @@ public static XYDataset extractRowFromHeatMapDataset(HeatMapDataset dataset, * @return The dataset. */ public static XYDataset extractColumnFromHeatMapDataset( - HeatMapDataset dataset, int column, Comparable seriesName) { + HeatMapDataset dataset, /*@NonNegative*/ int column, Comparable seriesName) { XYSeries series = new XYSeries(seriesName); int rows = dataset.getYSampleCount(); for (int r = 0; r < rows; r++) { diff --git a/src/main/java/org/jfree/data/general/Series.java b/src/main/java/org/jfree/data/general/Series.java index 7c755dd0d..a27a6ccf8 100644 --- a/src/main/java/org/jfree/data/general/Series.java +++ b/src/main/java/org/jfree/data/general/Series.java @@ -55,6 +55,7 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; @@ -235,7 +236,7 @@ public boolean isEmpty() { * * @return The number of data items in the series. */ - public abstract int getItemCount(); + public abstract /*@NonNegative*/ int getItemCount(); /** * Returns a clone of the series. diff --git a/src/main/java/org/jfree/data/general/SeriesDataset.java b/src/main/java/org/jfree/data/general/SeriesDataset.java index 2bbe69432..c9494cb9c 100644 --- a/src/main/java/org/jfree/data/general/SeriesDataset.java +++ b/src/main/java/org/jfree/data/general/SeriesDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -69,7 +70,7 @@ public interface SeriesDataset extends Dataset { * * @return The series count. */ - public int getSeriesCount(); + public /*@NonNegative*/ int getSeriesCount(); /** * Returns the key for a series. @@ -89,6 +90,6 @@ public interface SeriesDataset extends Dataset { * * @return The index, or -1. */ - public int indexOf(Comparable seriesKey); + public /*@GTENegativeOne*/ int indexOf(Comparable seriesKey); } diff --git a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java index 514ac0433..05d0b2c68 100644 --- a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java +++ b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java @@ -71,6 +71,7 @@ */ package org.jfree.data.jdbc; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.sql.Connection; import java.sql.DriverManager; @@ -423,7 +424,7 @@ public void executeQuery(Connection con, String query) * @see XYDataset */ @Override - public Number getX(int seriesIndex, int itemIndex) { + public Number getX(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { ArrayList row = (ArrayList) this.rows.get(itemIndex); return (Number) row.get(0); } @@ -439,7 +440,7 @@ public Number getX(int seriesIndex, int itemIndex) { * @see XYDataset */ @Override - public Number getY(int seriesIndex, int itemIndex) { + public Number getY(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { ArrayList row = (ArrayList) this.rows.get(itemIndex); return (Number) row.get(seriesIndex + 1); } @@ -454,7 +455,7 @@ public Number getY(int seriesIndex, int itemIndex) { * @see XYDataset */ @Override - public int getItemCount(int seriesIndex) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { return this.rows.size(); } @@ -465,7 +466,7 @@ public int getItemCount(int seriesIndex) { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return getItemCount(0); } @@ -478,7 +479,7 @@ public int getItemCount() { * @see Dataset */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.columnNames.length; } @@ -493,7 +494,7 @@ public int getSeriesCount() { * @see Dataset */ @Override - public Comparable getSeriesKey(int seriesIndex) { + public Comparable getSeriesKey(/*@NonNegative*/ int seriesIndex) { if ((seriesIndex < this.columnNames.length) && (this.columnNames[seriesIndex] != null)) { diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java index 66e0bd14f..835d6707d 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java @@ -44,6 +44,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.List; @@ -63,7 +64,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The mean value. */ - public Number getMeanValue(int row, int column); + public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the average value for an item. @@ -83,7 +84,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The median value. */ - public Number getMedianValue(int row, int column); + public Number getMedianValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the median value for an item. @@ -103,7 +104,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The q1median value. */ - public Number getQ1Value(int row, int column); + public Number getQ1Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the q1median value for an item. @@ -123,7 +124,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The q3median value. */ - public Number getQ3Value(int row, int column); + public Number getQ3Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the q3median value for an item. @@ -143,7 +144,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The minimum regular value. */ - public Number getMinRegularValue(int row, int column); + public Number getMinRegularValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the minimum regular (non-outlier) value for an item. @@ -163,7 +164,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The maximum regular value. */ - public Number getMaxRegularValue(int row, int column); + public Number getMaxRegularValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the maximum regular (non-outlier) value for an item. @@ -183,7 +184,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The minimum outlier. */ - public Number getMinOutlier(int row, int column); + public Number getMinOutlier(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the minimum outlier (non-farout) for an item. @@ -203,7 +204,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The maximum outlier. */ - public Number getMaxOutlier(int row, int column); + public Number getMaxOutlier(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the maximum outlier (non-farout) for an item. @@ -224,7 +225,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return A list of outliers for an item. */ - public List getOutliers(int row, int column); + public List getOutliers(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns a list of outlier values for an item. The list may be empty, diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java index 3565fc01c..e1c0d398c 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java @@ -77,7 +77,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The mean for the specified series and item. */ - public Number getMeanValue(/*@NonNegative*/ int series, int item); + public Number getMeanValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the median-value for the specified series and item. @@ -87,7 +87,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The median-value for the specified series and item. */ - public Number getMedianValue(/*@NonNegative*/ int series, int item); + public Number getMedianValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the Q1 median-value for the specified series and item. @@ -97,7 +97,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The Q1 median-value for the specified series and item. */ - public Number getQ1Value(/*@NonNegative*/ int series, int item); + public Number getQ1Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the Q3 median-value for the specified series and item. @@ -107,7 +107,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The Q3 median-value for the specified series and item. */ - public Number getQ3Value(/*@NonNegative*/ int series, int item); + public Number getQ3Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the min-value for the specified series and item. @@ -117,7 +117,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The min-value for the specified series and item. */ - public Number getMinRegularValue(/*@NonNegative*/ int series, int item); + public Number getMinRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the max-value for the specified series and item. @@ -127,7 +127,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The max-value for the specified series and item. */ - public Number getMaxRegularValue(/*@NonNegative*/ int series, int item); + public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the minimum value which is not a farout. @@ -136,7 +136,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return A {@code Number} representing the maximum non-farout value. */ - public Number getMinOutlier(/*@NonNegative*/ int series, int item); + public Number getMinOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the maximum value which is not a farout, ie Q3 + (interquartile @@ -147,7 +147,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return A {@code Number} representing the maximum non-farout value. */ - public Number getMaxOutlier(/*@NonNegative*/ int series, int item); + public Number getMaxOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns a list of outliers for the specified series and item. @@ -158,7 +158,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * @return The list of outliers for the specified series and item * (possibly {@code null}). */ - public List getOutliers(/*@NonNegative*/ int series, int item); + public List getOutliers(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the value used as the outlier coefficient. The outlier diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java index a9a132746..0cd222994 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java @@ -305,7 +305,7 @@ public void clear() { * * @return The item. */ - public BoxAndWhiskerItem getItem(int row, int column) { + public BoxAndWhiskerItem getItem(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return (BoxAndWhiskerItem) this.data.getObject(row, column); } @@ -321,7 +321,7 @@ public BoxAndWhiskerItem getItem(int row, int column) { * @see #getValue(Comparable, Comparable) */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getMedianValue(row, column); } @@ -352,7 +352,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMeanValue(int row, int column) { + public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject(row, @@ -396,7 +396,7 @@ public Number getMeanValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMedianValue(int row, int column) { + public Number getMedianValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject(row, column); @@ -438,7 +438,7 @@ public Number getMedianValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getQ1Value(int row, int column) { + public Number getQ1Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -480,7 +480,7 @@ public Number getQ1Value(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getQ3Value(int row, int column) { + public Number getQ3Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -535,7 +535,7 @@ public int getColumnIndex(Comparable key) { * @see #getColumnIndex(Comparable) */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.data.getColumnKey(column); } @@ -576,7 +576,7 @@ public int getRowIndex(Comparable key) { * @see #getRowIndex(Comparable) */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return this.data.getRowKey(row); } @@ -670,7 +670,7 @@ public Range getRangeBounds(boolean includeInterval) { * @see #getItem(int, int) */ @Override - public Number getMinRegularValue(int row, int column) { + public Number getMinRegularValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -712,7 +712,7 @@ public Number getMinRegularValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMaxRegularValue(int row, int column) { + public Number getMaxRegularValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -754,7 +754,7 @@ public Number getMaxRegularValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMinOutlier(int row, int column) { + public Number getMinOutlier(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -796,7 +796,7 @@ public Number getMinOutlier(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMaxOutlier(int row, int column) { + public Number getMaxOutlier(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -838,7 +838,7 @@ public Number getMaxOutlier(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public List getOutliers(int row, int column) { + public List getOutliers(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { List result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index 9d6e4f8d8..bb4169ffa 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -204,7 +204,7 @@ public void setFaroutCoefficient(double faroutCoefficient) { * @return The number of series. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return 1; } @@ -216,7 +216,7 @@ public int getSeriesCount() { * @return The number of items in the specified series. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return this.dates.size(); } @@ -274,7 +274,7 @@ public Comparable getSeriesKey(int i) { * * @return The item. */ - public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, int item) { + public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return (BoxAndWhiskerItem) this.items.get(item); } @@ -290,7 +290,7 @@ public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Long(((Date) this.dates.get(item)).getTime()); } @@ -304,7 +304,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * * @return The x-value as a Date. */ - public Date getXDate(/*@NonNegative*/ int series, int item) { + public Date getXDate(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return (Date) this.dates.get(item); } @@ -320,7 +320,7 @@ public Date getXDate(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getMeanValue(series, item); } @@ -333,7 +333,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The mean for the specified series and item. */ @Override - public Number getMeanValue(/*@NonNegative*/ int series, int item) { + public Number getMeanValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -351,7 +351,7 @@ public Number getMeanValue(/*@NonNegative*/ int series, int item) { * @return The median-value for the specified series and item. */ @Override - public Number getMedianValue(/*@NonNegative*/ int series, int item) { + public Number getMedianValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -369,7 +369,7 @@ public Number getMedianValue(/*@NonNegative*/ int series, int item) { * @return The Q1 median-value for the specified series and item. */ @Override - public Number getQ1Value(/*@NonNegative*/ int series, int item) { + public Number getQ1Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -387,7 +387,7 @@ public Number getQ1Value(/*@NonNegative*/ int series, int item) { * @return The Q3 median-value for the specified series and item. */ @Override - public Number getQ3Value(/*@NonNegative*/ int series, int item) { + public Number getQ3Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -405,7 +405,7 @@ public Number getQ3Value(/*@NonNegative*/ int series, int item) { * @return The min-value for the specified series and item. */ @Override - public Number getMinRegularValue(/*@NonNegative*/ int series, int item) { + public Number getMinRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -423,7 +423,7 @@ public Number getMinRegularValue(/*@NonNegative*/ int series, int item) { * @return The max-value for the specified series and item. */ @Override - public Number getMaxRegularValue(/*@NonNegative*/ int series, int item) { + public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -440,7 +440,7 @@ public Number getMaxRegularValue(/*@NonNegative*/ int series, int item) { * @return A {@code Number} representing the maximum non-farout value. */ @Override - public Number getMinOutlier(/*@NonNegative*/ int series, int item) { + public Number getMinOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -459,7 +459,7 @@ public Number getMinOutlier(/*@NonNegative*/ int series, int item) { * @return A {@code Number} representing the maximum non-farout value. */ @Override - public Number getMaxOutlier(/*@NonNegative*/ int series, int item) { + public Number getMaxOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -478,7 +478,7 @@ public Number getMaxOutlier(/*@NonNegative*/ int series, int item) { * (possibly {@code null}). */ @Override - public List getOutliers(/*@NonNegative*/ int series, int item) { + public List getOutliers(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { List result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { diff --git a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java index a1a85dcfe..500ea546d 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java @@ -41,6 +41,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.ArrayList; import java.util.Collections; @@ -163,7 +164,7 @@ else if (minval < this.minimumRangeValue.doubleValue()) { * @return The list of values. */ @Override - public List getValues(int row, int column) { + public List getValues(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { List values = (List) this.data.getObject(row, column); if (values != null) { return Collections.unmodifiableList(values); @@ -226,7 +227,7 @@ public Number getValue(Comparable row, Comparable column) { * @return The average value. */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { List l = (List) this.data.getObject(row, column); double average = 0.0d; int count = 0; @@ -266,7 +267,7 @@ public int getColumnIndex(Comparable key) { * @return The column key. */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.data.getColumnKey(column); } @@ -300,7 +301,7 @@ public int getRowIndex(Comparable key) { * @return The row key. */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return this.data.getRowKey(row); } diff --git a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java index 4775338b1..e1cff76c9 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java @@ -56,6 +56,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.List; import org.jfree.chart.util.PublicCloneable; @@ -152,7 +153,7 @@ public DefaultStatisticalCategoryDataset() { * @return The mean value (possibly {@code null}). */ @Override - public Number getMeanValue(int row, int column) { + public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; MeanAndStandardDeviation masd = (MeanAndStandardDeviation) this.data.getObject(row, column); @@ -172,7 +173,7 @@ public Number getMeanValue(int row, int column) { * @return The value (possibly {@code null}). */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getMeanValue(row, column); } @@ -218,7 +219,7 @@ public Number getMeanValue(Comparable rowKey, Comparable columnKey) { * @return The standard deviation (possibly {@code null}). */ @Override - public Number getStdDevValue(int row, int column) { + public Number getStdDevValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; MeanAndStandardDeviation masd = (MeanAndStandardDeviation) this.data.getObject(row, column); @@ -268,7 +269,7 @@ public int getColumnIndex(Comparable key) { * @return The column key. */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.data.getColumnKey(column); } @@ -303,7 +304,7 @@ public int getRowIndex(Comparable key) { * @return The row key. */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return this.data.getRowKey(row); } diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index 2d165837c..c6cc6a811 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -302,7 +302,7 @@ private double getBinWidth(/*@NonNegative*/ int series) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.list.size(); } @@ -335,7 +335,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return getBins(series).size(); } @@ -355,7 +355,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * specified range. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); double x = (bin.getStartBoundary() + bin.getEndBoundary()) / 2.; @@ -376,7 +376,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * specified range. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); double total = getTotal(series); @@ -409,7 +409,7 @@ else if (this.type == HistogramType.SCALE_AREA_TO_1) { * specified range. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); return new Double(bin.getStartBoundary()); @@ -428,7 +428,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * specified range. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); return new Double(bin.getEndBoundary()); @@ -449,7 +449,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * specified range. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -468,7 +468,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * specified range. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java index a5041baa1..aa7dbb4d6 100644 --- a/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java @@ -39,6 +39,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.List; @@ -60,7 +61,7 @@ public interface MultiValueCategoryDataset extends CategoryDataset { * * @return The list of values. */ - public List getValues(int row, int column); + public List getValues(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns a list (possibly empty) of the values for the specified item. diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java index 3026b6d7a..bf1bcc130 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java @@ -39,6 +39,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; @@ -127,7 +128,7 @@ public double getUpperBound() { * * @return The item count. */ - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.itemCount; } diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index 5eca406da..8b8513351 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -130,7 +130,7 @@ public void setAdjustForBinSize(boolean adjust) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return 1; } @@ -166,7 +166,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return this.bins.size(); } @@ -286,7 +286,7 @@ public void removeAllBins() { * @return The x-value (never {@code null}). */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getXValue(series, item)); } @@ -299,7 +299,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return (bin.getLowerBound() + bin.getUpperBound()) / 2.0; } @@ -313,7 +313,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @return The y-value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getYValue(series, item)); } @@ -328,7 +328,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @see #getAdjustForBinSize() */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); if (this.adjustForBinSize) { return bin.getItemCount() @@ -348,7 +348,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getStartXValue(series, item)); } @@ -362,7 +362,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The start x-value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return bin.getLowerBound(); } @@ -376,7 +376,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getEndXValue(series, item)); } @@ -390,7 +390,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The end x-value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return bin.getUpperBound(); } @@ -404,7 +404,7 @@ public double getEndXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -418,7 +418,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The start y-value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getYValue(series, item); } @@ -431,7 +431,7 @@ public double getStartYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -445,7 +445,7 @@ public Number getEndY(/*@NonNegative*/ int series, int item) { * @return The end y-value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getYValue(series, item); } diff --git a/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java b/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java index 7c9cb4921..5148efe07 100644 --- a/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java @@ -44,6 +44,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.category.CategoryDataset; @@ -61,7 +62,7 @@ public interface StatisticalCategoryDataset extends CategoryDataset { * * @return The mean value (possibly {@code null}). */ - public Number getMeanValue(int row, int column); + public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the mean value for an item. @@ -81,7 +82,7 @@ public interface StatisticalCategoryDataset extends CategoryDataset { * * @return The standard deviation (possibly {@code null}). */ - public Number getStdDevValue(int row, int column); + public Number getStdDevValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the standard deviation value for an item. diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 9af13f275..681345b11 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -466,7 +466,7 @@ public void addValue(int seriesNumber, /*@NonNegative*/ int index, float value) * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.seriesCount; } @@ -480,7 +480,7 @@ public int getSeriesCount() { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, // so ignore argument: return this.historyCount; } @@ -730,7 +730,7 @@ public RegularTimePeriod getOldestTime() { // getXxx() ftns can ignore the "series" argument: // Don't synchronize this!! Instead, synchronize the loop that calls it. @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(getX(tp)); } @@ -744,7 +744,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { // Don't synchronize this!! // Instead, synchronize the loop that calls it. ValueSequence values = this.valueHistory[series]; @@ -760,7 +760,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Float(getYValue(series, item)); } @@ -773,7 +773,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(tp.getFirstMillisecond(this.workingCalendar)); } @@ -787,7 +787,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(tp.getLastMillisecond(this.workingCalendar)); } @@ -801,7 +801,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -814,17 +814,17 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } /* // "Extras" found useful when analyzing/verifying class behavior: - public Number getUntranslatedXValue(int series, int item) + public Number getUntranslatedXValue(int series, @NonNegative int item) { return super.getXValue(series, item); } - public float getUntranslatedY(int series, int item) + public float getUntranslatedY(int series, @NonNegative int item) { return super.getY(series, item); } */ diff --git a/src/main/java/org/jfree/data/time/MovingAverage.java b/src/main/java/org/jfree/data/time/MovingAverage.java index c45ab2e49..08774c045 100644 --- a/src/main/java/org/jfree/data/time/MovingAverage.java +++ b/src/main/java/org/jfree/data/time/MovingAverage.java @@ -50,6 +50,8 @@ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ + import org.jfree.chart.util.Args; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; @@ -140,9 +142,10 @@ public static TimeSeries createMovingAverage(TimeSeries source, boolean finished = false; while ((offset < periodCount) && (!finished)) { - if ((i - offset) >= 0) { + int itemIndex = i - offset; + if (itemIndex >= 0) { TimeSeriesDataItem item = source.getRawDataItem( - i - offset); + itemIndex); RegularTimePeriod p = item.getPeriod(); Number v = item.getValue(); long currentIndex = p.getSerialIndex(); @@ -206,15 +209,16 @@ public static TimeSeries createPointMovingAverage(TimeSeries source, // FIXME: what if value is null on next line? rollingSumForPeriod += current.getValue().doubleValue(); - if (i > pointCount - 1) { + int startIndex = i - pointCount; + if (startIndex >= 0) { // remove the point i-periodCount out of the rolling sum. TimeSeriesDataItem startOfMovingAvg = source.getRawDataItem( - i - pointCount); + startIndex); rollingSumForPeriod -= startOfMovingAvg.getValue() .doubleValue(); result.add(period, rollingSumForPeriod / pointCount); } - else if (i == pointCount - 1) { + else if (startIndex == - 1) { result.add(period, rollingSumForPeriod / pointCount); } } @@ -280,7 +284,7 @@ public static XYDataset createMovingAverage(XYDataset source, * @return The dataset. */ public static XYSeries createMovingAverage(XYDataset source, - int series, String name, double period, double skip) { + /*@NonNegative*/ int series, String name, double period, double skip) { Args.nullNotPermitted(source, "source"); if (period < Double.MIN_VALUE) { diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index 2097a0d4d..2b4776c5d 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -61,6 +61,10 @@ package org.jfree.data.time; +/*>>> +import org.checkerframework.common.value.qual.*; + */ + import java.io.Serializable; import java.util.Calendar; import java.util.Date; @@ -86,13 +90,13 @@ public class Quarter extends RegularTimePeriod implements Serializable { public static final int LAST_QUARTER = 4; /** The first month in each quarter. */ - public static final int[] FIRST_MONTH_IN_QUARTER = { + public static final int /*@ArrayLen(5)*/ [] FIRST_MONTH_IN_QUARTER = { 0, MonthConstants.JANUARY, MonthConstants.APRIL, MonthConstants.JULY, MonthConstants.OCTOBER }; /** The last month in each quarter. */ - public static final int[] LAST_MONTH_IN_QUARTER = { + public static final int /*@ArrayLen(5)*/ [] LAST_MONTH_IN_QUARTER = { 0, MonthConstants.MARCH, MonthConstants.JUNE, MonthConstants.SEPTEMBER, MonthConstants.DECEMBER }; @@ -101,7 +105,7 @@ public class Quarter extends RegularTimePeriod implements Serializable { private short year; /** The quarter (1-4). */ - private byte quarter; + private /*@IntVal({1,2,3,4})*/ byte quarter; /** The first millisecond. */ private long firstMillisecond; @@ -122,7 +126,7 @@ public Quarter() { * @param year the year (1900 to 9999). * @param quarter the quarter (1 to 4). */ - public Quarter(int quarter, int year) { + public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, /*@IntRange(from=1900, to = 9999)*/int year) { if ((quarter < FIRST_QUARTER) || (quarter > LAST_QUARTER)) { throw new IllegalArgumentException("Quarter outside valid range."); } @@ -137,7 +141,7 @@ public Quarter(int quarter, int year) { * @param quarter the quarter (1 to 4). * @param year the year (1900 to 9999). */ - public Quarter(int quarter, Year year) { + public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, Year year) { if ((quarter < FIRST_QUARTER) || (quarter > LAST_QUARTER)) { throw new IllegalArgumentException("Quarter outside valid range."); } @@ -182,7 +186,7 @@ public Quarter(Date time, TimeZone zone, Locale locale) { * * @return The quarter. */ - public int getQuarter() { + public /*@IntVal({1,2,3,4})*/ int getQuarter() { return this.quarter; } @@ -202,7 +206,7 @@ public Year getYear() { * * @since 1.0.3 */ - public int getYearValue() { + public /*@IntRange(from = 1900, to = 9999)*/ int getYearValue() { return this.year; } diff --git a/src/main/java/org/jfree/data/time/TimePeriodValues.java b/src/main/java/org/jfree/data/time/TimePeriodValues.java index a82a395f6..84767a00e 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValues.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValues.java @@ -47,6 +47,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.GTENegativeOne; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -88,22 +89,22 @@ public class TimePeriodValues extends Series implements Serializable { private List data; /** Index of the time period with the minimum start milliseconds. */ - private int minStartIndex = -1; + private /*@GTENegativeOne*/ int minStartIndex = -1; /** Index of the time period with the maximum start milliseconds. */ - private int maxStartIndex = -1; + private /*@GTENegativeOne*/ int maxStartIndex = -1; /** Index of the time period with the minimum middle milliseconds. */ - private int minMiddleIndex = -1; + private /*@GTENegativeOne*/ int minMiddleIndex = -1; /** Index of the time period with the maximum middle milliseconds. */ - private int maxMiddleIndex = -1; + private /*@GTENegativeOne*/ int maxMiddleIndex = -1; /** Index of the time period with the minimum end milliseconds. */ - private int minEndIndex = -1; + private /*@GTENegativeOne*/ int minEndIndex = -1; /** Index of the time period with the maximum end milliseconds. */ - private int maxEndIndex = -1; + private /*@GTENegativeOne*/ int maxEndIndex = -1; /** * Creates a new (empty) collection of time period values. @@ -190,7 +191,7 @@ public void setRangeDescription(String description) { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.data.size(); } @@ -395,7 +396,7 @@ public void update(/*@NonNegative*/ int index, Number value) { * @param start the index of the first period to delete. * @param end the index of the last period to delete. */ - public void delete(int start, int end) { + public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { for (int i = 0; i <= (end - start); i++) { this.data.remove(start); } @@ -494,7 +495,7 @@ public Object clone() throws CloneNotSupportedException { * * @throws CloneNotSupportedException if there is a cloning problem. */ - public TimePeriodValues createCopy(int start, int end) + public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@NonNegative*/ int end) throws CloneNotSupportedException { TimePeriodValues copy = (TimePeriodValues) super.clone(); @@ -521,7 +522,7 @@ public TimePeriodValues createCopy(int start, int end) * * @return The index. */ - public int getMinStartIndex() { + public /*@GTENegativeOne*/ int getMinStartIndex() { return this.minStartIndex; } @@ -530,7 +531,7 @@ public int getMinStartIndex() { * * @return The index. */ - public int getMaxStartIndex() { + public /*@GTENegativeOne*/ int getMaxStartIndex() { return this.maxStartIndex; } @@ -540,7 +541,7 @@ public int getMaxStartIndex() { * * @return The index. */ - public int getMinMiddleIndex() { + public /*@GTENegativeOne*/ int getMinMiddleIndex() { return this.minMiddleIndex; } @@ -550,7 +551,7 @@ public int getMinMiddleIndex() { * * @return The index. */ - public int getMaxMiddleIndex() { + public /*@GTENegativeOne*/ int getMaxMiddleIndex() { return this.maxMiddleIndex; } @@ -559,7 +560,7 @@ public int getMaxMiddleIndex() { * * @return The index. */ - public int getMinEndIndex() { + public /*@GTENegativeOne*/ int getMinEndIndex() { return this.minEndIndex; } @@ -568,7 +569,7 @@ public int getMinEndIndex() { * * @return The index. */ - public int getMaxEndIndex() { + public /*@GTENegativeOne*/ int getMaxEndIndex() { return this.maxEndIndex; } diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index d1881cbae..38a75a058 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -139,7 +139,7 @@ public void setXPosition(TimePeriodAnchor position) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -219,7 +219,7 @@ public void removeSeries(/*@NonNegative*/ int index) { * @return The number of items in the specified series. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } @@ -232,7 +232,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The x-value for the specified series and item. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); TimePeriod period = dp.getPeriod(); @@ -273,7 +273,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The starting X value for the specified series and item. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return new Long(dp.getPeriod().getStart().getTime()); @@ -288,7 +288,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The ending X value for the specified series and item. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return new Long(dp.getPeriod().getEnd().getTime()); @@ -303,7 +303,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The y-value for the specified series and item. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return dp.getValue(); @@ -318,7 +318,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The starting Y value for the specified series and item. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -331,7 +331,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The ending Y value for the specified series and item. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index c5d6bd128..32eb52692 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -257,7 +257,7 @@ public void setRangeDescription(String description) { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.data.size(); } @@ -558,6 +558,7 @@ public RegularTimePeriod getTimePeriod(/*@NonNegative*/ int index) { * @return The next time period. */ public RegularTimePeriod getNextTimePeriod() { + @SuppressWarnings("index") // I believe this is a bug TODO: patch RegularTimePeriod last = getTimePeriod(getItemCount() - 1); return last.next(); } diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index 0defca3de..bf087a785 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -87,6 +87,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -242,7 +243,7 @@ public List getSeries() { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -256,7 +257,7 @@ public int getSeriesCount() { * * @since 1.0.6 */ - public int indexOf(TimeSeries series) { + public /*@GTENegativeOne*/ int indexOf(TimeSeries series) { Args.nullNotPermitted(series, "series"); return this.data.indexOf(series); } @@ -402,7 +403,7 @@ public void removeAllSeries() { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } @@ -415,7 +416,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimeSeries s = (TimeSeries) this.data.get(series); RegularTimePeriod period = s.getTimePeriod(item); return getX(period); @@ -430,7 +431,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimeSeries ts = (TimeSeries) this.data.get(series); RegularTimePeriod period = ts.getTimePeriod(item); return new Long(getX(period)); @@ -466,7 +467,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The value. */ @Override - public synchronized Number getStartX(/*@NonNegative*/ int series, int item) { + public synchronized Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return new Long(ts.getTimePeriod(item).getFirstMillisecond( this.workingCalendar)); @@ -481,7 +482,7 @@ public synchronized Number getStartX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public synchronized Number getEndX(/*@NonNegative*/ int series, int item) { + public synchronized Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return new Long(ts.getTimePeriod(item).getLastMillisecond( this.workingCalendar)); @@ -496,7 +497,7 @@ public synchronized Number getEndX(/*@NonNegative*/ int series, int item) { * @return The value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return ts.getValue(item); } @@ -510,7 +511,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The value (possibly {@code null}). */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -523,7 +524,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The value (possibly {@code null}). */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java index b1e1ec33b..a39061fcf 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java @@ -42,6 +42,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import javax.swing.table.AbstractTableModel; @@ -114,7 +115,7 @@ public int getColumnCount() { * @return The column class in the table model. */ @Override - public Class getColumnClass(int column) { + public Class getColumnClass(/*@NonNegative*/ int column) { if (column == 0) { return String.class; } @@ -136,7 +137,7 @@ public Class getColumnClass(int column) { * @return The name of a column. */ @Override - public String getColumnName(int column) { + public String getColumnName(/*@NonNegative*/ int column) { if (column == 0) { return "Period:"; @@ -171,7 +172,7 @@ public int getRowCount() { * @return The data value for a cell in the table model. */ @Override - public Object getValueAt(int row, int column) { + public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (row < this.series.getItemCount()) { if (column == 0) { @@ -211,7 +212,7 @@ public Object getValueAt(int row, int column) { * @return {@code true} if the specified cell is editable. */ @Override - public boolean isCellEditable(int row, int column) { + public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (this.editable) { if ((column == 0) || (column == 1)) { return true; @@ -233,7 +234,7 @@ public boolean isCellEditable(int row, int column) { * @param column the column. */ @Override - public void setValueAt(Object value, int row, int column) { + public void setValueAt(Object value, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (row < this.series.getItemCount()) { diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index 59fce145a..a3f94c23d 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -302,7 +302,7 @@ public void clear() { * * @return The time period. */ - public TimePeriod getTimePeriod(int item) { + public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { return (TimePeriod) this.values.getRowKey(item); } @@ -312,7 +312,7 @@ public TimePeriod getTimePeriod(int item) { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.values.getRowCount(); } @@ -326,7 +326,7 @@ public int getItemCount() { * @return The number of items within the series. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return getItemCount(); } @@ -336,7 +336,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.values.getColumnCount(); } @@ -363,7 +363,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getXValue(series, item)); } @@ -376,7 +376,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return getXValue(period); } @@ -392,7 +392,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @see #getStartXValue(int, int) */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getStartXValue(series, item)); } @@ -406,7 +406,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return period.getStart().getTime(); } @@ -422,7 +422,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * @see #getEndXValue(int, int) */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getEndXValue(series, item)); } @@ -436,7 +436,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return period.getEnd().getTime(); } @@ -450,7 +450,7 @@ public double getEndXValue(/*@NonNegative*/ int series, int item) { * @return The y-value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.values.getValue(item, series); } @@ -463,7 +463,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The starting Y value for the specified series and item. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -476,7 +476,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The ending Y value for the specified series and item. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index 6706dd250..9d7b26f4b 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -129,7 +129,7 @@ public void addSeries(OHLCSeries series) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -178,7 +178,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -213,7 +213,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); RegularTimePeriod period = di.getPeriod(); @@ -229,7 +229,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getXValue(series, item)); } @@ -242,7 +242,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return new Double(di.getYValue()); @@ -257,7 +257,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The open-value. */ @Override - public double getOpenValue(/*@NonNegative*/ int series, int item) { + public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getOpenValue(); @@ -272,7 +272,7 @@ public double getOpenValue(/*@NonNegative*/ int series, int item) { * @return The open-value. */ @Override - public Number getOpen(/*@NonNegative*/ int series, int item) { + public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getOpenValue(series, item)); } @@ -285,7 +285,7 @@ public Number getOpen(/*@NonNegative*/ int series, int item) { * @return The close-value. */ @Override - public double getCloseValue(/*@NonNegative*/ int series, int item) { + public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getCloseValue(); @@ -300,7 +300,7 @@ public double getCloseValue(/*@NonNegative*/ int series, int item) { * @return The close-value. */ @Override - public Number getClose(/*@NonNegative*/ int series, int item) { + public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getCloseValue(series, item)); } @@ -313,7 +313,7 @@ public Number getClose(/*@NonNegative*/ int series, int item) { * @return The high-value. */ @Override - public double getHighValue(/*@NonNegative*/ int series, int item) { + public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getHighValue(); @@ -328,7 +328,7 @@ public double getHighValue(/*@NonNegative*/ int series, int item) { * @return The high-value. */ @Override - public Number getHigh(/*@NonNegative*/ int series, int item) { + public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getHighValue(series, item)); } @@ -341,7 +341,7 @@ public Number getHigh(/*@NonNegative*/ int series, int item) { * @return The low-value. */ @Override - public double getLowValue(/*@NonNegative*/ int series, int item) { + public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getLowValue(); @@ -356,7 +356,7 @@ public double getLowValue(/*@NonNegative*/ int series, int item) { * @return The low-value. */ @Override - public Number getLow(/*@NonNegative*/ int series, int item) { + public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getLowValue(series, item)); } @@ -370,7 +370,7 @@ public Number getLow(/*@NonNegative*/ int series, int item) { * @return {@code null}. */ @Override - public Number getVolume(/*@NonNegative*/ int series, int item) { + public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return null; } @@ -384,7 +384,7 @@ public Number getVolume(/*@NonNegative*/ int series, int item) { * @return {@code Double.NaN}. */ @Override - public double getVolumeValue(/*@NonNegative*/ int series, int item) { + public double getVolumeValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return Double.NaN; } diff --git a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java index 79d1666f9..259242c0e 100644 --- a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java @@ -64,7 +64,7 @@ public abstract class AbstractIntervalXYDataset extends AbstractXYDataset * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number x = getStartX(series, item); if (x != null) { @@ -83,7 +83,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number x = getEndX(series, item); if (x != null) { @@ -102,7 +102,7 @@ public double getEndXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number y = getStartY(series, item); if (y != null) { @@ -121,7 +121,7 @@ public double getStartYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number y = getEndY(series, item); if (y != null) { diff --git a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java index c57659cd7..bd0372479 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java @@ -76,7 +76,7 @@ public DomainOrder getDomainOrder() { * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number x = getX(series, item); if (x != null) { @@ -94,7 +94,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number y = getY(series, item); if (y != null) { diff --git a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java index ae3f7b776..bdec664a4 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java @@ -61,7 +61,7 @@ public abstract class AbstractXYZDataset extends AbstractXYDataset * @return The z-value. */ @Override - public double getZValue(/*@NonNegative*/ int series, int item) { + public double getZValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number z = getZ(series, item); if (z != null) { diff --git a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java index 6517c6740..d43c47e50 100644 --- a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java @@ -163,7 +163,7 @@ public void clear() { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.values.getColumnCount(); } @@ -185,7 +185,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.values.getRowCount(); } @@ -198,7 +198,7 @@ public int getItemCount() { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return getItemCount(); // all series have the same number of items in // this dataset } @@ -212,7 +212,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return (Number) this.values.getRowKey(item); } @@ -225,7 +225,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The starting X value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -238,7 +238,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The ending X value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.intervalDelegate.getEndX(series, item); } @@ -251,7 +251,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The y value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.values.getValue(item, series); } @@ -264,7 +264,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The starting Y value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -277,7 +277,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The ending Y value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java index 2372f1ed5..25afc2933 100644 --- a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java @@ -146,7 +146,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @see #getXDate(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Long(this.date[item].getTime()); } @@ -162,7 +162,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * * @see #getX(int, int) */ - public Date getXDate(/*@NonNegative*/ int series, int item) { + public Date getXDate(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.date[item]; } @@ -180,7 +180,7 @@ public Date getXDate(/*@NonNegative*/ int series, int item) { * @see #getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getClose(series, item); } @@ -195,7 +195,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @see #getHighValue(int, int) */ @Override - public Number getHigh(/*@NonNegative*/ int series, int item) { + public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.high[item]; } @@ -211,7 +211,7 @@ public Number getHigh(/*@NonNegative*/ int series, int item) { * @see #getHigh(int, int) */ @Override - public double getHighValue(/*@NonNegative*/ int series, int item) { + public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number h = getHigh(series, item); if (h != null) { @@ -231,7 +231,7 @@ public double getHighValue(/*@NonNegative*/ int series, int item) { * @see #getLowValue(int, int) */ @Override - public Number getLow(/*@NonNegative*/ int series, int item) { + public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.low[item]; } @@ -247,7 +247,7 @@ public Number getLow(/*@NonNegative*/ int series, int item) { * @see #getLow(int, int) */ @Override - public double getLowValue(/*@NonNegative*/ int series, int item) { + public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number l = getLow(series, item); if (l != null) { @@ -267,7 +267,7 @@ public double getLowValue(/*@NonNegative*/ int series, int item) { * @see #getOpenValue(int, int) */ @Override - public Number getOpen(/*@NonNegative*/ int series, int item) { + public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.open[item]; } @@ -283,7 +283,7 @@ public Number getOpen(/*@NonNegative*/ int series, int item) { * @see #getOpen(int, int) */ @Override - public double getOpenValue(/*@NonNegative*/ int series, int item) { + public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number open = getOpen(series, item); if (open != null) { @@ -303,7 +303,7 @@ public double getOpenValue(/*@NonNegative*/ int series, int item) { * @see #getCloseValue(int, int) */ @Override - public Number getClose(/*@NonNegative*/ int series, int item) { + public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.close[item]; } @@ -319,7 +319,7 @@ public Number getClose(/*@NonNegative*/ int series, int item) { * @see #getClose(int, int) */ @Override - public double getCloseValue(/*@NonNegative*/ int series, int item) { + public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number c = getClose(series, item); if (c != null) { @@ -339,7 +339,7 @@ public double getCloseValue(/*@NonNegative*/ int series, int item) { * @see #getVolumeValue(int, int) */ @Override - public Number getVolume(/*@NonNegative*/ int series, int item) { + public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.volume[item]; } @@ -355,7 +355,7 @@ public Number getVolume(/*@NonNegative*/ int series, int item) { * @see #getVolume(int, int) */ @Override - public double getVolumeValue(/*@NonNegative*/ int series, int item) { + public double getVolumeValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number v = getVolume(series, item); if (v != null) { @@ -372,7 +372,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, int item) { * @return The number of series. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return 1; } @@ -384,7 +384,7 @@ public int getSeriesCount() { * @return The number of items in the specified series. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return this.date.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java index 9032f092c..d0f232110 100644 --- a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java @@ -44,6 +44,10 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -80,7 +84,7 @@ public class DefaultIntervalXYDataset extends AbstractIntervalXYDataset * order of the series is significant. This list must be kept in sync * with the seriesKeys list. */ - private List seriesList; + private List seriesList; /** * Creates a new {@code DefaultIntervalXYDataset} instance, initially @@ -97,7 +101,7 @@ public DefaultIntervalXYDataset() { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.seriesList.size(); } @@ -132,11 +136,14 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf({"this.seriesList.get(#1)[0]", "this.seriesList.get(#1)[1]", "this.seriesList.get(#1)[2]", "this.seriesList.get(#1)[3]", "this.seriesList.get(#1)[4]", "this.seriesList.get(#1)[5]"})*/ int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - double[][] seriesArray = (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // class invariant: list of 2D arrays that are 6xN, where N is the same for each array + double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]", "this.seriesList.get(series)[2]", "this.seriesList.get(series)[3]", "this.seriesList.get(series)[4]", "this.seriesList.get(series)[5]"})*/ [] seriesArray = + (double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]", "this.seriesList.get(series)[2]", "this.seriesList.get(series)[3]", "this.seriesList.get(series)[4]", "this.seriesList.get(series)[5]"})*/ []) + this.seriesList.get(series); return seriesArray[0].length; } @@ -158,7 +165,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[0][item]; } @@ -181,7 +188,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[3]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[3][item]; } @@ -204,7 +211,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @see #getStartX(int, int) */ @Override - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[1][item]; } @@ -227,7 +234,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * @see #getEndX(int, int) */ @Override - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[2]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[2][item]; } @@ -250,7 +257,7 @@ public double getEndXValue(/*@NonNegative*/ int series, int item) { * @see #getStartY(int, int) */ @Override - public double getStartYValue(/*@NonNegative*/ int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[4]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[4][item]; } @@ -273,7 +280,7 @@ public double getStartYValue(/*@NonNegative*/ int series, int item) { * @see #getEndY(int, int) */ @Override - public double getEndYValue(/*@NonNegative*/ int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[5]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[5][item]; } @@ -296,7 +303,7 @@ public double getEndYValue(/*@NonNegative*/ int series, int item) { * @see #getEndXValue(int, int) */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[6]")*/ int item) { return new Double(getEndXValue(series, item)); } @@ -318,7 +325,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @see #getEndYValue(int, int) */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[5]")*/ int item) { return new Double(getEndYValue(series, item)); } @@ -340,7 +347,7 @@ public Number getEndY(/*@NonNegative*/ int series, int item) { * @see #getStartXValue(int, int) */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { return new Double(getStartXValue(series, item)); } @@ -362,7 +369,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @see #getStartYValue(int, int) */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[4]")*/ int item) { return new Double(getStartYValue(series, item)); } @@ -384,7 +391,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { return new Double(getXValue(series, item)); } @@ -406,7 +413,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @see #getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { return new Double(getYValue(series, item)); } @@ -421,7 +428,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * (x, xLow and xHigh) and the last three containing the y-values * (y, yLow and yHigh)). */ - public void addSeries(Comparable seriesKey, double[][] data) { + public void addSeries(Comparable seriesKey, double /*@ArrayLen(6)*/ [] /*@SameLen({"#2[0]", "#2[1]", "#2[2]", "#2[3]", "#2[4]", "#2[5]"})*/ [] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); @@ -468,6 +475,7 @@ public void addSeries(Comparable seriesKey, double[][] data) { * @return A boolean. */ @Override + @SuppressWarnings("index") // Equality test relies on well-formedness of other object, which can't be annotated perfectly because of array-list interop public boolean equals(Object obj) { if (obj == this) { return true; diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index 0a4592f1e..ac0409c47 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -98,7 +98,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Long(this.data[item].getDate().getTime()); } @@ -110,7 +110,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * * @return The x-value as a date. */ - public Date getXDate(/*@NonNegative*/ int series, int item) { + public Date getXDate(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.data[item].getDate(); } @@ -123,7 +123,7 @@ public Date getXDate(/*@NonNegative*/ int series, int item) { * @return The y value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getClose(series, item); } @@ -136,7 +136,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The high value. */ @Override - public Number getHigh(/*@NonNegative*/ int series, int item) { + public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.data[item].getHigh(); } @@ -150,7 +150,7 @@ public Number getHigh(/*@NonNegative*/ int series, int item) { * @return The high-value. */ @Override - public double getHighValue(/*@NonNegative*/ int series, int item) { + public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number high = getHigh(series, item); if (high != null) { @@ -168,7 +168,7 @@ public double getHighValue(/*@NonNegative*/ int series, int item) { * @return The low value. */ @Override - public Number getLow(/*@NonNegative*/ int series, int item) { + public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.data[item].getLow(); } @@ -182,7 +182,7 @@ public Number getLow(/*@NonNegative*/ int series, int item) { * @return The low-value. */ @Override - public double getLowValue(/*@NonNegative*/ int series, int item) { + public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number low = getLow(series, item); if (low != null) { @@ -200,7 +200,7 @@ public double getLowValue(/*@NonNegative*/ int series, int item) { * @return The open value. */ @Override - public Number getOpen(/*@NonNegative*/ int series, int item) { + public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.data[item].getOpen(); } @@ -214,7 +214,7 @@ public Number getOpen(/*@NonNegative*/ int series, int item) { * @return The open-value. */ @Override - public double getOpenValue(/*@NonNegative*/ int series, int item) { + public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number open = getOpen(series, item); if (open != null) { @@ -232,7 +232,7 @@ public double getOpenValue(/*@NonNegative*/ int series, int item) { * @return The close value. */ @Override - public Number getClose(/*@NonNegative*/ int series, int item) { + public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.data[item].getClose(); } @@ -246,7 +246,7 @@ public Number getClose(/*@NonNegative*/ int series, int item) { * @return The close-value. */ @Override - public double getCloseValue(/*@NonNegative*/ int series, int item) { + public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number close = getClose(series, item); if (close != null) { @@ -264,7 +264,7 @@ public double getCloseValue(/*@NonNegative*/ int series, int item) { * @return The trading volume. */ @Override - public Number getVolume(/*@NonNegative*/ int series, int item) { + public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.data[item].getVolume(); } @@ -278,7 +278,7 @@ public Number getVolume(/*@NonNegative*/ int series, int item) { * @return The volume-value. */ @Override - public double getVolumeValue(/*@NonNegative*/ int series, int item) { + public double getVolumeValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { double result = Double.NaN; Number volume = getVolume(series, item); if (volume != null) { @@ -293,7 +293,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, int item) { * @return 1. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return 1; } @@ -305,7 +305,7 @@ public int getSeriesCount() { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return this.data.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index 435ab5224..f7d6235da 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -215,7 +215,7 @@ public void updateXPoints() { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -225,7 +225,7 @@ public int getSeriesCount() { * @return The number of x values in the dataset. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { if (this.xPoints == null) { return 0; } @@ -269,7 +269,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The number of items in the specified series. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // check arguments...delegated return getSeries(series).getItemCount(); } @@ -283,7 +283,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The x-value for the specified series and item. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYSeries s = (XYSeries) this.data.get(series); return s.getX(item); @@ -298,7 +298,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The starting X value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -311,7 +311,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The ending X value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.intervalDelegate.getEndX(series, item); } @@ -339,7 +339,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int index) { * @return The starting Y value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -352,7 +352,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The ending Y value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index 2e512bd5e..52acc986f 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -49,6 +49,7 @@ /*>>> import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.common.value.qual.ArrayLen; */ import java.io.Serializable; @@ -88,7 +89,7 @@ public DefaultWindDataset() { * * @throws NullPointerException if {@code data} is {@code null}. */ - public DefaultWindDataset(Object[][][] data) { + public DefaultWindDataset(Object[][] /*@ArrayLen(3)*/ [] data) { this(seriesNameListFromDataArray(data), data); } @@ -101,7 +102,7 @@ public DefaultWindDataset(Object[][][] data) { * * @throws NullPointerException if {@code seriesNames} is {@code null}. */ - public DefaultWindDataset(String[] seriesNames, Object[][][] data) { + public DefaultWindDataset(String[] seriesNames, Object[][] /*@ArrayLen(3)*/ [] data) { this(Arrays.asList(seriesNames), data); } @@ -129,7 +130,7 @@ public DefaultWindDataset(String[] seriesNames, Object[][][] data) { * match the number of series in the array. * @throws NullPointerException if {@code data} is {@code null}. */ - public DefaultWindDataset(List seriesKeys, Object[][][] data) { + public DefaultWindDataset(List seriesKeys, Object[][] /*@ArrayLen(3)*/ [] data) { Args.nullNotPermitted(seriesKeys, "seriesKeys"); if (seriesKeys.size() != data.length) { throw new IllegalArgumentException("The number of series keys does " @@ -176,7 +177,7 @@ public DefaultWindDataset(List seriesKeys, Object[][][] data) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.allSeriesData.size(); } @@ -188,7 +189,7 @@ public int getSeriesCount() { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { if (series < 0 || series >= getSeriesCount()) { throw new IllegalArgumentException("Invalid series index: " + series); @@ -224,7 +225,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value for the item within the series. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getX(); @@ -241,7 +242,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The y-value for the item within the series. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getWindForce(series, item); } @@ -255,7 +256,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The wind direction for the item within the series. */ @Override - public Number getWindDirection(/*@NonNegative*/ int series, int item) { + public Number getWindDirection(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getWindDirection(); @@ -271,7 +272,7 @@ public Number getWindDirection(/*@NonNegative*/ int series, int item) { * @return The wind force for the item within the series. */ @Override - public Number getWindForce(/*@NonNegative*/ int series, int item) { + public Number getWindForce(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getWindForce(); diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index ff27ace01..a5e80433b 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -42,9 +42,10 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> -import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.common.value.qual.ArrayLen; */ import java.util.ArrayList; @@ -75,7 +76,7 @@ public class DefaultXYDataset extends AbstractXYDataset * order of the series is significant. This list must be kept in sync * with the seriesKeys list. */ - private List seriesList; + private List seriesList; /** * Creates a new {@code DefaultXYDataset} instance, initially @@ -92,7 +93,7 @@ public DefaultXYDataset() { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.seriesList.size(); } @@ -124,7 +125,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The index, or -1. */ @Override - public int indexOf(Comparable seriesKey) { + public /*@GTENegativeOne*/ int indexOf(Comparable seriesKey) { return this.seriesKeys.indexOf(seriesKey); } @@ -152,11 +153,14 @@ public DomainOrder getDomainOrder() { * specified range. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf({"this.seriesList.get(#1)[0]", "this.seriesList.get(#1)[1]"})*/ int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - double[][] seriesArray = (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // class invariant: list of 2D arrays that are 2xN, where N is the same for each array + double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]"})*/ [] seriesArray = + (double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]"})*/ []) + this.seriesList.get(series); return seriesArray[0].length; } @@ -178,7 +182,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[0][item]; } @@ -201,7 +205,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { return new Double(getXValue(series, item)); } @@ -223,7 +227,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[1][item]; } @@ -246,7 +250,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @see #getX(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { return new Double(getYValue(series, item)); } @@ -260,7 +264,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * arrays of equal length, the first containing the x-values and the * second containing the y-values). */ - public void addSeries(Comparable seriesKey, double[][] data) { + public void addSeries(Comparable seriesKey, double /*@ArrayLen(2)*/ [] /*@SameLen({"#2[0]", "#2[1]"})*/ [] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); @@ -319,6 +323,7 @@ public void removeSeries(Comparable seriesKey) { * @return A boolean. */ @Override + @SuppressWarnings("index") // Equality test relies on well-formedness of other object, which can't be annotated perfectly because of array-list interop public boolean equals(Object obj) { if (obj == this) { return true; diff --git a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java index 9af8797b6..877f3a267 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java @@ -43,6 +43,9 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -76,7 +79,7 @@ public class DefaultXYZDataset extends AbstractXYZDataset * order of the series is significant. This list must be kept in sync * with the seriesKeys list. */ - private List seriesList; + private List seriesList; /** * Creates a new {@code DefaultXYZDataset} instance, initially @@ -93,7 +96,7 @@ public DefaultXYZDataset() { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.seriesList.size(); } @@ -125,7 +128,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The index, or -1. */ @Override - public int indexOf(Comparable seriesKey) { + public /*@GTENegativeOne*/ int indexOf(Comparable seriesKey) { return this.seriesKeys.indexOf(seriesKey); } @@ -153,11 +156,14 @@ public DomainOrder getDomainOrder() { * specified range. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf({"this.seriesList.get(#1)[0]", "this.seriesList.get(#1)[1]", "this.seriesList.get(#1)[2]"})*/ int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - double[][] seriesArray = (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // class invariant: list of 2D arrays that are 3xN, where N is the same for each array + double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]", "this.seriesList.get(series)[2]"})*/ [] seriesArray = + (double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]", "this.seriesList.get(series)[2]"})*/ []) + this.seriesList.get(series); return seriesArray[0].length; } @@ -179,7 +185,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[0][item]; } @@ -202,7 +208,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { return new Double(getXValue(series, item)); } @@ -224,7 +230,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[1][item]; } @@ -247,7 +253,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @see #getX(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { return new Double(getYValue(series, item)); } @@ -269,7 +275,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @see #getZ(int, int) */ @Override - public double getZValue(/*@NonNegative*/ int series, int item) { + public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[2]")*/ int item) { double[][] seriesData = (double[][]) this.seriesList.get(series); return seriesData[2][item]; } @@ -292,7 +298,7 @@ public double getZValue(/*@NonNegative*/ int series, int item) { * @see #getZ(int, int) */ @Override - public Number getZ(/*@NonNegative*/ int series, int item) { + public Number getZ(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[2]")*/ int item) { return new Double(getZValue(series, item)); } @@ -307,7 +313,7 @@ public Number getZ(/*@NonNegative*/ int series, int item) { * second containing the y-values and the third containing the * z-values). */ - public void addSeries(Comparable seriesKey, double[][] data) { + public void addSeries(Comparable seriesKey, double /*@ArrayLen(3)*/ [] /*@SameLen({"#2[0]", "#2[1]", "#2[2]"})*/ [] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); @@ -367,6 +373,7 @@ public void removeSeries(Comparable seriesKey) { * @return A boolean. */ @Override + @SuppressWarnings("index") // Equality test relies on well-formedness of other object, which can't be annotated perfectly because of array-list interop public boolean equals(Object obj) { if (obj == this) { return true; diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java index f731b563c..1c992a83f 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java @@ -66,7 +66,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The lower bound of the x-interval ({@code null} permitted). */ - public Number getStartX(/*@NonNegative*/ int series, int item); + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the lower bound of the x-interval (as a double primitive) for @@ -79,7 +79,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getStartX(int, int) */ - public double getStartXValue(/*@NonNegative*/ int series, int item); + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the upper bound of the x-interval for the specified series and @@ -91,7 +91,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The upper bound of the x-interval ({@code null} permitted). */ - public Number getEndX(/*@NonNegative*/ int series, int item); + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the upper bound of the x-interval (as a double primitive) for @@ -104,7 +104,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getEndX(int, int) */ - public double getEndXValue(/*@NonNegative*/ int series, int item); + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the lower bound of the y-interval for the specified series and @@ -116,7 +116,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The lower bound of the y-interval ({@code null} permitted). */ - public Number getStartY(/*@NonNegative*/ int series, int item); + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the lower bound of the y-interval (as a double primitive) for @@ -129,7 +129,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getStartY(int, int) */ - public double getStartYValue(/*@NonNegative*/ int series, int item); + public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the upper bound of the y-interval for the specified series and @@ -141,7 +141,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The upper bound of the y-interval ({@code null} permitted). */ - public Number getEndY(/*@NonNegative*/ int series, int item); + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the upper bound of the y-interval (as a double primitive) for @@ -154,6 +154,6 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getEndY(int, int) */ - public double getEndYValue(/*@NonNegative*/ int series, int item); + public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java index ac0de9af9..df3556b27 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java @@ -261,7 +261,7 @@ public double getIntervalWidth() { * * @see #getStartXValue(int, int) */ - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number startX = null; Number x = this.dataset.getX(series, item); if (x != null) { @@ -281,7 +281,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * * @see #getStartX(int, int) */ - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.dataset.getXValue(series, item) - getIntervalPositionFactor() * getIntervalWidth(); } @@ -296,7 +296,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * * @see #getEndXValue(int, int) */ - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number endX = null; Number x = this.dataset.getX(series, item); if (x != null) { @@ -316,7 +316,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * * @see #getEndX(int, int) */ - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.dataset.getXValue(series, item) + (1.0 - getIntervalPositionFactor()) * getIntervalWidth(); } diff --git a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java index 7ddef0513..1a98ed0f3 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java @@ -58,7 +58,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting X value for the specified series and item. */ - public Number getStartXValue(/*@NonNegative*/ int series, int item); + public Number getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the ending X value for the specified series and item. @@ -68,7 +68,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending X value for the specified series and item. */ - public Number getEndXValue(/*@NonNegative*/ int series, int item); + public Number getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the starting Y value for the specified series and item. @@ -78,7 +78,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting Y value for the specified series and item. */ - public Number getStartYValue(/*@NonNegative*/ int series, int item); + public Number getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the ending Y value for the specified series and item. @@ -88,7 +88,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending Y value for the specified series and item. */ - public Number getEndYValue(/*@NonNegative*/ int series, int item); + public Number getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the starting Z value for the specified series and item. @@ -98,7 +98,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting Z value for the specified series and item. */ - public Number getStartZValue(/*@NonNegative*/ int series, int item); + public Number getStartZValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the ending Z value for the specified series and item. @@ -108,6 +108,6 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending Z value for the specified series and item. */ - public Number getEndZValue(/*@NonNegative*/ int series, int item); + public Number getEndZValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index 22d774e64..db0e2766f 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -46,6 +46,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; @@ -61,7 +62,8 @@ public class MatrixSeries extends Series implements Serializable { private static final long serialVersionUID = 7934188527308315704L; /** Series matrix values */ - protected double[][] data; + @SuppressWarnings("index") // Representation invariant + protected double /*@SameLen("this")*/ [] /*@SameLen("this[0]")*/ [] data; /** * Constructs a new matrix series. @@ -73,7 +75,7 @@ public class MatrixSeries extends Series implements Serializable { * @param rows the number of rows. * @param columns the number of columns. */ - public MatrixSeries(String name, int rows, int columns) { + public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int columns) { super(name); this.data = new double[rows][columns]; zeroAll(); @@ -84,7 +86,7 @@ public MatrixSeries(String name, int rows, int columns) { * * @return The number of columns in this matrix series. */ - public int getColumnsCount() { + public /*@LengthOf("this[0]")*/ int getColumnsCount() { return this.data[0].length; } @@ -99,7 +101,7 @@ public int getColumnsCount() { * * @see #get(int, int) */ - public Number getItem(int itemIndex) { + public Number getItem(/*@NonNegative*/ int itemIndex) { int i = getItemRow(itemIndex); int j = getItemColumn(itemIndex); @@ -116,7 +118,7 @@ public Number getItem(int itemIndex) { * * @return The column of the specified item. */ - public int getItemColumn(int itemIndex) { + public /*@IndexFor("this[0]")*/ int getItemColumn(/*@NonNegative*/ int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex % getColumnsCount(); } @@ -128,7 +130,7 @@ public int getItemColumn(int itemIndex) { * @return The item count. */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return getRowCount() * getColumnsCount(); } @@ -140,7 +142,7 @@ public int getItemCount() { * * @return The row of the specified item. */ - public int getItemRow(int itemIndex) { + public /*@IndexFor("this")*/ int getItemRow(/*@NonNegative*/ int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex / getColumnsCount(); } @@ -151,7 +153,7 @@ public int getItemRow(int itemIndex) { * * @return The number of rows in this matrix series. */ - public int getRowCount() { + public /*@LengthOf("this")*/ int getRowCount() { return this.data.length; } @@ -167,7 +169,7 @@ public int getRowCount() { * @see #getItem(int) * @see #update(int, int, double) */ - public double get(int i, int j) { + public double get(/*@IndexFor("this")*/ int i, /*@IndexFor("this[0]")*/ int j) { return this.data[i][j]; } @@ -181,7 +183,7 @@ public double get(int i, int j) { * * @see #get(int, int) */ - public void update(int i, int j, double mij) { + public void update(/*@IndexFor("this")*/ int i, /*@IndexFor("this[0]")*/ int j, double mij) { this.data[i][j] = mij; fireSeriesChanged(); } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java index 351762d77..1b745fda9 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java @@ -44,6 +44,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.util.List; @@ -96,7 +97,7 @@ public MatrixSeriesCollection(MatrixSeries series) { * @return The number of items in the specified series. */ @Override - public int getItemCount(int seriesIndex) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { return getSeries(seriesIndex).getItemCount(); } @@ -108,7 +109,7 @@ public int getItemCount(int seriesIndex) { * * @return The series. */ - public MatrixSeries getSeries(int seriesIndex) { + public MatrixSeries getSeries(/*@NonNegative*/ int seriesIndex) { if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) { throw new IllegalArgumentException("Index outside valid range."); } @@ -123,7 +124,7 @@ public MatrixSeries getSeries(int seriesIndex) { * @return The number of series in the collection. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.seriesList.size(); } @@ -136,7 +137,7 @@ public int getSeriesCount() { * @return The key for a series. */ @Override - public Comparable getSeriesKey(int seriesIndex) { + public Comparable getSeriesKey(/*@NonNegative*/ int seriesIndex) { return getSeries(seriesIndex).getKey(); } @@ -153,7 +154,7 @@ public Comparable getSeriesKey(int seriesIndex) { * @see org.jfree.data.xy.XYDataset#getXValue(int, int) */ @Override - public Number getX(int seriesIndex, int itemIndex) { + public Number getX(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); int x = series.getItemColumn(itemIndex); @@ -173,7 +174,7 @@ public Number getX(int seriesIndex, int itemIndex) { * @see org.jfree.data.xy.XYDataset#getYValue(int, int) */ @Override - public Number getY(int seriesIndex, int itemIndex) { + public Number getY(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); int y = series.getItemRow(itemIndex); @@ -193,7 +194,7 @@ public Number getY(int seriesIndex, int itemIndex) { * @see org.jfree.data.xy.XYZDataset#getZValue(int, int) */ @Override - public Number getZ(int seriesIndex, int itemIndex) { + public Number getZ(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); Number z = series.getItem(itemIndex); return z; @@ -314,7 +315,7 @@ public void removeSeries(MatrixSeries series) { * * @param seriesIndex the series (zero based index). */ - public void removeSeries(int seriesIndex) { + public void removeSeries(/*@NonNegative*/ int seriesIndex) { // check arguments... if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) { throw new IllegalArgumentException("Index outside valid range."); diff --git a/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java b/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java index 2adbc2678..f5c768109 100644 --- a/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java @@ -40,6 +40,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /** * Represents a dense normalized matrix M[i,j] where each Mij item of the @@ -90,7 +91,7 @@ public NormalizedMatrixSeries(String name, int rows, int columns) { * @see org.jfree.data.xy.MatrixSeries#getItem(int) */ @Override - public Number getItem(int itemIndex) { + public Number getItem(/*@NonNegative*/ int itemIndex) { int i = getItemRow(itemIndex); int j = getItemColumn(itemIndex); diff --git a/src/main/java/org/jfree/data/xy/OHLCDataset.java b/src/main/java/org/jfree/data/xy/OHLCDataset.java index a4ca8bf14..6cd857bcf 100644 --- a/src/main/java/org/jfree/data/xy/OHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/OHLCDataset.java @@ -66,7 +66,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getHigh(/*@NonNegative*/ int series, int item); + public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the high-value (as a double primitive) for an item within a @@ -77,7 +77,7 @@ public interface OHLCDataset extends XYDataset { * * @return The high-value. */ - public double getHighValue(/*@NonNegative*/ int series, int item); + public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the low-value for the specified series and item. @@ -87,7 +87,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getLow(/*@NonNegative*/ int series, int item); + public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the low-value (as a double primitive) for an item within a @@ -98,7 +98,7 @@ public interface OHLCDataset extends XYDataset { * * @return The low-value. */ - public double getLowValue(/*@NonNegative*/ int series, int item); + public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the open-value for the specified series and item. @@ -108,7 +108,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getOpen(/*@NonNegative*/ int series, int item); + public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the open-value (as a double primitive) for an item within a @@ -119,7 +119,7 @@ public interface OHLCDataset extends XYDataset { * * @return The open-value. */ - public double getOpenValue(/*@NonNegative*/ int series, int item); + public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the y-value for the specified series and item. @@ -129,7 +129,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getClose(/*@NonNegative*/ int series, int item); + public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the close-value (as a double primitive) for an item within a @@ -140,7 +140,7 @@ public interface OHLCDataset extends XYDataset { * * @return The close-value. */ - public double getCloseValue(/*@NonNegative*/ int series, int item); + public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the volume for the specified series and item. @@ -150,7 +150,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getVolume(/*@NonNegative*/ int series, int item); + public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the volume-value (as a double primitive) for an item within a @@ -161,6 +161,6 @@ public interface OHLCDataset extends XYDataset { * * @return The volume-value. */ - public double getVolumeValue(/*@NonNegative*/ int series, int item); + public double getVolumeValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/TableXYDataset.java b/src/main/java/org/jfree/data/xy/TableXYDataset.java index b9878ec6d..bc6872a65 100644 --- a/src/main/java/org/jfree/data/xy/TableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/TableXYDataset.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /** @@ -57,6 +58,6 @@ public interface TableXYDataset extends XYDataset { * * @return The item count. */ - public int getItemCount(); + public /*@NonNegative*/ int getItemCount(); } diff --git a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java index 68b7dfcd0..54450d053 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java @@ -44,6 +44,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -132,7 +133,7 @@ public void removeAllSeries() { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -178,7 +179,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * * @return The series index. */ - public int indexOf(VectorSeries series) { + public /*@GTENegativeOne*/ int indexOf(VectorSeries series) { Args.nullNotPermitted(series, "series"); return this.data.indexOf(series); } @@ -194,7 +195,7 @@ public int indexOf(VectorSeries series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -208,7 +209,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getXValue(); @@ -225,7 +226,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getXValue(series, item)); } @@ -238,7 +239,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getYValue(); @@ -255,7 +256,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getYValue(series, item)); } @@ -268,7 +269,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The vector (possibly {@code null}). */ @Override - public Vector getVector(/*@NonNegative*/ int series, int item) { + public Vector getVector(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVector(); @@ -283,7 +284,7 @@ public Vector getVector(/*@NonNegative*/ int series, int item) { * @return The x-component of the vector. */ @Override - public double getVectorXValue(/*@NonNegative*/ int series, int item) { + public double getVectorXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVectorX(); @@ -298,7 +299,7 @@ public double getVectorXValue(/*@NonNegative*/ int series, int item) { * @return The y-component of the vector. */ @Override - public double getVectorYValue(/*@NonNegative*/ int series, int item) { + public double getVectorYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVectorY(); diff --git a/src/main/java/org/jfree/data/xy/VectorXYDataset.java b/src/main/java/org/jfree/data/xy/VectorXYDataset.java index e4c88d97b..e48a4d9e8 100644 --- a/src/main/java/org/jfree/data/xy/VectorXYDataset.java +++ b/src/main/java/org/jfree/data/xy/VectorXYDataset.java @@ -64,7 +64,7 @@ public interface VectorXYDataset extends XYDataset { * * @return The x-component of the vector. */ - public double getVectorXValue(/*@NonNegative*/ int series, int item); + public double getVectorXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the y-component of the vector for an item in a series. @@ -74,7 +74,7 @@ public interface VectorXYDataset extends XYDataset { * * @return The y-component of the vector. */ - public double getVectorYValue(/*@NonNegative*/ int series, int item); + public double getVectorYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the vector for an item in a series. Depending on the particular @@ -88,6 +88,6 @@ public interface VectorXYDataset extends XYDataset { * * @return The vector (possibly {@code null}). */ - public Vector getVector(/*@NonNegative*/ int series, int item); + public Vector getVector(/*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/WindDataset.java b/src/main/java/org/jfree/data/xy/WindDataset.java index 36b71d31c..f746076d6 100644 --- a/src/main/java/org/jfree/data/xy/WindDataset.java +++ b/src/main/java/org/jfree/data/xy/WindDataset.java @@ -62,7 +62,7 @@ public interface WindDataset extends XYDataset { * * @return The wind direction. */ - public Number getWindDirection(/*@NonNegative*/ int series, int item); + public Number getWindDirection(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the wind force on the Beaufort scale (0 to 12). See: @@ -76,6 +76,6 @@ public interface WindDataset extends XYDataset { * * @return The wind force. */ - public Number getWindForce(/*@NonNegative*/ int series, int item); + public Number getWindForce(/*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java index cf8d6227b..1d54b65cf 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java @@ -95,7 +95,7 @@ public void addSeries(XIntervalSeries series) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -144,7 +144,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -158,7 +158,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return di.getX(); @@ -174,7 +174,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getXLowValue(item); } @@ -189,7 +189,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getXHighValue(item); } @@ -204,7 +204,7 @@ public double getEndXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -218,7 +218,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getYValue()); @@ -233,7 +233,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getXLowValue()); @@ -248,7 +248,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getXHighValue()); @@ -264,7 +264,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -278,7 +278,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index 4cb120e4b..f7a155499 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -126,7 +126,7 @@ public void setBarWidth(double barWidth) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.underlying.getSeriesCount(); } @@ -151,7 +151,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getItemCount(series); } @@ -166,7 +166,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.underlying.getX(series, item); } @@ -181,7 +181,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, int item) { + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.underlying.getXValue(series, item); } @@ -196,7 +196,7 @@ public double getXValue(/*@NonNegative*/ int series, int item) { * @see #getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.underlying.getY(series, item); } @@ -211,7 +211,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.underlying.getYValue(series, item); } @@ -224,7 +224,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; Number xnum = this.underlying.getX(series, item); if (xnum != null) { @@ -245,7 +245,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @see #getXValue(int, int) */ @Override - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getXValue(series, item) - this.barWidth / 2.0; } @@ -258,7 +258,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { Number result = null; Number xnum = this.underlying.getX(series, item); if (xnum != null) { @@ -279,7 +279,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @see #getXValue(int, int) */ @Override - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getXValue(series, item) + this.barWidth / 2.0; } @@ -292,7 +292,7 @@ public double getEndXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.underlying.getY(series, item); } @@ -308,7 +308,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @see #getYValue(int, int) */ @Override - public double getStartYValue(/*@NonNegative*/ int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getYValue(series, item); } @@ -321,7 +321,7 @@ public double getStartYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.underlying.getY(series, item); } @@ -337,7 +337,7 @@ public Number getEndY(/*@NonNegative*/ int series, int item) { * @see #getYValue(int, int) */ @Override - public double getEndYValue(/*@NonNegative*/ int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getYValue(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYDataset.java b/src/main/java/org/jfree/data/xy/XYDataset.java index d43b75a84..7de84bd4f 100644 --- a/src/main/java/org/jfree/data/xy/XYDataset.java +++ b/src/main/java/org/jfree/data/xy/XYDataset.java @@ -78,7 +78,7 @@ public interface XYDataset extends SeriesDataset { * * @return The item count. */ - public int getItemCount(/*@NonNegative*/ int series); + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series); /** * Returns the x-value for an item within a series. The x-values may or @@ -92,7 +92,7 @@ public interface XYDataset extends SeriesDataset { * * @return The x-value (never {@code null}). */ - public Number getX(/*@NonNegative*/ int series, int item); + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the x-value for an item within a series. @@ -104,7 +104,7 @@ public interface XYDataset extends SeriesDataset { * * @return The x-value. */ - public double getXValue(/*@NonNegative*/ int series, int item); + public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the y-value for an item within a series. @@ -116,7 +116,7 @@ public interface XYDataset extends SeriesDataset { * * @return The y-value (possibly {@code null}). */ - public Number getY(/*@NonNegative*/ int series, int item); + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the y-value (as a double primitive) for an item within a series. @@ -128,6 +128,6 @@ public interface XYDataset extends SeriesDataset { * * @return The y-value. */ - public double getYValue(/*@NonNegative*/ int series, int item); + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java index 843dcb783..d582ba48c 100644 --- a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java +++ b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java @@ -43,6 +43,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; @@ -131,7 +132,7 @@ public int getColumnCount() { * @return The column name. */ @Override - public String getColumnName(int column) { + public String getColumnName(/*@NonNegative*/ int column) { if (this.model == null) { return super.getColumnName(column); } @@ -153,7 +154,7 @@ public String getColumnName(int column) { * @return The value of the specified cell. */ @Override - public Object getValueAt(int row, int column) { + public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (this.model == null) { return null; } @@ -186,7 +187,7 @@ public void datasetChanged(DatasetChangeEvent event) { * @return {@code true} if the specified cell is editable. */ @Override - public boolean isCellEditable(int row, int column) { + public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return false; } @@ -198,7 +199,7 @@ public boolean isCellEditable(int row, int column) { * @param column the column. */ @Override - public void setValueAt(Object value, int row, int column) { + public void setValueAt(Object value, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (isCellEditable(row, column)) { // XYDataset only provides methods for reading a dataset... } diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java index a276f575e..31d9e0b2b 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java @@ -97,7 +97,7 @@ public void addSeries(XYIntervalSeries series) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -146,7 +146,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -160,7 +160,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getX(item); } @@ -175,7 +175,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getXLowValue(item); } @@ -190,7 +190,7 @@ public double getStartXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getXHighValue(item); } @@ -205,7 +205,7 @@ public double getEndXValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -220,7 +220,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYLowValue(item); } @@ -235,7 +235,7 @@ public double getStartYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYHighValue(item); } @@ -249,7 +249,7 @@ public double getEndYValue(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getYValue(series, item)); } @@ -262,7 +262,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getStartXValue(series, item)); } @@ -275,7 +275,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getEndXValue(series, item)); } @@ -289,7 +289,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getStartYValue(series, item)); } @@ -303,7 +303,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return new Double(getEndYValue(series, item)); } diff --git a/src/main/java/org/jfree/data/xy/XYItemKey.java b/src/main/java/org/jfree/data/xy/XYItemKey.java index 7710663d9..2d0bdaae7 100644 --- a/src/main/java/org/jfree/data/xy/XYItemKey.java +++ b/src/main/java/org/jfree/data/xy/XYItemKey.java @@ -39,6 +39,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import org.jfree.chart.util.ObjectUtils; @@ -69,7 +70,7 @@ public class XYItemKey> implements ItemKey, * @param seriesKey the series key. * @param itemIndex the item index. */ - public XYItemKey(S seriesKey, int itemIndex) { + public XYItemKey(S seriesKey, /*@NonNegative*/ int itemIndex) { Args.nullNotPermitted(seriesKey, "seriesKey"); this.seriesKey = seriesKey; this.itemIndex = itemIndex; diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index ca5555215..0ff1b3fed 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -79,6 +79,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -344,7 +345,7 @@ public boolean getAllowDuplicateXValues() { * @see #getItems() */ @Override - public int getItemCount() { + public /*@NonNegative*/ int getItemCount() { return this.data.size(); } @@ -848,7 +849,7 @@ else if (item.getY() != null) { * * @return The index. */ - public int indexOf(Number x) { + public /*@GTENegativeOne*/ int indexOf(Number x) { if (this.autoSort) { return Collections.binarySearch(this.data, new XYDataItem(x, null)); } diff --git a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java index 0581fb6fe..07d0ca974 100644 --- a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java @@ -64,6 +64,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -224,7 +225,7 @@ public void removeAllSeries() { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -247,7 +248,7 @@ public List getSeries() { * * @since 1.0.6 */ - public int indexOf(XYSeries series) { + public /*@GTENegativeOne*/ int indexOf(XYSeries series) { Args.nullNotPermitted(series, "series"); return this.data.indexOf(series); } @@ -343,7 +344,7 @@ public int getSeriesIndex(Comparable key) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -357,7 +358,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { XYSeries s = (XYSeries) this.data.get(series); return s.getX(item); } @@ -371,7 +372,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The starting X value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -384,7 +385,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The ending X value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return this.intervalDelegate.getEndX(series, item); } @@ -411,7 +412,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int index) { * @return The starting Y value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } @@ -424,7 +425,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The ending Y value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYZDataset.java b/src/main/java/org/jfree/data/xy/XYZDataset.java index ef321e512..97026d498 100644 --- a/src/main/java/org/jfree/data/xy/XYZDataset.java +++ b/src/main/java/org/jfree/data/xy/XYZDataset.java @@ -61,7 +61,7 @@ public interface XYZDataset extends XYDataset { * * @return The z-value (possibly {@code null}). */ - public Number getZ(/*@NonNegative*/ int series, int item); + public Number getZ(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the z-value (as a double primitive) for an item within a series. @@ -71,6 +71,6 @@ public interface XYZDataset extends XYDataset { * * @return The z-value. */ - public double getZValue(/*@NonNegative*/ int series, int item); + public double getZValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/XisSymbolic.java b/src/main/java/org/jfree/data/xy/XisSymbolic.java index b1cc9d344..b1e41ddd0 100644 --- a/src/main/java/org/jfree/data/xy/XisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/XisSymbolic.java @@ -68,7 +68,7 @@ public interface XisSymbolic { * * @return The symbolic value. */ - public String getXSymbolicValue(/*@NonNegative*/ int series, int item); + public String getXSymbolicValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the symbolic value linked with the specified {@code Integer}. diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java index 31593d238..b4e9691e9 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java @@ -97,7 +97,7 @@ public void addSeries(YIntervalSeries series) { * @return The series count. */ @Override - public int getSeriesCount() { + public /*@NonNegative*/ int getSeriesCount() { return this.data.size(); } @@ -146,7 +146,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public int getItemCount(/*@NonNegative*/ int series) { + public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -160,7 +160,7 @@ public int getItemCount(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, int item) { + public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getX(item); } @@ -175,7 +175,7 @@ public Number getX(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, int item) { + public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -190,7 +190,7 @@ public double getYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYLowValue(item); } @@ -205,7 +205,7 @@ public double getStartYValue(/*@NonNegative*/ int series, int item) { * @return The value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYHighValue(item); } @@ -219,7 +219,7 @@ public double getEndYValue(/*@NonNegative*/ int series, int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, int item) { + public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYValue(item)); } @@ -234,7 +234,7 @@ public Number getY(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getX(series, item); } @@ -248,7 +248,7 @@ public Number getStartX(/*@NonNegative*/ int series, int item) { * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { return getX(series, item); } @@ -261,7 +261,7 @@ public Number getEndX(/*@NonNegative*/ int series, int item) { * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYLowValue(item)); } @@ -275,7 +275,7 @@ public Number getStartY(/*@NonNegative*/ int series, int item) { * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYHighValue(item)); } diff --git a/src/main/java/org/jfree/data/xy/YisSymbolic.java b/src/main/java/org/jfree/data/xy/YisSymbolic.java index 0613ce740..f51e2fefb 100644 --- a/src/main/java/org/jfree/data/xy/YisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/YisSymbolic.java @@ -69,7 +69,7 @@ public interface YisSymbolic { * * @return The symbolic value. */ - public String getYSymbolicValue(/*@NonNegative*/ int series, int item); + public String getYSymbolicValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); /** * Returns the symbolic value linked with the specified {@code Integer}. diff --git a/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java b/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java index 88640cf83..6357035d6 100644 --- a/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java +++ b/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java @@ -203,7 +203,7 @@ public void testBug1572478Vertical() { = new DefaultBoxAndWhiskerCategoryDataset() { @Override - public Number getQ1Value(int row, int column) { + public Number getQ1Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return null; } @@ -248,7 +248,7 @@ public void testBug1572478Horizontal() { = new DefaultBoxAndWhiskerCategoryDataset() { @Override - public Number getQ1Value(int row, int column) { + public Number getQ1Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return null; } diff --git a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java index a164fecc9..e9e2946cb 100644 --- a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java +++ b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java @@ -102,7 +102,7 @@ public int getColumnCount() { * @see #removeValue(Comparable, Comparable) */ @Override - public Number getValue(int row, int column) { + public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(row, column); if (item == null) { @@ -123,7 +123,7 @@ public Number getValue(int row, int column) { * @see #getColumnKey(int) */ @Override - public Comparable getRowKey(int row) { + public Comparable getRowKey(/*@NonNegative*/ int row) { return this.data.getRowKey(row); } @@ -164,7 +164,7 @@ public List getRowKeys() { * @see #getColumnIndex(Comparable) */ @Override - public Comparable getColumnKey(int column) { + public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.data.getColumnKey(column); } From 38a283bd83debb7a077e59835ada9d1351a86174 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Thu, 7 Dec 2017 11:43:03 -0800 Subject: [PATCH 07/79] more annotations --- ant/build.xml | 1 + src/main/java/org/jfree/chart/LegendItem.java | 2 +- .../AbstractCategoryItemLabelGenerator.java | 4 ++-- .../labels/AbstractPieItemLabelGenerator.java | 2 +- .../BoxAndWhiskerXYToolTipGenerator.java | 4 ++-- .../labels/BubbleXYItemLabelGenerator.java | 2 +- .../labels/CustomXYToolTipGenerator.java | 4 ++-- .../IntervalCategoryToolTipGenerator.java | 6 ++--- .../labels/IntervalXYItemLabelGenerator.java | 2 +- .../MultipleXYSeriesLabelGenerator.java | 2 +- .../StandardCategorySeriesLabelGenerator.java | 2 +- .../StandardXYSeriesLabelGenerator.java | 2 +- .../chart/plot/CategoryCrosshairState.java | 4 ++-- .../org/jfree/chart/plot/CategoryPlot.java | 24 ++++++++++++++----- .../org/jfree/chart/plot/CrosshairState.java | 2 +- .../java/org/jfree/chart/plot/XYPlot.java | 10 ++++---- .../jfree/chart/plot/dial/DialPointer.java | 2 +- .../chart/plot/dial/DialValueIndicator.java | 2 +- .../renderer/xy/StackedXYAreaRenderer2.java | 5 ++-- .../renderer/xy/XYDifferenceRenderer.java | 16 +++++++++---- .../chart/renderer/xy/XYDotRenderer.java | 5 +++- .../chart/renderer/xy/XYShapeRenderer.java | 4 ++-- .../chart/renderer/xy/XYSplineRenderer.java | 3 ++- .../urls/CustomCategoryURLGenerator.java | 4 ++-- .../chart/urls/CustomPieURLGenerator.java | 4 ++-- .../chart/urls/CustomXYURLGenerator.java | 4 ++-- .../org/jfree/data/xy/TableXYDataset.java | 4 ++-- 27 files changed, 75 insertions(+), 51 deletions(-) diff --git a/ant/build.xml b/ant/build.xml index f594b9223..e221094cd 100644 --- a/ant/build.xml +++ b/ant/build.xml @@ -127,6 +127,7 @@ includeantruntime="false"> + diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index 38a6e4fa9..564bacb0f 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -562,7 +562,7 @@ public void setDataset(Dataset dataset) { * @see #setDatasetIndex(int) * @see #getDataset() */ - public int getDatasetIndex() { + public /*@NonNegative*/ int getDatasetIndex() { return this.datasetIndex; } diff --git a/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java index 9f622c644..4d01796e1 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java @@ -45,7 +45,7 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.MinLen; */ +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -213,7 +213,7 @@ public DateFormat getDateFormat() { * @return The label (possibly {@code null}). */ protected String generateLabelString(CategoryDataset dataset, - int row, /*@NonNegative*/ int column) { + /*@NonNegative*/ int row, /*@NonNegative*/ int column) { Args.nullNotPermitted(dataset, "dataset"); String result; Object[] items = createItemArray(dataset, row, column); diff --git a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java index 325687d7d..7f5b8f7e2 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java @@ -134,7 +134,7 @@ public NumberFormat getPercentFormat() { * * @return The items (never {@code null}). */ - protected Object[] createItemArray(PieDataset dataset, Comparable key) { + protected Object /*@MinLen(4)*/ [] createItemArray(PieDataset dataset, Comparable key) { Object[] result = new Object[4]; double total = DatasetUtils.calculatePieDatasetTotal(dataset); result[0] = key.toString(); diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 16d63c097..5135e8ccf 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -127,8 +127,8 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, * @return The items (never {@code null}). */ @Override - protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - int item) { + protected Object /*@MinLen(8)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, + /*@NonNegative*/ int item) { Object[] result = new Object[8]; result[0] = dataset.getSeriesKey(series).toString(); Number x = dataset.getX(series, item); diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index d8497d20b..6190c1dbf 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -202,7 +202,7 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series * * @return The items (never {@code null}). */ - protected Object[] createItemArray(XYZDataset dataset, + protected Object /*@MinLen(4)*/ [] createItemArray(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { Object[] result = new Object[4]; diff --git a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java index 7d30b21fa..0a941e3b9 100644 --- a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java @@ -81,7 +81,7 @@ public CustomXYToolTipGenerator() { * * @return The list count. */ - public int getListCount() { + public /*@NonNegative*/ int getListCount() { return this.toolTipSeries.size(); } @@ -92,7 +92,7 @@ public int getListCount() { * * @return The tooltip count. */ - public int getToolTipCount(int list) { + public /*@NonNegative*/ int getToolTipCount(/*@NonNegative*/ int list) { int result = 0; List tooltips = (List) this.toolTipSeries.get(list); diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java index 4612bdadb..02e02c0d3 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.text.DateFormat; import java.text.NumberFormat; @@ -104,8 +104,8 @@ public IntervalCategoryToolTipGenerator(String labelFormat, * @return The items (never {@code null}). */ @Override - protected Object[] createItemArray(CategoryDataset dataset, - int row, /*@NonNegative*/ int column) { + protected Object /*@MinLen(5)*/ [] createItemArray(CategoryDataset dataset, + /*@NonNegative*/ int row, /*@NonNegative*/ int column) { Object[] result = new Object[5]; result[0] = dataset.getRowKey(row).toString(); result[1] = dataset.getColumnKey(column).toString(); diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index 620405863..03673dd43 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -153,7 +153,7 @@ public IntervalXYItemLabelGenerator(String formatString, * {@code String} objects (never {@code null}). */ @Override - protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, + protected Object /*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { IntervalXYDataset intervalDataset = null; diff --git a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java index a307df2d1..f1e8f9b65 100644 --- a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java @@ -166,7 +166,7 @@ public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series) { * * @return The items (never {@code null}). */ - protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series) { + protected Object /*@MinLen(1)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series) { Object[] result = new Object[1]; result[0] = dataset.getSeriesKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java index 57c15b35b..c60958abd 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java @@ -115,7 +115,7 @@ public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int series * * @return The items (never {@code null}). */ - protected Object[] createItemArray(CategoryDataset dataset, /*@NonNegative*/ int series) { + protected Object /*@MinLen(1)*/ [] createItemArray(CategoryDataset dataset, /*@NonNegative*/ int series) { Object[] result = new Object[1]; result[0] = dataset.getRowKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java index 400f3fcc0..3b4064696 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java @@ -120,7 +120,7 @@ this.formatPattern, createItemArray(dataset, series) * * @return The items (never {@code null}). */ - protected Object[] createItemArray(XYDataset dataset, /*@NonNegative*/ int series) { + protected Object /*@MinLen(1)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series) { Object[] result = new Object[1]; result[0] = dataset.getSeriesKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java b/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java index 8df884145..3f66517f2 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.geom.Point2D; @@ -160,7 +160,7 @@ public void updateCrosshairPoint(Comparable rowKey, Comparable columnKey, * @param orientation the plot orientation. */ public void updateCrosshairX(Comparable rowKey, Comparable columnKey, - int datasetIndex, double transX, PlotOrientation orientation) { + /*@NonNegative*/ int datasetIndex, double transX, PlotOrientation orientation) { Point2D anchor = getAnchor(); if (anchor != null) { diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index cc457406d..6c5b6ebda 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -593,17 +593,29 @@ public CategoryPlot(CategoryDataset dataset, CategoryAxis domainAxis, this.orientation = PlotOrientation.VERTICAL; // allocate storage for dataset, axes and renderers - this.domainAxes = new HashMap(); - this.domainAxisLocations = new HashMap(); - this.rangeAxes = new HashMap(); - this.rangeAxisLocations = new HashMap(); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 + HashMap domainAxesTmp = new HashMap(); + this.domainAxes = domainAxesTmp; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 + HashMap domainAxisLocationsTmp = new HashMap(); + this.domainAxisLocations = domainAxisLocationsTmp; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 + HashMap rangeAxesTmp = new HashMap(); + this.rangeAxes = rangeAxesTmp; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 + HashMap rangeAxisLocationsTmp = new HashMap(); + this.rangeAxisLocations = rangeAxisLocationsTmp; this.datasetToDomainAxesMap = new TreeMap(); this.datasetToRangeAxesMap = new TreeMap(); - this.renderers = new HashMap(); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 + HashMap renderersTmp = new HashMap(); + this.renderers = renderersTmp; - this.datasets = new HashMap(); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 + HashMap datasetsTmp = new HashMap(); + this.datasets = datasetsTmp; this.datasets.put(0, dataset); if (dataset != null) { dataset.addChangeListener(this); diff --git a/src/main/java/org/jfree/chart/plot/CrosshairState.java b/src/main/java/org/jfree/chart/plot/CrosshairState.java index ae4a0d136..7236de793 100644 --- a/src/main/java/org/jfree/chart/plot/CrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CrosshairState.java @@ -378,7 +378,7 @@ public void setCrosshairY(double y) { * * @since 1.0.11 */ - public int getDatasetIndex() { + public /*@NonNegative*/ int getDatasetIndex() { return this.datasetIndex; } diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index b2e9401f4..b5bd12355 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -3265,8 +3265,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // now draw annotations and render data items... boolean foundData = false; DatasetRenderingOrder order = getDatasetRenderingOrder(); - List rendererIndices = getRendererIndices(order); - List datasetIndices = getDatasetIndices(order); + List rendererIndices = getRendererIndices(order); + List datasetIndices = getDatasetIndices(order); // draw background annotations for (int i : rendererIndices) { @@ -3391,7 +3391,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, } private List< /*@NonNegative*/ Integer> getRendererIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); + List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYItemRenderer> entry : this.renderers.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -4358,7 +4358,7 @@ private List getDatasetsMappedToRangeAxis(Integer axisIndex) { * * @see #getRangeAxisIndex(ValueAxis) */ - public int getDomainAxisIndex(ValueAxis axis) { + public /*@GTENegativeOne*/ int getDomainAxisIndex(ValueAxis axis) { int result = findDomainAxisIndex(axis); if (result < 0) { // try the parent plot @@ -4371,7 +4371,7 @@ public int getDomainAxisIndex(ValueAxis axis) { return result; } - private int findDomainAxisIndex(ValueAxis axis) { + private /*@GTENegativeOne*/ int findDomainAxisIndex(ValueAxis axis) { for (Map.Entry entry : this.domainAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java index 0233dfadf..1523759b7 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java @@ -107,7 +107,7 @@ protected DialPointer(/*@NonNegative*/ int datasetIndex) { * * @see #getDatasetIndex() */ - public int getDatasetIndex() { + public /*@NonNegative*/ int getDatasetIndex() { return this.datasetIndex; } diff --git a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java index dc57e9a4a..3b2edf987 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java @@ -175,7 +175,7 @@ public DialValueIndicator(/*@NonNegative*/ int datasetIndex) { * * @see #setDatasetIndex(int) */ - public int getDatasetIndex() { + public /*@NonNegative*/ int getDatasetIndex() { return this.datasetIndex; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java index 6505e93af..a03c9f90a 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java @@ -56,6 +56,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -460,8 +461,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * for all series values up to but excluding {@code series} * for {@code index}. */ - private double[] getStackValues(TableXYDataset dataset, - int series, /*@NonNegative*/ int index) { + private double /*@MinLen(2)*/ [] getStackValues(TableXYDataset dataset, + /*@NonNegative*/ int series, /*@NonNegative*/ int index) { double[] result = new double[2]; for (int i = 0; i < series; i++) { double v = dataset.getYValue(i, index); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index 7e5c6fa47..25145f70b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -439,7 +439,8 @@ protected void drawItemPass0(Graphics2D x_graphics, // state int l_minuendItem = 0; - int l_minuendItemCount = x_dataset.getItemCount(0); + @SuppressWarnings("index") // the call to isEitherSeriesDegenerate above guarantees this is true + /*@Positive*/ int l_minuendItemCount = x_dataset.getItemCount(0); Double l_minuendCurX = null; Double l_minuendNextX = null; Double l_minuendCurY = null; @@ -867,7 +868,7 @@ protected void drawItemPass1(Graphics2D x_graphics, ValueAxis x_domainAxis, ValueAxis x_rangeAxis, XYDataset x_dataset, - int x_series, + /*@NonNegative*/ int x_series, /*@NonNegative*/ int x_item, CrosshairState x_crosshairState) { @@ -998,12 +999,14 @@ private boolean isEitherSeriesDegenerate(XYDataset x_dataset, */ private boolean areSeriesDisjoint(XYDataset x_dataset) { - int l_minuendItemCount = x_dataset.getItemCount(0); + @SuppressWarnings("index") // This method can only called on XYDataset_s with at least one item. See drawItemPass0 + /*@Positive*/ int l_minuendItemCount = x_dataset.getItemCount(0); double l_minuendFirst = x_dataset.getXValue(0, 0); double l_minuendLast = x_dataset.getXValue(0, l_minuendItemCount - 1); int l_subtrahendItemCount = x_dataset.getItemCount(1); double l_subtrahendFirst = x_dataset.getXValue(1, 0); + @SuppressWarnings("index") // This method can only called on XYDataset_s with at least one item. See drawItemPass0 double l_subtrahendLast = x_dataset.getXValue(1, l_subtrahendItemCount - 1); @@ -1027,6 +1030,7 @@ private boolean areSeriesDisjoint(XYDataset x_dataset) { * @param x_yValues a linked list of the y values (expects values to be * of type Double). */ + @SuppressWarnings({"Duplicates", "UnnecessaryUnboxing"}) private void createPolygon (Graphics2D x_graphics, Rectangle2D x_dataArea, XYPlot x_plot, @@ -1040,8 +1044,10 @@ private void createPolygon (Graphics2D x_graphics, RectangleEdge l_domainAxisLocation = x_plot.getDomainAxisEdge(); RectangleEdge l_rangeAxisLocation = x_plot.getRangeAxisEdge(); - Object[] l_xValues = x_xValues.toArray(); - Object[] l_yValues = x_yValues.toArray(); + @SuppressWarnings({"index", "value"}) // This seems like a documentation bug. x_xValues should have at least 1 element + Object /*@MinLen(1)*/ [] l_xValues = x_xValues.toArray(); + @SuppressWarnings({"index", "value"}) // This seems like a documentation bug. x_yValues should have at least 1 element, and the two linked lists need to be coordinated + Object /*@MinLen(1)*/ /*@SameLen("l_xValues")*/ [] l_yValues = x_yValues.toArray(); GeneralPath l_path = new GeneralPath(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java index b4a0b60be..604574461 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java @@ -263,7 +263,10 @@ else if (orientation == PlotOrientation.VERTICAL) { this.dotHeight); } - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // TODO: I think this is a bug. This can flow to CategoryPlot#draw, where it would + // fail an assert. There is nothing in this method relating the plot to the dataset, and the method + // is public. + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 6c6b663c6..10ab3f4a0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -493,8 +493,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, g2.draw(shape); } } - - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // TODO: I think this is a bug. See XYDotRenderer#drawItem - this is the same problem + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java index 611c2102e..0e1668bda 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java @@ -374,7 +374,8 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, s.seriesPath.lineTo(cp1.getX(), cp1.getY()); } else { // construct spline - int np = s.points.size(); // number of points + @SuppressWarnings({"index", "value"}) // list/array interop; s.points is minlen 3 at this point + /*@IntRange(from = 3)*/ int np = s.points.size(); // number of points float[] d = new float[np]; // Newton form coefficients float[] x = new float[np]; // x-coordinates of nodes float y, oldy; diff --git a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java index 90410f893..2a032529a 100644 --- a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java @@ -73,7 +73,7 @@ public CustomCategoryURLGenerator() { * * @return The list count. */ - public int getListCount() { + public /*@NonNegative*/ int getListCount() { return this.urlSeries.size(); } @@ -84,7 +84,7 @@ public int getListCount() { * * @return The URL count. */ - public int getURLCount(int list) { + public int getURLCount(/*@NonNegative*/ int list) { int result = 0; List urls = (List) this.urlSeries.get(list); if (urls != null) { diff --git a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java index a670b5134..bf5c9383a 100644 --- a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java @@ -98,7 +98,7 @@ public String generateURL(PieDataset dataset, Comparable key, * * @see #addURLs(Map) */ - public int getListCount() { + public /*@NonNegative*/ int getListCount() { return this.urls.size(); } @@ -112,7 +112,7 @@ public int getListCount() { * * @see #getListCount() */ - public int getURLCount(int list) { + public int getURLCount(/*@NonNegative*/ int list) { int result = 0; Map urlMap = (Map) this.urls.get(list); if (urlMap != null) { diff --git a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java index d1934ea15..546f8b0ba 100644 --- a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java @@ -82,7 +82,7 @@ public CustomXYURLGenerator() { * * @return The list count. */ - public int getListCount() { + public /*@NonNegative*/ int getListCount() { return this.urlSeries.size(); } @@ -93,7 +93,7 @@ public int getListCount() { * * @return The URL count. */ - public int getURLCount(int list) { + public int getURLCount(/*@NonNegative*/ int list) { int result = 0; List urls = (List) this.urlSeries.get(list); if (urls != null) { diff --git a/src/main/java/org/jfree/data/xy/TableXYDataset.java b/src/main/java/org/jfree/data/xy/TableXYDataset.java index bc6872a65..9ab20acda 100644 --- a/src/main/java/org/jfree/data/xy/TableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/TableXYDataset.java @@ -41,7 +41,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /** @@ -58,6 +58,6 @@ public interface TableXYDataset extends XYDataset { * * @return The item count. */ - public /*@NonNegative*/ int getItemCount(); + public /*@Positive*/ int getItemCount(); } From 1c4c2bf1c803ac7103092043fa69bdfc10fe135f Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Wed, 13 Dec 2017 05:45:49 -0800 Subject: [PATCH 08/79] Remove gratuitous diff against upstream --- .../java/org/jfree/chart/annotations/XYPolygonAnnotation.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java index 4866ca86c..808650118 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java @@ -213,7 +213,6 @@ public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, if (this.polygon.length < 4) { return; } - PlotOrientation orientation = plot.getOrientation(); RectangleEdge domainEdge = Plot.resolveDomainAxisLocation( plot.getDomainAxisLocation(), orientation); From 86154e5ea1f8e61627e86e30c350482323e3fc7d Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Wed, 13 Dec 2017 05:55:45 -0800 Subject: [PATCH 09/79] Add missing import statements --- .../jfree/chart/labels/AbstractPieItemLabelGenerator.java | 4 ++++ .../jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java | 1 + .../org/jfree/chart/labels/BubbleXYItemLabelGenerator.java | 1 + .../chart/labels/IntervalCategoryToolTipGenerator.java | 6 +++++- .../jfree/chart/labels/IntervalXYItemLabelGenerator.java | 1 + .../jfree/chart/labels/MultipleXYSeriesLabelGenerator.java | 1 + .../chart/labels/StandardCategorySeriesLabelGenerator.java | 1 + .../jfree/chart/labels/StandardXYSeriesLabelGenerator.java | 1 + .../java/org/jfree/chart/urls/CustomPieURLGenerator.java | 4 ++++ 9 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java index 7f5b8f7e2..04c681ea5 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java @@ -45,6 +45,10 @@ package org.jfree.chart.labels; +/*>>> +import org.checkerframework.common.value.qual.MinLen; +*/ + import java.io.Serializable; import java.text.MessageFormat; import java.text.NumberFormat; diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 5135e8ccf..1ed8f8e5e 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -50,6 +50,7 @@ package org.jfree.chart.labels; /*>>> +import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; */ diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index 6190c1dbf..68cfefee3 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -46,6 +46,7 @@ package org.jfree.chart.labels; /*>>> +import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; */ diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java index 02e02c0d3..65b850229 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java @@ -40,7 +40,11 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ + +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.common.value.qual.MinLen; +*/ import java.text.DateFormat; import java.text.NumberFormat; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index 03673dd43..9db48c773 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -41,6 +41,7 @@ package org.jfree.chart.labels; /*>>> +import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; */ diff --git a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java index f1e8f9b65..036e94b8e 100644 --- a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java @@ -45,6 +45,7 @@ package org.jfree.chart.labels; /*>>> +import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; */ diff --git a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java index c60958abd..2fe77e543 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java @@ -45,6 +45,7 @@ package org.jfree.chart.labels; /*>>> +import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; */ diff --git a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java index 3b4064696..066a611b9 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java @@ -45,6 +45,7 @@ package org.jfree.chart.labels; /*>>> +import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; */ diff --git a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java index bf5c9383a..b73c962f0 100644 --- a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java @@ -42,6 +42,10 @@ package org.jfree.chart.urls; +/*>>> +import org.checkerframework.checker.index.qual.NonNegative; +*/ + import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; From 1f24c04b2178adda61e255ee3904386ff1b8230c Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Wed, 13 Dec 2017 11:05:16 -0800 Subject: [PATCH 10/79] annotations on a bunch of dataset classes --- .../labels/AbstractPieItemLabelGenerator.java | 2 + .../BoxAndWhiskerXYToolTipGenerator.java | 2 + .../labels/BubbleXYItemLabelGenerator.java | 2 + .../IntervalCategoryToolTipGenerator.java | 2 + .../labels/IntervalXYItemLabelGenerator.java | 2 + .../MultipleXYSeriesLabelGenerator.java | 2 + .../StandardCategorySeriesLabelGenerator.java | 2 + .../StandardXYSeriesLabelGenerator.java | 2 + .../AbstractCategoryItemRenderer.java | 4 +- .../category/CategoryItemRendererState.java | 2 +- .../chart/urls/CustomPieURLGenerator.java | 2 + .../org/jfree/data/DefaultKeyedValues2D.java | 14 ++-- .../java/org/jfree/data/KeyedObjects2D.java | 14 ++-- .../java/org/jfree/data/KeyedValues2D.java | 6 +- src/main/java/org/jfree/data/Values2D.java | 6 +- .../data/category/DefaultCategoryDataset.java | 14 ++-- .../DefaultIntervalCategoryDataset.java | 8 +- .../data/category/SlidingCategoryDataset.java | 10 +-- .../gantt/SlidingGanttCategoryDataset.java | 8 +- .../data/gantt/TaskSeriesCollection.java | 8 +- .../data/general/AbstractSeriesDataset.java | 4 +- .../DefaultBoxAndWhiskerCategoryDataset.java | 12 +-- .../DefaultMultiValueCategoryDataset.java | 8 +- .../DefaultStatisticalCategoryDataset.java | 14 ++-- .../jfree/data/time/TimeSeriesTableModel.java | 6 +- .../org/jfree/data/xy/AbstractXYDataset.java | 4 +- .../data/xy/DefaultIntervalXYDataset.java | 82 +++++++++++-------- .../org/jfree/data/xy/DefaultOHLCDataset.java | 56 ++++++++----- .../org/jfree/data/xy/DefaultXYDataset.java | 33 ++++---- .../org/jfree/data/xy/DefaultXYZDataset.java | 49 ++++++----- .../org/jfree/data/xy/IntervalXYDataset.java | 16 ++-- .../java/org/jfree/data/xy/MatrixSeries.java | 10 +-- .../java/org/jfree/data/xy/OHLCDataset.java | 20 ++--- .../org/jfree/data/xy/TableXYDataset.java | 3 +- .../java/org/jfree/data/xy/XYDataset.java | 10 +-- .../jfree/data/xy/XYDatasetTableModel.java | 6 +- .../java/org/jfree/data/xy/XYZDataset.java | 4 +- .../general/TestIntervalCategoryDataset.java | 12 +-- 38 files changed, 260 insertions(+), 201 deletions(-) diff --git a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java index 7f5b8f7e2..c39515116 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java @@ -44,6 +44,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 5135e8ccf..e43e88d2d 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -48,6 +48,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index 6190c1dbf..2b1a2af86 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -44,6 +44,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java index 02e02c0d3..3b9ff92f7 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java @@ -40,6 +40,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.text.DateFormat; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index 03673dd43..a9c3b12d9 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -39,6 +39,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java index f1e8f9b65..beb7e49bf 100644 --- a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java @@ -43,6 +43,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java index c60958abd..c586bb3b6 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java @@ -43,6 +43,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java index 3b4064696..78b884a77 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java @@ -43,6 +43,8 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 0f5e3a79a..c14596bb7 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -631,7 +631,7 @@ public void setDefaultItemURLGenerator(CategoryURLGenerator generator, boolean n * * @return The row count. */ - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.rowCount; } @@ -641,7 +641,7 @@ public int getRowCount() { * * @return The column count. */ - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.columnCount; } diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java index 34373ad34..ceff1ca80 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java @@ -168,7 +168,7 @@ public void setCrosshairState(CategoryCrosshairState state) { * * @since 1.0.13 */ - public int getVisibleSeriesIndex(int rowIndex) { + public int getVisibleSeriesIndex(/*@NonNegative*/ int rowIndex) { if (this.visibleSeries == null) { return rowIndex; } diff --git a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java index bf5c9383a..f928b8407 100644 --- a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java @@ -41,6 +41,8 @@ */ package org.jfree.chart.urls; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.util.ArrayList; diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java index e511ece88..9849f2e8f 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java @@ -57,7 +57,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Collections; @@ -117,7 +117,7 @@ public DefaultKeyedValues2D(boolean sortRowKeys) { * @see #getColumnCount() */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.rowKeys.size(); } @@ -129,7 +129,7 @@ public int getRowCount() { * @see #getRowCount() */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.columnKeys.size(); } @@ -185,7 +185,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getColumnIndex(Comparable) */ @Override - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { Args.nullNotPermitted(key, "key"); if (this.sortRowKeys) { return Collections.binarySearch(this.rowKeys, key); @@ -234,7 +234,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getRowIndex(Comparable) */ @Override - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { Args.nullNotPermitted(key, "key"); return this.columnKeys.indexOf(key); } @@ -412,7 +412,7 @@ public void removeValue(Comparable rowKey, Comparable columnKey) { * @see #removeRow(Comparable) * @see #removeColumn(int) */ - public void removeRow(int rowIndex) { + public void removeRow(/*@NonNegative*/ int rowIndex) { this.rowKeys.remove(rowIndex); this.rows.remove(rowIndex); } @@ -447,7 +447,7 @@ public void removeRow(Comparable rowKey) { * @see #removeColumn(Comparable) * @see #removeRow(int) */ - public void removeColumn(int columnIndex) { + public void removeColumn(/*@NonNegative*/ int columnIndex) { Comparable columnKey = getColumnKey(columnIndex); removeColumn(columnKey); } diff --git a/src/main/java/org/jfree/data/KeyedObjects2D.java b/src/main/java/org/jfree/data/KeyedObjects2D.java index 8101320e1..d82f9a851 100644 --- a/src/main/java/org/jfree/data/KeyedObjects2D.java +++ b/src/main/java/org/jfree/data/KeyedObjects2D.java @@ -44,7 +44,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Collections; @@ -86,7 +86,7 @@ public KeyedObjects2D() { * * @see #getColumnCount() */ - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.rowKeys.size(); } @@ -97,7 +97,7 @@ public int getRowCount() { * * @see #getRowCount() */ - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.columnKeys.size(); } @@ -149,7 +149,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * * @see #getRowKey(int) */ - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { Args.nullNotPermitted(key, "key"); return this.rowKeys.indexOf(key); } @@ -188,7 +188,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * * @see #getColumnKey(int) */ - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { Args.nullNotPermitted(key, "key"); return this.columnKeys.indexOf(key); } @@ -353,7 +353,7 @@ public void removeObject(Comparable rowKey, Comparable columnKey) { * * @see #removeColumn(int) */ - public void removeRow(int rowIndex) { + public void removeRow(/*@NonNegative*/ int rowIndex) { this.rowKeys.remove(rowIndex); this.rows.remove(rowIndex); } @@ -383,7 +383,7 @@ public void removeRow(Comparable rowKey) { * * @see #removeRow(int) */ - public void removeColumn(int columnIndex) { + public void removeColumn(/*@NonNegative*/ int columnIndex) { Comparable columnKey = getColumnKey(columnIndex); removeColumn(columnKey); } diff --git a/src/main/java/org/jfree/data/KeyedValues2D.java b/src/main/java/org/jfree/data/KeyedValues2D.java index 9bcb72fa5..e6ee1f26b 100644 --- a/src/main/java/org/jfree/data/KeyedValues2D.java +++ b/src/main/java/org/jfree/data/KeyedValues2D.java @@ -40,7 +40,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.List; @@ -68,7 +68,7 @@ public interface KeyedValues2D extends Values2D { * * @return The row index, or {@code -1} if the key is unrecognised. */ - public int getRowIndex(Comparable key); + public /*@GTENegativeOne*/ int getRowIndex(Comparable key); /** * Returns the row keys. @@ -95,7 +95,7 @@ public interface KeyedValues2D extends Values2D { * * @return The column index, or {@code -1} if the key is unrecognised. */ - public int getColumnIndex(Comparable key); + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key); /** * Returns the column keys. diff --git a/src/main/java/org/jfree/data/Values2D.java b/src/main/java/org/jfree/data/Values2D.java index f7b74afaf..16d0b7e53 100644 --- a/src/main/java/org/jfree/data/Values2D.java +++ b/src/main/java/org/jfree/data/Values2D.java @@ -39,7 +39,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /** * A general purpose interface that can be used to access a table of values. @@ -51,14 +51,14 @@ public interface Values2D { * * @return The row count. */ - public int getRowCount(); + public /*@NonNegative*/ int getRowCount(); /** * Returns the number of columns in the table. * * @return The column count. */ - public int getColumnCount(); + public /*@NonNegative*/ int getColumnCount(); /** * Returns a value from the table. diff --git a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java index b2531b8af..853750e68 100644 --- a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java @@ -47,7 +47,7 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.List; @@ -85,7 +85,7 @@ public DefaultCategoryDataset() { * @see #getColumnCount() */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.data.getRowCount(); } @@ -97,7 +97,7 @@ public int getRowCount() { * @see #getRowCount() */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } @@ -143,7 +143,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getRowKey(int) */ @Override - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -184,7 +184,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getColumnKey(int) */ @Override - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { // defer null argument check return this.data.getColumnIndex(key); } @@ -322,7 +322,7 @@ public void removeValue(Comparable rowKey, Comparable columnKey) { * * @see #removeColumn(int) */ - public void removeRow(int rowIndex) { + public void removeRow(/*@NonNegative*/ int rowIndex) { this.data.removeRow(rowIndex); fireDatasetChanged(); } @@ -348,7 +348,7 @@ public void removeRow(Comparable rowKey) { * * @see #removeRow(int) */ - public void removeColumn(int columnIndex) { + public void removeColumn(/*@NonNegative*/ int columnIndex) { this.data.removeColumn(columnIndex); fireDatasetChanged(); } diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index 6a1646fc7..0cae42ce9 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -637,7 +637,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getCategoryIndex(Comparable) */ @Override - public int getColumnIndex(Comparable columnKey) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable columnKey) { Args.nullNotPermitted(columnKey, "columnKey"); return getCategoryIndex(columnKey); } @@ -652,7 +652,7 @@ public int getColumnIndex(Comparable columnKey) { * @see #getSeriesIndex(Comparable) */ @Override - public int getRowIndex(Comparable rowKey) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable rowKey) { return getSeriesIndex(rowKey); } @@ -704,7 +704,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getRowCount() */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.categoryKeys.length; } @@ -717,7 +717,7 @@ public int getColumnCount() { * @see #getColumnCount() */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.seriesKeys.length; } diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index 58ab92724..56e3f820c 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -40,7 +40,7 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collections; import java.util.List; @@ -171,7 +171,7 @@ private int lastCategoryIndex() { * @return The column index, or -1 if the key is not recognised. */ @Override - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { return index - this.firstCategoryIndex; @@ -218,7 +218,7 @@ public List getColumnKeys() { * @return The row index, or {@code -1} if the key is unrecognised. */ @Override - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { return this.underlying.getRowIndex(key); } @@ -274,7 +274,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The column count. */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { int last = lastCategoryIndex(); if (last == -1) { return 0; @@ -290,7 +290,7 @@ public int getColumnCount() { * @return The row count. */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.underlying.getRowCount(); } diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index 1758127f1..12e3a7bc7 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -173,7 +173,7 @@ private int lastCategoryIndex() { * @return The column index, or -1 if the key is not recognised. */ @Override - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { return index - this.firstCategoryIndex; @@ -220,7 +220,7 @@ public List getColumnKeys() { * @return The row index, or {@code -1} if the key is unrecognised. */ @Override - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { return this.underlying.getRowIndex(key); } @@ -276,7 +276,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The column count. */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { int last = lastCategoryIndex(); if (last == -1) { return 0; @@ -292,7 +292,7 @@ public int getColumnCount() { * @return The row count. */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.underlying.getRowCount(); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 13e7caf30..1f3a4603a 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -160,7 +160,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The series count. */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.data.size(); } @@ -180,7 +180,7 @@ public List getRowKeys() { * @return The column count. */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.keys.size(); } @@ -214,7 +214,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int index) { * @return The column index. */ @Override - public int getColumnIndex(Comparable columnKey) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable columnKey) { Args.nullNotPermitted(columnKey, "columnKey"); return this.keys.indexOf(columnKey); } @@ -227,7 +227,7 @@ public int getColumnIndex(Comparable columnKey) { * @return The index. */ @Override - public int getRowIndex(Comparable rowKey) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable rowKey) { int result = -1; int count = this.data.size(); for (int i = 0; i < count; i++) { diff --git a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java index 7d49cb0a1..c09a95ba4 100644 --- a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java +++ b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java @@ -43,7 +43,7 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -74,7 +74,7 @@ protected AbstractSeriesDataset() { * @return The series count. */ @Override - public abstract int getSeriesCount(); + public abstract /*@NonNegative*/ int getSeriesCount(); /** * Returns the key for a series. diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java index 0cd222994..2b1818446 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java @@ -231,7 +231,7 @@ public void remove(Comparable rowKey, Comparable columnKey) { * * @since 1.0.7 */ - public void removeRow(int rowIndex) { + public void removeRow(/*@NonNegative*/ int rowIndex) { this.data.removeRow(rowIndex); updateBounds(); fireDatasetChanged(); @@ -263,7 +263,7 @@ public void removeRow(Comparable rowKey) { * * @since 1.0.7 */ - public void removeColumn(int columnIndex) { + public void removeColumn(/*@NonNegative*/ int columnIndex) { this.data.removeColumn(columnIndex); updateBounds(); fireDatasetChanged(); @@ -521,7 +521,7 @@ public Number getQ3Value(Comparable rowKey, Comparable columnKey) { * @see #getColumnKey(int) */ @Override - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { return this.data.getColumnIndex(key); } @@ -561,7 +561,7 @@ public List getColumnKeys() { * @see #getRowKey(int) */ @Override - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -600,7 +600,7 @@ public List getRowKeys() { * @see #getColumnCount() */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.data.getRowCount(); } @@ -612,7 +612,7 @@ public int getRowCount() { * @see #getRowCount() */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } diff --git a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java index 500ea546d..911d068d6 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java @@ -255,7 +255,7 @@ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { * @return The column index. */ @Override - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { return this.data.getColumnIndex(key); } @@ -289,7 +289,7 @@ public List getColumnKeys() { * @return The row index. */ @Override - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { return this.data.getRowIndex(key); } @@ -321,7 +321,7 @@ public List getRowKeys() { * @return The row count. */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.data.getRowCount(); } @@ -331,7 +331,7 @@ public int getRowCount() { * @return The column count. */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } diff --git a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java index e1cff76c9..0c710929d 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java @@ -56,7 +56,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.List; import org.jfree.chart.util.PublicCloneable; @@ -256,7 +256,7 @@ public Number getStdDevValue(Comparable rowKey, Comparable columnKey) { * @return The column index. */ @Override - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { // defer null argument check return this.data.getColumnIndex(key); } @@ -291,7 +291,7 @@ public List getColumnKeys() { * @return The row index. */ @Override - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -326,7 +326,7 @@ public List getRowKeys() { * @see #getColumnCount() */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.data.getRowCount(); } @@ -338,7 +338,7 @@ public int getRowCount() { * @see #getRowCount() */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } @@ -479,7 +479,7 @@ public void remove(Comparable rowKey, Comparable columnKey) { * * @since 1.0.7 */ - public void removeRow(int rowIndex) { + public void removeRow(/*@NonNegative*/ int rowIndex) { this.data.removeRow(rowIndex); updateBounds(); fireDatasetChanged(); @@ -511,7 +511,7 @@ public void removeRow(Comparable rowKey) { * * @since 1.0.7 */ - public void removeColumn(int columnIndex) { + public void removeColumn(/*@NonNegative*/ int columnIndex) { this.data.removeColumn(columnIndex); updateBounds(); fireDatasetChanged(); diff --git a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java index a39061fcf..ea7e1f5ae 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java @@ -42,7 +42,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import javax.swing.table.AbstractTableModel; @@ -103,7 +103,7 @@ public TimeSeriesTableModel(TimeSeries series, boolean editable) { * @return The column count. */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return 2; } @@ -159,7 +159,7 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The row count. */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.series.getItemCount(); } diff --git a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java index bd0372479..831e154f2 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java @@ -76,7 +76,7 @@ public DomainOrder getDomainOrder() { * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { double result = Double.NaN; Number x = getX(series, item); if (x != null) { @@ -94,7 +94,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { double result = Double.NaN; Number y = getY(series, item); if (y != null) { diff --git a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java index d0f232110..13d6cbfa9 100644 --- a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java @@ -44,10 +44,10 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -136,15 +136,16 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - public /*@LengthOf({"this.seriesList.get(#1)[0]", "this.seriesList.get(#1)[1]", "this.seriesList.get(#1)[2]", "this.seriesList.get(#1)[3]", "this.seriesList.get(#1)[4]", "this.seriesList.get(#1)[5]"})*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeriesKey("#1")")*/ int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - @SuppressWarnings("index") // class invariant: list of 2D arrays that are 6xN, where N is the same for each array - double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]", "this.seriesList.get(series)[2]", "this.seriesList.get(series)[3]", "this.seriesList.get(series)[4]", "this.seriesList.get(series)[5]"})*/ [] seriesArray = - (double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]", "this.seriesList.get(series)[2]", "this.seriesList.get(series)[3]", "this.seriesList.get(series)[4]", "this.seriesList.get(series)[5]"})*/ []) + double /*@ArrayLen(6)*/ [][] seriesArray = + (double[][]) this.seriesList.get(series); - return seriesArray[0].length; + @SuppressWarnings("index") // The annotation on this method's return type isn't quite sensical, because there's no way to express the correct invariant here. Warnings are suppressed throughout these classes, but callers have a good interface. + /*@LengthOf("this.getSeriesKey("#1")")*/ int result = seriesArray[0].length; + return result; } /** @@ -165,9 +166,11 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[0][item]; + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings({"index", "value"}) // array-list interop + /*@IndexFor("seriesDate[0]")*/ int itemIndex = item; + return seriesData[0][itemIndex]; } /** @@ -188,9 +191,11 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[3]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[3][item]; + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings({"index", "value"}) // array-list interop + /*@IndexFor("seriesDate[3]")*/ int itemIndex = item; + return seriesData[3][itemIndex]; } /** @@ -211,9 +216,11 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getStartX(int, int) */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[1][item]; + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings({"index", "value"}) // array-list interop + /*@IndexFor("seriesData[1]")*/ int itemIndex = item; + return seriesData[1][itemIndex]; } /** @@ -234,9 +241,11 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seri * @see #getEndX(int, int) */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[2]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[2][item]; + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings({"index", "value"}) // array-list interop + /*@IndexFor("seriesDate[2]")*/ int itemIndex = item; + return seriesData[2][itemIndex]; } /** @@ -257,9 +266,11 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.series * @see #getStartY(int, int) */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[4]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[4][item]; + public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings({"index", "value"}) // array-list interop + /*@IndexFor("seriesDate[4]")*/ int itemIndex = item; + return seriesData[4][itemIndex]; } /** @@ -280,9 +291,11 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seri * @see #getEndY(int, int) */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[5]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[5][item]; + public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings({"index", "value"}) // array-list interop + /*@IndexFor("seriesDate[5]")*/ int itemIndex = item; + return seriesData[5][itemIndex]; } /** @@ -303,7 +316,7 @@ public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.series * @see #getEndXValue(int, int) */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[6]")*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getEndXValue(series, item)); } @@ -325,7 +338,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList. * @see #getEndYValue(int, int) */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[5]")*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getEndYValue(series, item)); } @@ -347,7 +360,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList. * @see #getStartXValue(int, int) */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getStartXValue(series, item)); } @@ -369,7 +382,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getStartYValue(int, int) */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[4]")*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getStartYValue(series, item)); } @@ -391,7 +404,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getXValue(series, item)); } @@ -413,7 +426,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get * @see #getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getYValue(series, item)); } @@ -428,7 +441,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get * (x, xLow and xHigh) and the last three containing the y-values * (y, yLow and yHigh)). */ - public void addSeries(Comparable seriesKey, double /*@ArrayLen(6)*/ [] /*@SameLen({"#2[0]", "#2[1]", "#2[2]", "#2[3]", "#2[4]", "#2[5]"})*/ [] data) { + public void addSeries(Comparable seriesKey, double /*@ArrayLen(6)*/ [][] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); @@ -546,6 +559,7 @@ public int hashCode() { * a key that cannot be cloned. */ @Override + @SuppressWarnings("index") // clone assumes that the dataset is well-formed. public Object clone() throws CloneNotSupportedException { DefaultIntervalXYDataset clone = (DefaultIntervalXYDataset) super.clone(); diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index ac0409c47..3edc53550 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -98,8 +98,10 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { - return new Long(this.data[item].getDate().getTime()); + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + Number result = new Long(this.data[item].getDate().getTime()); + return result; } /** @@ -110,8 +112,10 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * * @return The x-value as a date. */ - public Date getXDate(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { - return this.data[item].getDate(); + public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + Date result = this.data[item].getDate(); + return result; } /** @@ -123,7 +127,7 @@ public Date getXDate(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The y value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { return getClose(series, item); } @@ -136,8 +140,10 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The high value. */ @Override - public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { - return this.data[item].getHigh(); + public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + Number result = this.data[item].getHigh(); + return result; } /** @@ -150,7 +156,7 @@ public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The high-value. */ @Override - public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { double result = Double.NaN; Number high = getHigh(series, item); if (high != null) { @@ -168,8 +174,10 @@ public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The low value. */ @Override - public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { - return this.data[item].getLow(); + public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + Number result = this.data[item].getLow(); + return result; } /** @@ -182,7 +190,7 @@ public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The low-value. */ @Override - public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { double result = Double.NaN; Number low = getLow(series, item); if (low != null) { @@ -200,8 +208,10 @@ public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item * @return The open value. */ @Override - public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { - return this.data[item].getOpen(); + public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + Number result = this.data[item].getOpen(); + return result; } /** @@ -214,7 +224,7 @@ public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The open-value. */ @Override - public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { double result = Double.NaN; Number open = getOpen(series, item); if (open != null) { @@ -232,8 +242,10 @@ public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The close value. */ @Override - public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { - return this.data[item].getClose(); + public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + Number result = this.data[item].getClose(); + return result; } /** @@ -246,7 +258,7 @@ public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The close-value. */ @Override - public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { double result = Double.NaN; Number close = getClose(series, item); if (close != null) { @@ -264,8 +276,10 @@ public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int it * @return The trading volume. */ @Override - public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { - return this.data[item].getVolume(); + public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + Number result = this.data[item].getVolume(); + return result; } /** @@ -278,7 +292,7 @@ public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The volume-value. */ @Override - public double getVolumeValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { double result = Double.NaN; Number volume = getVolume(series, item); if (volume != null) { @@ -305,7 +319,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeriesKey("#1")")*/ int getItemCount(/*@NonNegative*/ int series) { return this.data.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index a5e80433b..5b05566e9 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -153,15 +153,16 @@ public DomainOrder getDomainOrder() { * specified range. */ @Override - public /*@LengthOf({"this.seriesList.get(#1)[0]", "this.seriesList.get(#1)[1]"})*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeriesKey("#1")")*/ int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - @SuppressWarnings("index") // class invariant: list of 2D arrays that are 2xN, where N is the same for each array - double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]"})*/ [] seriesArray = - (double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]"})*/ []) + double /*@ArrayLen(2)*/ [][] seriesArray = + (double[][]) this.seriesList.get(series); - return seriesArray[0].length; + @SuppressWarnings("index") // The annotation on this method's return type isn't quite sensical, because there's no way to express the correct invariant here. Warnings are suppressed throughout these classes, but callers have a good interface. + /*@LengthOf("this.getSeriesKey("#1")")*/ int result = seriesArray[0].length; + return result; } /** @@ -182,9 +183,11 @@ public DomainOrder getDomainOrder() { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[0][item]; + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + double /*@ArrayLen(2)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries + /*@IndexFor("seriesData[0]")*/ int itemIndex = item; + return seriesData[0][itemIndex]; } /** @@ -205,7 +208,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { return new Double(getXValue(series, item)); } @@ -227,9 +230,11 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[1][item]; + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + double /*@ArrayLen(2)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries + /*@IndexFor("seriesData[1]")*/ int itemIndex = item; + return seriesData[1][itemIndex]; } /** @@ -250,7 +255,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getX(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { return new Double(getYValue(series, item)); } @@ -264,7 +269,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get * arrays of equal length, the first containing the x-values and the * second containing the y-values). */ - public void addSeries(Comparable seriesKey, double /*@ArrayLen(2)*/ [] /*@SameLen({"#2[0]", "#2[1]"})*/ [] data) { + public void addSeries(Comparable seriesKey, double /*@ArrayLen(2)*/ [][] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); diff --git a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java index 877f3a267..cd1a9f825 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java @@ -43,8 +43,8 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> @@ -156,15 +156,15 @@ public DomainOrder getDomainOrder() { * specified range. */ @Override - public /*@LengthOf({"this.seriesList.get(#1)[0]", "this.seriesList.get(#1)[1]", "this.seriesList.get(#1)[2]"})*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeriesKey("#1")")*/ int getItemCount(/*@NonNegative*/ int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - @SuppressWarnings("index") // class invariant: list of 2D arrays that are 3xN, where N is the same for each array - double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]", "this.seriesList.get(series)[2]"})*/ [] seriesArray = - (double[] /*@SameLen({"this.seriesList.get(series)[0]", "this.seriesList.get(series)[1]", "this.seriesList.get(series)[2]"})*/ []) - this.seriesList.get(series); - return seriesArray[0].length; + double /*@ArrayLen(3)*/ [][] seriesArray = + (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // The annotation on this method's return type isn't quite sensical, because there's no way to express the correct invariant here. Warnings are suppressed throughout these classes, but callers have a good interface. + /*@LengthOf("this.getSeriesKey("#1")")*/ int result = seriesArray[0].length; + return result; } /** @@ -185,9 +185,11 @@ public DomainOrder getDomainOrder() { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[0][item]; + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + double /*@ArrayLen(3)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // array-list interop prevents precise annotation on item + /*@IndexFor("seriesData[0]")*/ int itemIndex = item; + return seriesData[0][itemIndex]; } /** @@ -208,7 +210,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[0]")*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { return new Double(getXValue(series, item)); } @@ -230,9 +232,11 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[1][item]; + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + double /*@ArrayLen(3)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // array-list interop prevents precise annotation on item + /*@IndexFor("seriesData[1]")*/ int itemIndex = item; + return seriesData[1][itemIndex]; } /** @@ -253,7 +257,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getX(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[1]")*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { return new Double(getYValue(series, item)); } @@ -275,9 +279,11 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get * @see #getZ(int, int) */ @Override - public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[2]")*/ int item) { - double[][] seriesData = (double[][]) this.seriesList.get(series); - return seriesData[2][item]; + public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { + double /*@ArrayLen(3)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + @SuppressWarnings("index") // array-list interop prevents precise annotation on item + /*@IndexFor("seriesData[2]")*/ int itemIndex = item; + return seriesData[2][itemIndex]; } /** @@ -298,7 +304,7 @@ public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.seriesLis * @see #getZ(int, int) */ @Override - public Number getZ(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get(#1)[2]")*/ int item) { + public Number getZ(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item) { return new Double(getZValue(series, item)); } @@ -313,7 +319,7 @@ public Number getZ(/*@NonNegative*/ int series, /*@IndexFor("this.seriesList.get * second containing the y-values and the third containing the * z-values). */ - public void addSeries(Comparable seriesKey, double /*@ArrayLen(3)*/ [] /*@SameLen({"#2[0]", "#2[1]", "#2[2]"})*/ [] data) { + public void addSeries(Comparable seriesKey, double /*@ArrayLen(3)*/ [][] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); @@ -430,6 +436,7 @@ public int hashCode() { * series key). */ @Override + @SuppressWarnings("index") // clone assumes that object is well-formed; list-index interop prevents this from being verifiable public Object clone() throws CloneNotSupportedException { DefaultXYZDataset clone = (DefaultXYZDataset) super.clone(); clone.seriesKeys = new java.util.ArrayList(this.seriesKeys); diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java index 1c992a83f..06180e674 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java @@ -66,7 +66,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The lower bound of the x-interval ({@code null} permitted). */ - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the lower bound of the x-interval (as a double primitive) for @@ -79,7 +79,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getStartX(int, int) */ - public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the upper bound of the x-interval for the specified series and @@ -91,7 +91,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The upper bound of the x-interval ({@code null} permitted). */ - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the upper bound of the x-interval (as a double primitive) for @@ -104,7 +104,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getEndX(int, int) */ - public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the lower bound of the y-interval for the specified series and @@ -116,7 +116,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The lower bound of the y-interval ({@code null} permitted). */ - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the lower bound of the y-interval (as a double primitive) for @@ -129,7 +129,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getStartY(int, int) */ - public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the upper bound of the y-interval for the specified series and @@ -141,7 +141,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The upper bound of the y-interval ({@code null} permitted). */ - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the upper bound of the y-interval (as a double primitive) for @@ -154,6 +154,6 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getEndY(int, int) */ - public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index db0e2766f..18318a72c 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -63,7 +63,7 @@ public class MatrixSeries extends Series implements Serializable { /** Series matrix values */ @SuppressWarnings("index") // Representation invariant - protected double /*@SameLen("this")*/ [] /*@SameLen("this[0]")*/ [] data; + protected double /*@SameLen("this")*/ [] /*@SameLen("this.data")*/ [] data; /** * Constructs a new matrix series. @@ -86,7 +86,7 @@ public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int * * @return The number of columns in this matrix series. */ - public /*@LengthOf("this[0]")*/ int getColumnsCount() { + public /*@LengthOf("this.data")*/ int getColumnsCount() { return this.data[0].length; } @@ -118,7 +118,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * * @return The column of the specified item. */ - public /*@IndexFor("this[0]")*/ int getItemColumn(/*@NonNegative*/ int itemIndex) { + public /*@IndexFor("this.data")*/ int getItemColumn(/*@NonNegative*/ int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex % getColumnsCount(); } @@ -169,7 +169,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * @see #getItem(int) * @see #update(int, int, double) */ - public double get(/*@IndexFor("this")*/ int i, /*@IndexFor("this[0]")*/ int j) { + public double get(/*@IndexFor("this")*/ int i, /*@IndexFor("this.data")*/ int j) { return this.data[i][j]; } @@ -183,7 +183,7 @@ public double get(/*@IndexFor("this")*/ int i, /*@IndexFor("this[0]")*/ int j) { * * @see #get(int, int) */ - public void update(/*@IndexFor("this")*/ int i, /*@IndexFor("this[0]")*/ int j, double mij) { + public void update(/*@IndexFor("this")*/ int i, /*@IndexFor("this.data")*/ int j, double mij) { this.data[i][j] = mij; fireSeriesChanged(); } diff --git a/src/main/java/org/jfree/data/xy/OHLCDataset.java b/src/main/java/org/jfree/data/xy/OHLCDataset.java index 6cd857bcf..bfba3ad29 100644 --- a/src/main/java/org/jfree/data/xy/OHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/OHLCDataset.java @@ -66,7 +66,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the high-value (as a double primitive) for an item within a @@ -77,7 +77,7 @@ public interface OHLCDataset extends XYDataset { * * @return The high-value. */ - public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the low-value for the specified series and item. @@ -87,7 +87,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the low-value (as a double primitive) for an item within a @@ -98,7 +98,7 @@ public interface OHLCDataset extends XYDataset { * * @return The low-value. */ - public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the open-value for the specified series and item. @@ -108,7 +108,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the open-value (as a double primitive) for an item within a @@ -119,7 +119,7 @@ public interface OHLCDataset extends XYDataset { * * @return The open-value. */ - public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the y-value for the specified series and item. @@ -129,7 +129,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the close-value (as a double primitive) for an item within a @@ -140,7 +140,7 @@ public interface OHLCDataset extends XYDataset { * * @return The close-value. */ - public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the volume for the specified series and item. @@ -150,7 +150,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the volume-value (as a double primitive) for an item within a @@ -161,6 +161,6 @@ public interface OHLCDataset extends XYDataset { * * @return The volume-value. */ - public double getVolumeValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/TableXYDataset.java b/src/main/java/org/jfree/data/xy/TableXYDataset.java index 9ab20acda..d6998b954 100644 --- a/src/main/java/org/jfree/data/xy/TableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/TableXYDataset.java @@ -51,6 +51,7 @@ * x-values between series). This is used primarily by the * {@link org.jfree.chart.renderer.xy.StackedXYAreaRenderer}. */ +@SuppressWarnings("index") // TODO: I think this may be a documentation bug. The annotation on getItemCount below is correct, I believe, but it's inconsistent with the documentation on this interface. public interface TableXYDataset extends XYDataset { /** @@ -58,6 +59,6 @@ public interface TableXYDataset extends XYDataset { * * @return The item count. */ - public /*@Positive*/ int getItemCount(); + public /*@NonNegative*/ int getItemCount(); } diff --git a/src/main/java/org/jfree/data/xy/XYDataset.java b/src/main/java/org/jfree/data/xy/XYDataset.java index 7de84bd4f..d5b5df67c 100644 --- a/src/main/java/org/jfree/data/xy/XYDataset.java +++ b/src/main/java/org/jfree/data/xy/XYDataset.java @@ -78,7 +78,7 @@ public interface XYDataset extends SeriesDataset { * * @return The item count. */ - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series); + public /*@LengthOf("this.getSeriesKey("#1")")*/ int getItemCount(/*@NonNegative*/ int series); /** * Returns the x-value for an item within a series. The x-values may or @@ -92,7 +92,7 @@ public interface XYDataset extends SeriesDataset { * * @return The x-value (never {@code null}). */ - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the x-value for an item within a series. @@ -104,7 +104,7 @@ public interface XYDataset extends SeriesDataset { * * @return The x-value. */ - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the y-value for an item within a series. @@ -116,7 +116,7 @@ public interface XYDataset extends SeriesDataset { * * @return The y-value (possibly {@code null}). */ - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the y-value (as a double primitive) for an item within a series. @@ -128,6 +128,6 @@ public interface XYDataset extends SeriesDataset { * * @return The y-value. */ - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java index d582ba48c..48f765d9a 100644 --- a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java +++ b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java @@ -43,7 +43,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; @@ -104,7 +104,7 @@ public void setModel(TableXYDataset dataset) { * @return The row count. */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { if (this.model == null) { return 0; } @@ -117,7 +117,7 @@ public int getRowCount() { * @return The number of columns in the model. */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { if (this.model == null) { return 0; } diff --git a/src/main/java/org/jfree/data/xy/XYZDataset.java b/src/main/java/org/jfree/data/xy/XYZDataset.java index 97026d498..cca972796 100644 --- a/src/main/java/org/jfree/data/xy/XYZDataset.java +++ b/src/main/java/org/jfree/data/xy/XYZDataset.java @@ -61,7 +61,7 @@ public interface XYZDataset extends XYDataset { * * @return The z-value (possibly {@code null}). */ - public Number getZ(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getZ(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); /** * Returns the z-value (as a double primitive) for an item within a series. @@ -71,6 +71,6 @@ public interface XYZDataset extends XYDataset { * * @return The z-value. */ - public double getZValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeriesKey("#1")")*/ int item); } diff --git a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java index e9e2946cb..72a21755c 100644 --- a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java +++ b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java @@ -74,7 +74,7 @@ public TestIntervalCategoryDataset() { * @see #getColumnCount() */ @Override - public int getRowCount() { + public /*@NonNegative*/ int getRowCount() { return this.data.getRowCount(); } @@ -86,7 +86,7 @@ public int getRowCount() { * @see #getRowCount() */ @Override - public int getColumnCount() { + public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } @@ -137,7 +137,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getRowKey(int) */ @Override - public int getRowIndex(Comparable key) { + public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -178,7 +178,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getColumnKey(int) */ @Override - public int getColumnIndex(Comparable key) { + public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { // defer null argument check return this.data.getColumnIndex(key); } @@ -304,7 +304,7 @@ public void removeItem(Comparable rowKey, Comparable columnKey) { * * @see #removeColumn(int) */ - public void removeRow(int rowIndex) { + public void removeRow(/*@NonNegative*/ int rowIndex) { this.data.removeRow(rowIndex); fireDatasetChanged(); } @@ -330,7 +330,7 @@ public void removeRow(Comparable rowKey) { * * @see #removeRow(int) */ - public void removeColumn(int columnIndex) { + public void removeColumn(/*@NonNegative*/ int columnIndex) { this.data.removeColumn(columnIndex); fireDatasetChanged(); } From bc6dc864f2d7a0d7eb74ce39c5c61133f5b4d9d1 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Thu, 14 Dec 2017 16:20:54 -0800 Subject: [PATCH 11/79] mostly finished with data/xy package --- .../data/general/AbstractSeriesDataset.java | 2 +- .../org/jfree/data/general/SeriesDataset.java | 2 +- .../jfree/data/xy/CategoryTableXYDataset.java | 4 +- .../data/xy/DefaultIntervalXYDataset.java | 20 +++++----- .../org/jfree/data/xy/DefaultOHLCDataset.java | 1 + .../jfree/data/xy/DefaultTableXYDataset.java | 22 +++++++---- .../org/jfree/data/xy/DefaultWindDataset.java | 12 +++--- .../org/jfree/data/xy/DefaultXYDataset.java | 3 +- .../org/jfree/data/xy/DefaultXYZDataset.java | 34 +++++++---------- .../org/jfree/data/xy/IntervalXYDelegate.java | 10 +++-- .../org/jfree/data/xy/IntervalXYZDataset.java | 13 ++++--- .../java/org/jfree/data/xy/MatrixSeries.java | 9 ++++- .../jfree/data/xy/MatrixSeriesCollection.java | 9 +++-- .../jfree/data/xy/NormalizedMatrixSeries.java | 6 +-- .../jfree/data/xy/VectorSeriesCollection.java | 17 +++++---- .../org/jfree/data/xy/VectorXYDataset.java | 8 ++-- .../java/org/jfree/data/xy/WindDataset.java | 5 ++- .../data/xy/XIntervalSeriesCollection.java | 22 ++++++----- .../java/org/jfree/data/xy/XYBarDataset.java | 37 ++++++++++++------- .../jfree/data/xy/XYDatasetTableModel.java | 1 + .../data/xy/XYIntervalSeriesCollection.java | 26 +++++++------ src/main/java/org/jfree/data/xy/XYSeries.java | 22 +++++++---- .../org/jfree/data/xy/XYSeriesCollection.java | 19 ++++++---- .../java/org/jfree/data/xy/XisSymbolic.java | 1 + .../data/xy/YIntervalSeriesCollection.java | 22 ++++++----- .../java/org/jfree/data/xy/YisSymbolic.java | 2 +- 26 files changed, 185 insertions(+), 144 deletions(-) diff --git a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java index a956ffda8..a68a431e6 100644 --- a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java +++ b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java @@ -124,7 +124,7 @@ public void seriesChanged(SeriesChangeEvent event) { * to represent the conceptual "series" that the dataset provides. */ @Override - public Object[] getSeries(int series) throws Exception{ + public Series getSeries(/*@NonNegative*/ int series) throws Exception{ throw new Exception("unimplemented"); } } diff --git a/src/main/java/org/jfree/data/general/SeriesDataset.java b/src/main/java/org/jfree/data/general/SeriesDataset.java index 1630fd38e..f0aae0301 100644 --- a/src/main/java/org/jfree/data/general/SeriesDataset.java +++ b/src/main/java/org/jfree/data/general/SeriesDataset.java @@ -100,6 +100,6 @@ public interface SeriesDataset extends Dataset { * @param series a series index * @return a representation of the series */ - Object[] getSeries(int series) throws Exception; + Series getSeries(/*@NonNegative*/ int series) throws Exception; } diff --git a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java index 62b541c52..be80188d9 100644 --- a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java @@ -201,7 +201,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { @Override public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { @SuppressWarnings("index") // The annotation on this method's return type isn't quite sensical, because there's no way to express the correct invariant here. Warnings are suppressed throughout these classes, but callers have a good interface. - int result = getItemCount(); // all series have the same number of items in + /*@LengthOf("this.getSeries(#1)")*/ int result = getItemCount(); // all series have the same number of items in // this dataset return result; } @@ -228,6 +228,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting X value. */ @Override + @SuppressWarnings("index") // interval delegate and this.getSeries have the same conceptual length public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -241,6 +242,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending X value. */ @Override + @SuppressWarnings("index") // interval delegate and this.getSeries have the same conceptual length public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getEndX(series, item); } diff --git a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java index e73271c01..edc3746b8 100644 --- a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java @@ -135,7 +135,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { throw new IllegalArgumentException("Series index out of bounds"); } double /*@ArrayLen(6)*/ [][] seriesArray = - (double[][]) + (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); @SuppressWarnings("index") // The annotation on this method's return type isn't quite sensical, because there's no way to express the correct invariant here. Warnings are suppressed throughout these classes, but callers have a good interface. /*@LengthOf("this.getSeries(#1)")*/ int result = seriesArray[0].length; @@ -161,7 +161,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop /*@IndexFor("seriesData[0]")*/ int itemIndex = item; return seriesData[0][itemIndex]; @@ -186,7 +186,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop /*@IndexFor("seriesData[3]")*/ int itemIndex = item; return seriesData[3][itemIndex]; @@ -211,7 +211,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop /*@IndexFor("seriesData[1]")*/ int itemIndex = item; return seriesData[1][itemIndex]; @@ -236,7 +236,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS */ @Override public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop /*@IndexFor("seriesData[2]")*/ int itemIndex = item; return seriesData[2][itemIndex]; @@ -261,7 +261,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer */ @Override public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop /*@IndexFor("seriesData[4]")*/ int itemIndex = item; return seriesData[4][itemIndex]; @@ -286,7 +286,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS */ @Override public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double[][]) this.seriesList.get(series); + double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop /*@IndexFor("seriesData[5]")*/ int itemIndex = item; return seriesData[5][itemIndex]; @@ -495,8 +495,8 @@ public boolean equals(Object obj) { return false; } for (int i = 0; i < this.seriesList.size(); i++) { - double[][] d1 = (double[][]) this.seriesList.get(i); - double[][] d2 = (double[][]) that.seriesList.get(i); + double[][] d1 = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(i); + double[][] d2 = (double /*@ArrayLen(6)*/ [][]) that.seriesList.get(i); double[] d1x = d1[0]; double[] d2x = d2[0]; if (!Arrays.equals(d1x, d2x)) { @@ -560,7 +560,7 @@ public Object clone() throws CloneNotSupportedException { clone.seriesKeys = new java.util.ArrayList(this.seriesKeys); clone.seriesList = new ArrayList(this.seriesList.size()); for (int i = 0; i < this.seriesList.size(); i++) { - double[][] data = (double[][]) this.seriesList.get(i); + double[][] data = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(i); double[] x = data[0]; double[] xStart = data[1]; double[] xEnd = data[2]; diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index 05da4bc40..f2860e8b6 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -320,6 +320,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The item count. */ @Override + @SuppressWarnings("index") // this.data is the same length as the conceptual getSeries called with any argument, but no SameLen annotation can express that due to the argument needed for getSeries public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.data.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index f7d6235da..deeadca78 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -62,6 +62,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -269,9 +270,11 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The number of items in the specified series. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // check arguments...delegated - return getSeries(series).getItemCount(); + @SuppressWarnings("index") // conflict between ghost method and real method + /*@LengthOf("this.getSeries(#1)")*/ int result = getSeries(series).getItemCount(); + return result; } /** @@ -283,7 +286,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value for the specified series and item. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XYSeries s = (XYSeries) this.data.get(series); return s.getX(item); @@ -298,7 +301,8 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The starting X value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // interval delegate and this.getSeries have the same conceptual length + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -311,7 +315,8 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The ending X value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // interval delegate and this.getSeries have the same conceptual length + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getEndX(series, item); } @@ -325,7 +330,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int index) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int index) { XYSeries s = (XYSeries) this.data.get(series); return s.getY(index); } @@ -339,7 +344,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int index) { * @return The starting Y value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -352,7 +357,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The ending Y value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -446,6 +451,7 @@ public void removeAllValuesForX(Number x) { * * @return A boolean. */ + @SuppressWarnings("index") // this method assumes that x is in the dataset. This is a documentation bug. protected boolean canPrune(Number x) { for (int s = 0; s < this.data.size(); s++) { XYSeries series = (XYSeries) this.data.get(s); diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index 52acc986f..8f6887306 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -46,6 +46,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -189,7 +190,8 @@ public DefaultWindDataset(List seriesKeys, Object[][] /*@ArrayLen(3)*/ [] data) * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // class invariant + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { if (series < 0 || series >= getSeriesCount()) { throw new IllegalArgumentException("Invalid series index: " + series); @@ -225,7 +227,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value for the item within the series. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getX(); @@ -242,7 +244,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The y-value for the item within the series. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getWindForce(series, item); } @@ -256,7 +258,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The wind direction for the item within the series. */ @Override - public Number getWindDirection(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getWindDirection(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getWindDirection(); @@ -272,7 +274,7 @@ public Number getWindDirection(/*@NonNegative*/ int series, /*@NonNegative*/ int * @return The wind force for the item within the series. */ @Override - public Number getWindForce(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getWindForce(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getWindForce(); diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index ea7f676ac..20298dcee 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -161,8 +161,7 @@ public DomainOrder getDomainOrder() { double /*@ArrayLen(2)*/ [] /*@SameLen("this.getSeries(#1)")*/ [] seriesArray = (double /*@ArrayLen(2)*/ [][]) this.seriesList.get(series); - int result = seriesArray[0].length; - return result; + return seriesArray[0].length; } /** diff --git a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java index 7a9f57487..4c90ef078 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java @@ -45,11 +45,6 @@ package org.jfree.data.xy; /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ - -/*>>> -import org.checkerframework.checker.index.qual.NonNegative; - */ import java.util.ArrayList; import java.util.Arrays; @@ -160,11 +155,10 @@ public DomainOrder getDomainOrder() { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - double /*@ArrayLen(3)*/ [][] seriesArray = - (double[][]) this.seriesList.get(series); - @SuppressWarnings("index") // The annotation on this method's return type isn't quite sensical, because there's no way to express the correct invariant here. Warnings are suppressed throughout these classes, but callers have a good interface. - /*@LengthOf("this.getSeries(#1)")*/ int result = seriesArray[0].length; - return result; + @SuppressWarnings("index") // class invariant: this.getSeries is the logical ghost variable representing this array + double /*@ArrayLen(3)*/ [] /*@SameLen("this.getSeries(#1)")*/ [] seriesArray = + (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); + return seriesArray[0].length; } /** @@ -186,8 +180,8 @@ public DomainOrder getDomainOrder() { */ @Override public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(3)*/ [][] seriesData = (double[][]) this.seriesList.get(series); - @SuppressWarnings("index") // array-list interop prevents precise annotation on item + double /*@ArrayLen(3)*/ [][] seriesData = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); + @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries /*@IndexFor("seriesData[0]")*/ int itemIndex = item; return seriesData[0][itemIndex]; } @@ -233,8 +227,8 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(3)*/ [][] seriesData = (double[][]) this.seriesList.get(series); - @SuppressWarnings("index") // array-list interop prevents precise annotation on item + double /*@ArrayLen(3)*/ [][] seriesData = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); + @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries /*@IndexFor("seriesData[1]")*/ int itemIndex = item; return seriesData[1][itemIndex]; } @@ -280,8 +274,8 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(3)*/ [][] seriesData = (double[][]) this.seriesList.get(series); - @SuppressWarnings("index") // array-list interop prevents precise annotation on item + double /*@ArrayLen(3)*/ [][] seriesData = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); + @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries /*@IndexFor("seriesData[2]")*/ int itemIndex = item; return seriesData[2][itemIndex]; } @@ -379,7 +373,6 @@ public void removeSeries(Comparable seriesKey) { * @return A boolean. */ @Override - @SuppressWarnings("index") // Equality test relies on well-formedness of other object, which can't be annotated perfectly because of array-list interop public boolean equals(Object obj) { if (obj == this) { return true; @@ -392,8 +385,8 @@ public boolean equals(Object obj) { return false; } for (int i = 0; i < this.seriesList.size(); i++) { - double[][] d1 = (double[][]) this.seriesList.get(i); - double[][] d2 = (double[][]) that.seriesList.get(i); + double[][] d1 = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(i); + double[][] d2 = (double /*@ArrayLen(3)*/ [][]) that.seriesList.get(i); double[] d1x = d1[0]; double[] d2x = d2[0]; if (!Arrays.equals(d1x, d2x)) { @@ -436,13 +429,12 @@ public int hashCode() { * series key). */ @Override - @SuppressWarnings("index") // clone assumes that object is well-formed; list-index interop prevents this from being verifiable public Object clone() throws CloneNotSupportedException { DefaultXYZDataset clone = (DefaultXYZDataset) super.clone(); clone.seriesKeys = new java.util.ArrayList(this.seriesKeys); clone.seriesList = new ArrayList(this.seriesList.size()); for (int i = 0; i < this.seriesList.size(); i++) { - double[][] data = (double[][]) this.seriesList.get(i); + double[][] data = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(i); double[] x = data[0]; double[] y = data[1]; double[] z = data[2]; diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java index df3556b27..cbf07b26e 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java @@ -52,6 +52,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -261,7 +262,7 @@ public double getIntervalWidth() { * * @see #getStartXValue(int, int) */ - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.getSeries(#1)")*/ int item) { Number startX = null; Number x = this.dataset.getX(series, item); if (x != null) { @@ -281,7 +282,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * * @see #getStartX(int, int) */ - public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.getSeries(#1)")*/ int item) { return this.dataset.getXValue(series, item) - getIntervalPositionFactor() * getIntervalWidth(); } @@ -296,7 +297,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * * @see #getEndXValue(int, int) */ - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.getSeries(#1)")*/ int item) { Number endX = null; Number x = this.dataset.getX(series, item); if (x != null) { @@ -316,7 +317,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * * @see #getEndX(int, int) */ - public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.getSeries(#1)")*/ int item) { return this.dataset.getXValue(series, item) + (1.0 - getIntervalPositionFactor()) * getIntervalWidth(); } @@ -423,6 +424,7 @@ private double calculateIntervalForSeries(/*@NonNegative*/ int series) { double result = Double.POSITIVE_INFINITY; int itemCount = this.dataset.getItemCount(series); if (itemCount > 1) { + @SuppressWarnings("index") // itemCount is the length of this series, so 0 is safe here double prev = this.dataset.getXValue(series, 0); for (int item = 1; item < itemCount; item++) { double x = this.dataset.getXValue(series, item); diff --git a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java index 1a98ed0f3..5a72e3ba1 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java @@ -39,6 +39,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -58,7 +59,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting X value for the specified series and item. */ - public Number getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the ending X value for the specified series and item. @@ -68,7 +69,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending X value for the specified series and item. */ - public Number getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the starting Y value for the specified series and item. @@ -78,7 +79,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting Y value for the specified series and item. */ - public Number getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the ending Y value for the specified series and item. @@ -88,7 +89,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending Y value for the specified series and item. */ - public Number getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the starting Z value for the specified series and item. @@ -98,7 +99,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting Z value for the specified series and item. */ - public Number getStartZValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getStartZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the ending Z value for the specified series and item. @@ -108,6 +109,6 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending Z value for the specified series and item. */ - public Number getEndZValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getEndZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index 18318a72c..6912e6a16 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -62,7 +62,6 @@ public class MatrixSeries extends Series implements Serializable { private static final long serialVersionUID = 7934188527308315704L; /** Series matrix values */ - @SuppressWarnings("index") // Representation invariant protected double /*@SameLen("this")*/ [] /*@SameLen("this.data")*/ [] data; /** @@ -75,6 +74,7 @@ public class MatrixSeries extends Series implements Serializable { * @param rows the number of rows. * @param columns the number of columns. */ + @SuppressWarnings("index") // representation invariant: this.data needs to be SameLen as "this" public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int columns) { super(name); this.data = new double[rows][columns]; @@ -86,6 +86,7 @@ public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int * * @return The number of columns in this matrix series. */ + @SuppressWarnings("index") // this method assumes that there is at least one row, but the documentation doesn't say so. This is a documentation bug. public /*@LengthOf("this.data")*/ int getColumnsCount() { return this.data[0].length; } @@ -118,6 +119,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * * @return The column of the specified item. */ + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 public /*@IndexFor("this.data")*/ int getItemColumn(/*@NonNegative*/ int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex % getColumnsCount(); @@ -142,6 +144,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * * @return The row of the specified item. */ + @SuppressWarnings("index") // dividing the index by the column count results in a row index public /*@IndexFor("this")*/ int getItemRow(/*@NonNegative*/ int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex / getColumnsCount(); @@ -230,7 +233,9 @@ public boolean equals(Object obj) { } for (int r = 0; r < getRowCount(); r++) { for (int c = 0; c < getColumnsCount(); c++) { - if (get(r, c) != that.get(r, c)) { + @SuppressWarnings("index") // row and column counts have to be equal, as checked above + boolean test = get(r, c) != that.get(r, c); + if (test) { return false; } } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java index 1b745fda9..0c6ff23d4 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java @@ -97,7 +97,8 @@ public MatrixSeriesCollection(MatrixSeries series) { * @return The number of items in the specified series. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { + @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated correctly because some Series are mutable length + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { return getSeries(seriesIndex).getItemCount(); } @@ -154,7 +155,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int seriesIndex) { * @see org.jfree.data.xy.XYDataset#getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { + public Number getX(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); int x = series.getItemColumn(itemIndex); @@ -174,7 +175,7 @@ public Number getX(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIn * @see org.jfree.data.xy.XYDataset#getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { + public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); int y = series.getItemRow(itemIndex); @@ -194,7 +195,7 @@ public Number getY(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIn * @see org.jfree.data.xy.XYZDataset#getZValue(int, int) */ @Override - public Number getZ(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { + public Number getZ(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); Number z = series.getItem(itemIndex); return z; diff --git a/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java b/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java index f5c768109..002b96ef0 100644 --- a/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java @@ -40,7 +40,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /** * Represents a dense normalized matrix M[i,j] where each Mij item of the @@ -69,7 +69,7 @@ public class NormalizedMatrixSeries extends MatrixSeries { * @param rows the number of rows. * @param columns the number of columns. */ - public NormalizedMatrixSeries(String name, int rows, int columns) { + public NormalizedMatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int columns) { super(name, rows, columns); /* @@ -136,7 +136,7 @@ public double getScaleFactor() { * @see #get(int, int) */ @Override - public void update(int i, int j, double mij) { + public void update(/*@IndexFor("this")*/ int i, /*@IndexFor("this.data")*/ int j, double mij) { this.m_totalSum -= get(i, j); this.m_totalSum += mij; diff --git a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java index 54450d053..d8e9b26be 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java @@ -195,7 +195,8 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -209,7 +210,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getXValue(); @@ -226,7 +227,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getXValue(series, item)); } @@ -239,7 +240,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The y-value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getYValue(); @@ -256,7 +257,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getYValue(series, item)); } @@ -269,7 +270,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The vector (possibly {@code null}). */ @Override - public Vector getVector(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Vector getVector(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVector(); @@ -284,7 +285,7 @@ public Vector getVector(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The x-component of the vector. */ @Override - public double getVectorXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getVectorXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVectorX(); @@ -299,7 +300,7 @@ public double getVectorXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int * @return The y-component of the vector. */ @Override - public double getVectorYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getVectorYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVectorY(); diff --git a/src/main/java/org/jfree/data/xy/VectorXYDataset.java b/src/main/java/org/jfree/data/xy/VectorXYDataset.java index e48a4d9e8..97a8ec519 100644 --- a/src/main/java/org/jfree/data/xy/VectorXYDataset.java +++ b/src/main/java/org/jfree/data/xy/VectorXYDataset.java @@ -45,7 +45,7 @@ package org.jfree.data.xy; /*>>> -import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.index.qual.*; */ /** @@ -64,7 +64,7 @@ public interface VectorXYDataset extends XYDataset { * * @return The x-component of the vector. */ - public double getVectorXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getVectorXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the y-component of the vector for an item in a series. @@ -74,7 +74,7 @@ public interface VectorXYDataset extends XYDataset { * * @return The y-component of the vector. */ - public double getVectorYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public double getVectorYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the vector for an item in a series. Depending on the particular @@ -88,6 +88,6 @@ public interface VectorXYDataset extends XYDataset { * * @return The vector (possibly {@code null}). */ - public Vector getVector(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Vector getVector(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/WindDataset.java b/src/main/java/org/jfree/data/xy/WindDataset.java index f746076d6..f585c0659 100644 --- a/src/main/java/org/jfree/data/xy/WindDataset.java +++ b/src/main/java/org/jfree/data/xy/WindDataset.java @@ -40,6 +40,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -62,7 +63,7 @@ public interface WindDataset extends XYDataset { * * @return The wind direction. */ - public Number getWindDirection(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getWindDirection(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the wind force on the Beaufort scale (0 to 12). See: @@ -76,6 +77,6 @@ public interface WindDataset extends XYDataset { * * @return The wind force. */ - public Number getWindForce(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getWindForce(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); } diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java index 1d54b65cf..0f6e1e465 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java @@ -43,6 +43,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -144,7 +145,8 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // getSeries.getItemCount can't be annotated because some series are mutable + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -158,7 +160,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return di.getX(); @@ -174,7 +176,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getXLowValue(item); } @@ -189,7 +191,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getXHighValue(item); } @@ -204,7 +206,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -218,7 +220,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getYValue()); @@ -233,7 +235,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getXLowValue()); @@ -248,7 +250,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getXHighValue()); @@ -264,7 +266,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -278,7 +280,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index f7a155499..26fa9f963 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -48,6 +48,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -77,6 +78,7 @@ public class XYBarDataset extends AbstractIntervalXYDataset * permitted). * @param barWidth the width of the bars. */ + @SuppressWarnings("index") // the underlying dataset is the same length as this dataset by definition public XYBarDataset(XYDataset underlying, double barWidth) { this.underlying = underlying; this.underlying.addChangeListener(this); @@ -151,7 +153,8 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getItemCount(series); } @@ -166,7 +169,8 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getX(series, item); } @@ -181,7 +185,8 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getXValue(series, item); } @@ -196,7 +201,8 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @see #getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } @@ -211,7 +217,8 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getYValue(series, item); } @@ -224,7 +231,8 @@ public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; Number xnum = this.underlying.getX(series, item); if (xnum != null) { @@ -245,7 +253,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @see #getXValue(int, int) */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getXValue(series, item) - this.barWidth / 2.0; } @@ -258,7 +266,8 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; Number xnum = this.underlying.getX(series, item); if (xnum != null) { @@ -279,7 +288,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @see #getXValue(int, int) */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getXValue(series, item) + this.barWidth / 2.0; } @@ -292,7 +301,8 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } @@ -308,7 +318,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @see #getYValue(int, int) */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getYValue(series, item); } @@ -321,7 +331,8 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // this and this.underlying have the same conceptual length + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } @@ -337,7 +348,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @see #getYValue(int, int) */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getYValue(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java index 48f765d9a..9b0755148 100644 --- a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java +++ b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java @@ -154,6 +154,7 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The value of the specified cell. */ @Override + @SuppressWarnings("upperbound") // row's relation to the model is dependent on the value of column public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (this.model == null) { return null; diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java index 31d9e0b2b..06844a82b 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java @@ -45,6 +45,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -146,7 +147,8 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -160,7 +162,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getX(item); } @@ -175,7 +177,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getXLowValue(item); } @@ -190,7 +192,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getXHighValue(item); } @@ -205,7 +207,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -220,7 +222,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYLowValue(item); } @@ -235,7 +237,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYHighValue(item); } @@ -249,7 +251,7 @@ public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getYValue(series, item)); } @@ -262,7 +264,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getStartXValue(series, item)); } @@ -275,7 +277,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getEndXValue(series, item)); } @@ -289,7 +291,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getStartYValue(series, item)); } @@ -303,7 +305,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getEndYValue(series, item)); } diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index 0ff1b3fed..bd61dcee3 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -79,7 +79,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -113,7 +113,7 @@ public class XYSeries extends Series implements Cloneable, Serializable { protected List data; /** The maximum number of items for the series. */ - private int maximumItemCount = Integer.MAX_VALUE; + private /*@NonNegative*/ int maximumItemCount = Integer.MAX_VALUE; /** * A flag that controls whether the items are automatically sorted @@ -267,6 +267,7 @@ private void updateBoundsForAddedItem(XYDataItem item) { * * @since 1.0.13 */ + @SuppressWarnings("index") // this method is clearly assuming that item is not the last item in the series. TODO: I believe this is a bug private void updateBoundsForRemovedItem(XYDataItem item) { boolean itemContributesToXBounds = false; boolean itemContributesToYBounds = false; @@ -367,7 +368,7 @@ public List getItems() { * * @see #setMaximumItemCount(int) */ - public int getMaximumItemCount() { + public /*@NonNegative*/ int getMaximumItemCount() { return this.maximumItemCount; } @@ -385,7 +386,7 @@ public int getMaximumItemCount() { * * @param maximum the maximum number of items for the series. */ - public void setMaximumItemCount(int maximum) { + public void setMaximumItemCount(/*@NonNegative*/ int maximum) { this.maximumItemCount = maximum; int remove = this.data.size() - maximum; if (remove > 0) { @@ -511,7 +512,9 @@ public void add(XYDataItem item, boolean notify) { if (this.autoSort) { int index = Collections.binarySearch(this.data, item); if (index < 0) { - this.data.add(-index - 1, item); + @SuppressWarnings("index") // searchindex for list + /*@NonNegative*/ int newIndex = -index - 1; + this.data.add(newIndex, item); } else { if (this.allowDuplicateXValues) { @@ -561,7 +564,7 @@ public void add(XYDataItem item, boolean notify) { * @param start the start index (zero-based). * @param end the end index (zero-based). */ - public void delete(int start, int end) { + public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { this.data.subList(start, end + 1).clear(); findBoundsByIteration(); fireSeriesChanged(); @@ -592,6 +595,7 @@ public XYDataItem remove(/*@NonNegative*/ int index) { * @return The item removed. */ + @SuppressWarnings("index") // this is a bug? The documentation doesn't say it, but a precondition of this method must be that x is in this XYSeries public XYDataItem remove(Number x) { return remove(indexOf(x)); } @@ -849,7 +853,7 @@ else if (item.getY() != null) { * * @return The index. */ - public /*@GTENegativeOne*/ int indexOf(Number x) { + public int indexOf(Number x) { if (this.autoSort) { return Collections.binarySearch(this.data, new XYDataItem(x, null)); } @@ -871,6 +875,8 @@ else if (item.getY() != null) { * * @since 1.0.4 */ + @SuppressWarnings("index") // every access of the form result[0][i] or result[1][i] in this method issues an error despite + // being safe, since both result[0] and result[1] have length of itemCount. public double[][] toArray() { int itemCount = getItemCount(); double[][] result = new double[2][itemCount]; @@ -911,7 +917,7 @@ public Object clone() throws CloneNotSupportedException { * * @throws CloneNotSupportedException if there is a cloning problem. */ - public XYSeries createCopy(int start, int end) + public XYSeries createCopy(/*@NonNegative*/ int start, /*@NonNegative*/ int end) throws CloneNotSupportedException { XYSeries copy = (XYSeries) super.clone(); diff --git a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java index 07d0ca974..d68931635 100644 --- a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java @@ -321,7 +321,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * * @since 1.0.14 */ - public int getSeriesIndex(Comparable key) { + public /*@GTENegativeOne*/ int getSeriesIndex(Comparable key) { Args.nullNotPermitted(key, "key"); int seriesCount = getSeriesCount(); for (int i = 0; i < seriesCount; i++) { @@ -344,7 +344,8 @@ public int getSeriesIndex(Comparable key) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -358,7 +359,7 @@ public int getSeriesIndex(Comparable key) { * @return The value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { XYSeries s = (XYSeries) this.data.get(series); return s.getX(item); } @@ -372,7 +373,8 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The starting X value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -385,7 +387,8 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The ending X value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getEndX(series, item); } @@ -398,7 +401,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int index) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int index) { XYSeries s = (XYSeries) this.data.get(series); return s.getY(index); } @@ -412,7 +415,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int index) { * @return The starting Y value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -425,7 +428,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The ending Y value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XisSymbolic.java b/src/main/java/org/jfree/data/xy/XisSymbolic.java index b1e41ddd0..8aa724f6a 100644 --- a/src/main/java/org/jfree/data/xy/XisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/XisSymbolic.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java index b4e9691e9..3c7710491 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java @@ -45,6 +45,7 @@ */ package org.jfree.data.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -146,7 +147,8 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -160,7 +162,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getX(item); } @@ -175,7 +177,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -190,7 +192,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYLowValue(item); } @@ -205,7 +207,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYHighValue(item); } @@ -219,7 +221,7 @@ public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYValue(item)); } @@ -234,7 +236,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getX(series, item); } @@ -248,7 +250,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getX(series, item); } @@ -261,7 +263,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYLowValue(item)); } @@ -275,7 +277,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYHighValue(item)); } diff --git a/src/main/java/org/jfree/data/xy/YisSymbolic.java b/src/main/java/org/jfree/data/xy/YisSymbolic.java index f51e2fefb..ab8fb3e45 100644 --- a/src/main/java/org/jfree/data/xy/YisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/YisSymbolic.java @@ -44,7 +44,7 @@ package org.jfree.data.xy; /*>>> -import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.index.qual.*; */ /** From 731f19be604c3a38882b871175631b1f38c9ea16 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Fri, 15 Dec 2017 18:17:10 -0800 Subject: [PATCH 12/79] annotations on many packages in org/jfree/data --- .../labels/HighLowItemLabelGenerator.java | 2 +- .../labels/SymbolicXYItemLabelGenerator.java | 2 +- .../renderer/xy/CyclicXYItemRenderer.java | 21 +++++-- .../urls/StandardCategoryURLGenerator.java | 2 +- .../data/category/CategoryToPieDataset.java | 8 +-- .../DefaultIntervalCategoryDataset.java | 30 +++++----- .../category/IntervalCategoryDataset.java | 4 +- .../data/category/SlidingCategoryDataset.java | 20 +++---- .../data/gantt/GanttCategoryDataset.java | 18 +++--- .../gantt/SlidingGanttCategoryDataset.java | 38 ++++++------- src/main/java/org/jfree/data/gantt/Task.java | 4 +- .../data/gantt/TaskSeriesCollection.java | 18 +++--- .../org/jfree/data/gantt/XYTaskDataset.java | 34 +++++------ .../org/jfree/data/general/DatasetUtils.java | 18 +++--- .../data/general/DefaultHeatMapDataset.java | 43 +++++++++----- .../jfree/data/general/DefaultPieDataset.java | 6 +- .../jfree/data/general/HeatMapDataset.java | 19 +++++-- .../org/jfree/data/general/HeatMapUtils.java | 5 +- .../jfree/data/general/WaferMapDataset.java | 23 ++++---- .../org/jfree/data/jdbc/JDBCXYDataset.java | 7 ++- .../statistics/BoxAndWhiskerXYDataset.java | 19 ++++--- .../DefaultBoxAndWhiskerCategoryDataset.java | 14 ++--- .../DefaultBoxAndWhiskerXYDataset.java | 29 +++++----- .../DefaultMultiValueCategoryDataset.java | 1 - .../jfree/data/statistics/HistogramBin.java | 5 +- .../data/statistics/HistogramDataset.java | 25 ++++---- .../org/jfree/data/statistics/Regression.java | 17 +++--- .../data/statistics/SimpleHistogramBin.java | 6 +- .../statistics/SimpleHistogramDataset.java | 28 ++++----- .../org/jfree/data/statistics/Statistics.java | 15 +++-- src/main/java/org/jfree/data/time/Day.java | 8 ++- .../time/DynamicTimeSeriesCollection.java | 57 +++++++++++-------- .../data/time/TimePeriodValuesCollection.java | 2 +- .../jfree/data/time/TimeSeriesCollection.java | 2 +- .../jfree/data/time/TimeTableXYDataset.java | 2 +- .../data/time/ohlc/OHLCSeriesCollection.java | 29 +++++----- .../general/TestIntervalCategoryDataset.java | 4 +- 37 files changed, 323 insertions(+), 262 deletions(-) diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index bb534e73a..3d30f02fb 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -168,7 +168,7 @@ public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /* * @return The label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int category) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int category) { return null; //TODO: implement this method properly } diff --git a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java index 139e5a993..315acacae 100644 --- a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java @@ -119,7 +119,7 @@ else if (data instanceof TimeSeriesCollection) { * @return The label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, int category) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int category) { return null; //TODO: implement this method properly } diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 04fc01b2b..7c0b9654a 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -66,6 +66,7 @@ import org.jfree.data.DomainOrder; import org.jfree.data.general.DatasetChangeListener; import org.jfree.data.general.DatasetGroup; +import org.jfree.data.general.Series; import org.jfree.data.xy.XYDataset; /** @@ -149,7 +150,7 @@ public CyclicXYItemRenderer(int type, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { if ((!getPlotLines()) || ((!(domainAxis instanceof CyclicNumberAxis)) && (!(rangeAxis instanceof CyclicNumberAxis))) || (item <= 0)) { @@ -368,7 +369,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { return this.x.length; } @@ -381,7 +382,7 @@ public DomainOrder getDomainOrder() { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.x[item]; } @@ -395,7 +396,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { double result = Double.NaN; Number xx = getX(series, item); if (xx != null) { @@ -413,7 +414,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.y[item]; } @@ -427,7 +428,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The y-value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { double result = Double.NaN; Number yy = getY(series, item); if (yy != null) { @@ -511,6 +512,14 @@ public void setGroup(DatasetGroup group) { // unused in parent } + /** + * A ghost method. Do not call. + */ + @Override + public Series getSeries(int series) { + return null; + } + } } diff --git a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java index b29f2678d..5d5d63de5 100644 --- a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java @@ -137,7 +137,7 @@ public StandardCategoryURLGenerator(String prefix, */ @Override public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, - int category) { + /*@NonNegative*/ int category) { String url = this.prefix; Comparable seriesKey = dataset.getRowKey(series); Comparable categoryKey = dataset.getColumnKey(category); diff --git a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java index d973b5b11..65d8fabb7 100644 --- a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java +++ b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java @@ -48,7 +48,7 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collections; @@ -78,7 +78,7 @@ public class CategoryToPieDataset extends AbstractDataset private TableOrder extract; /** The row or column index. */ - private int index; + private /*@NonNegative*/ int index; /** * An adaptor class that converts any {@link CategoryDataset} into a @@ -93,7 +93,7 @@ public class CategoryToPieDataset extends AbstractDataset * @param index the row or column index. */ public CategoryToPieDataset(CategoryDataset source, TableOrder extract, - int index) { + /*@NonNegative*/ int index) { Args.nullNotPermitted(extract, "extract"); this.source = source; if (this.source != null) { @@ -133,7 +133,7 @@ public TableOrder getExtractType() { * * @since 1.0.2 */ - public int getExtractIndex() { + public /*@NonNegative*/ int getExtractIndex() { return this.index; } diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index 7d9b6cdcd..1b7c536a9 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -47,7 +47,7 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -96,7 +96,7 @@ public class DefaultIntervalCategoryDataset extends AbstractSeriesDataset * @param ends the ending values for the intervals ({@code null} not * permitted). */ - public DefaultIntervalCategoryDataset(double[][] starts, double[][] ends) { + public DefaultIntervalCategoryDataset(double /*@SameLen("#2")*/ [][] starts, double /*@SameLen("#1")*/ [][] ends) { this(DataUtils.createNumberArray2D(starts), DataUtils.createNumberArray2D(ends)); } @@ -112,7 +112,7 @@ public DefaultIntervalCategoryDataset(double[][] starts, double[][] ends) { * @param starts the start values data. * @param ends the end values data. */ - public DefaultIntervalCategoryDataset(Number[][] starts, Number[][] ends) { + public DefaultIntervalCategoryDataset(Number /*@SameLen("#2")*/ [][] starts, Number /*@SameLen("#1")*/ [][] ends) { this(null, null, starts, ends); } @@ -129,8 +129,8 @@ public DefaultIntervalCategoryDataset(Number[][] starts, Number[][] ends) { * @param ends the end values data, indexed as data[series][category]. */ public DefaultIntervalCategoryDataset(String[] seriesNames, - Number[][] starts, - Number[][] ends) { + Number /*@SameLen("#3")*/ [][] starts, + Number /*@SameLen("#2")*/ [][] ends) { this(seriesNames, null, starts, ends); @@ -150,8 +150,8 @@ public DefaultIntervalCategoryDataset(String[] seriesNames, */ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, Comparable[] categoryKeys, - Number[][] starts, - Number[][] ends) { + Number /*@SameLen("#4")*/ [][] starts, + Number /*@SameLen("#3")*/ [][] ends) { this.startData = starts; this.endData = ends; @@ -248,7 +248,7 @@ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, * @see #getRowIndex(Comparable) * @see #getSeriesKey(int) */ - public int getSeriesIndex(Comparable seriesKey) { + public /*@GTENegativeOne*/ int getSeriesIndex(Comparable seriesKey) { int result = -1; for (int i = 0; i < this.seriesKeys.length; i++) { if (seriesKey.equals(this.seriesKeys[i])) { @@ -302,7 +302,7 @@ public void setSeriesKeys(Comparable[] seriesKeys) { * * @see #getColumnCount() */ - public int getCategoryCount() { + public /*@NonNegative*/ int getCategoryCount() { int result = 0; if (this.startData != null) { if (getSeriesCount() > 0) { @@ -399,7 +399,7 @@ public Number getValue(Comparable series, Comparable category) { * @see #getEndValue(int, int) */ @Override - public Number getValue(/*@NonNegative*/ int series, int category) { + public Number getValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { return getEndValue(series, category); } @@ -439,7 +439,7 @@ public Number getStartValue(Comparable series, Comparable category) { * @see #getStartValue(Comparable, Comparable) */ @Override - public Number getStartValue(/*@NonNegative*/ int series, int category) { + public Number getStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { // check arguments... if ((series < 0) || (series >= getSeriesCount())) { @@ -493,7 +493,7 @@ public Number getEndValue(Comparable series, Comparable category) { * @see #getEndValue(Comparable, Comparable) */ @Override - public Number getEndValue(/*@NonNegative*/ int series, int category) { + public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException( "DefaultIntervalCategoryDataset.getValue(): " @@ -584,7 +584,7 @@ public void setEndValue(/*@NonNegative*/ int series, Comparable category, Number * * @see #getColumnIndex(Comparable) */ - public int getCategoryIndex(Comparable category) { + public /*@GTENegativeOne*/ int getCategoryIndex(Comparable category) { int result = -1; for (int i = 0; i < this.categoryKeys.length; i++) { if (category.equals(this.categoryKeys[i])) { @@ -604,7 +604,7 @@ public int getCategoryIndex(Comparable category) { * * @return An array of prefixN with N = { 1 .. count}. */ - private Comparable[] generateKeys(int count, String prefix) { + private Comparable[] generateKeys(/*@NonNegative*/ int count, String prefix) { Comparable[] result = new Comparable[count]; String name; for (int i = 0; i < count; i++) { @@ -624,6 +624,7 @@ private Comparable[] generateKeys(int count, String prefix) { * @see #getRowKey(int) */ @Override + @SuppressWarnings("index") // because this underlying array isn't exposed by the interface this method is inherited from, there is no way to write an upperbound annotation on column public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.categoryKeys[column]; } @@ -687,6 +688,7 @@ public List getRowKeys() { * @see #getColumnKey(int) */ @Override + @SuppressWarnings("index") // because this underlying array isn't exposed by the interface this method is inherited from, there is no way to write an upperbound annotation on column public Comparable getRowKey(/*@NonNegative*/ int row) { if ((row >= getRowCount()) || (row < 0)) { throw new IllegalArgumentException( diff --git a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java index 0c9a53e3d..46fd81026 100644 --- a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java @@ -66,7 +66,7 @@ public interface IntervalCategoryDataset extends CategoryDataset { * * @see #getEndValue(int, int) */ - public Number getStartValue(/*@NonNegative*/ int series, int category); + public Number getStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category); /** * Returns the start value for the interval for a given series and category. @@ -90,7 +90,7 @@ public interface IntervalCategoryDataset extends CategoryDataset { * * @see #getStartValue(int, int) */ - public Number getEndValue(/*@NonNegative*/ int series, int category); + public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category); /** * Returns the end value for the interval for a given series and category. diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index a26ec5d91..caeefd4e7 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -40,7 +40,7 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Collections; @@ -66,10 +66,10 @@ public class SlidingCategoryDataset extends AbstractDataset private CategoryDataset underlying; /** The index of the first category to present. */ - private int firstCategoryIndex; + private /*@NonNegative*/ int firstCategoryIndex; /** The maximum number of categories to present. */ - private int maximumCategoryCount; + private /*@NonNegative*/ int maximumCategoryCount; /** * Creates a new instance. @@ -80,8 +80,8 @@ public class SlidingCategoryDataset extends AbstractDataset * underlying dataset. * @param maxColumns the maximumColumnCount. */ - public SlidingCategoryDataset(CategoryDataset underlying, int firstColumn, - int maxColumns) { + public SlidingCategoryDataset(CategoryDataset underlying, /*@NonNegative*/ int firstColumn, + /*@NonNegative*/ int maxColumns) { this.underlying = underlying; this.firstCategoryIndex = firstColumn; this.maximumCategoryCount = maxColumns; @@ -103,7 +103,7 @@ public CategoryDataset getUnderlyingDataset() { * * @see #setFirstCategoryIndex(int) */ - public int getFirstCategoryIndex() { + public /*@NonNegative*/ int getFirstCategoryIndex() { return this.firstCategoryIndex; } @@ -116,7 +116,7 @@ public int getFirstCategoryIndex() { * * @see #getFirstCategoryIndex() */ - public void setFirstCategoryIndex(int first) { + public void setFirstCategoryIndex(/*@NonNegative*/ int first) { if (first < 0 || first >= this.underlying.getColumnCount()) { throw new IllegalArgumentException("Invalid index."); } @@ -131,7 +131,7 @@ public void setFirstCategoryIndex(int first) { * * @see #setMaximumCategoryCount(int) */ - public int getMaximumCategoryCount() { + public /*@NonNegative*/ int getMaximumCategoryCount() { return this.maximumCategoryCount; } @@ -143,7 +143,7 @@ public int getMaximumCategoryCount() { * * @see #getMaximumCategoryCount() */ - public void setMaximumCategoryCount(int max) { + public void setMaximumCategoryCount(/*@NonNegative*/ int max) { if (max < 0) { throw new IllegalArgumentException("Requires 'max' >= 0."); } @@ -156,7 +156,7 @@ public void setMaximumCategoryCount(int max) { * * @return The index. */ - private int lastCategoryIndex() { + private /*@GTENegativeOne*/ int lastCategoryIndex() { if (this.maximumCategoryCount == 0) { return -1; } diff --git a/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java index 57cdc7353..8e2fea443 100644 --- a/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java @@ -41,7 +41,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import org.jfree.data.category.IntervalCategoryDataset; @@ -85,7 +85,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getSubIntervalCount(Comparable, Comparable) */ - public int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public /*@NonNegative*/ int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column); /** * Returns the number of sub-intervals for a given item. @@ -97,7 +97,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getSubIntervalCount(int, int) */ - public int getSubIntervalCount(Comparable rowKey, Comparable columnKey); + public /*@NonNegative*/ int getSubIntervalCount(Comparable rowKey, Comparable columnKey); /** * Returns the start value of a sub-interval for a given item. @@ -110,7 +110,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getEndValue(int, int, int) */ - public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval); + public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval); /** * Returns the start value of a sub-interval for a given item. @@ -124,7 +124,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * @see #getEndValue(Comparable, Comparable, int) */ public Number getStartValue(Comparable rowKey, Comparable columnKey, - int subinterval); + /*@NonNegative*/ int subinterval); /** * Returns the end value of a sub-interval for a given item. @@ -137,7 +137,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * * @see #getStartValue(int, int, int) */ - public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval); + public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval); /** * Returns the end value of a sub-interval for a given item. @@ -151,7 +151,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * @see #getStartValue(Comparable, Comparable, int) */ public Number getEndValue(Comparable rowKey, Comparable columnKey, - int subinterval); + /*@NonNegative*/ int subinterval); /** * Returns the percentage complete value of a sub-interval for a given item. @@ -164,7 +164,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * * @see #getPercentComplete(Comparable, Comparable, int) */ - public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval); + public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval); /** * Returns the percentage complete value of a sub-interval for a given item. @@ -178,6 +178,6 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * @see #getPercentComplete(int, int, int) */ public Number getPercentComplete(Comparable rowKey, Comparable columnKey, - int subinterval); + /*@NonNegative*/ int subinterval); } diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index 2efa8d200..6c61a8089 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -39,7 +39,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -68,10 +68,10 @@ public class SlidingGanttCategoryDataset extends AbstractDataset private GanttCategoryDataset underlying; /** The index of the first category to present. */ - private int firstCategoryIndex; + private /*@NonNegative*/ int firstCategoryIndex; /** The maximum number of categories to present. */ - private int maximumCategoryCount; + private /*@NonNegative*/ int maximumCategoryCount; /** * Creates a new instance. @@ -83,7 +83,7 @@ public class SlidingGanttCategoryDataset extends AbstractDataset * @param maxColumns the maximumColumnCount. */ public SlidingGanttCategoryDataset(GanttCategoryDataset underlying, - int firstColumn, int maxColumns) { + /*@NonNegative*/ int firstColumn, /*@NonNegative*/ int maxColumns) { this.underlying = underlying; this.firstCategoryIndex = firstColumn; this.maximumCategoryCount = maxColumns; @@ -105,7 +105,7 @@ public GanttCategoryDataset getUnderlyingDataset() { * * @see #setFirstCategoryIndex(int) */ - public int getFirstCategoryIndex() { + public /*@NonNegative*/ int getFirstCategoryIndex() { return this.firstCategoryIndex; } @@ -118,7 +118,7 @@ public int getFirstCategoryIndex() { * * @see #getFirstCategoryIndex() */ - public void setFirstCategoryIndex(int first) { + public void setFirstCategoryIndex(/*@NonNegative*/ int first) { if (first < 0 || first >= this.underlying.getColumnCount()) { throw new IllegalArgumentException("Invalid index."); } @@ -133,7 +133,7 @@ public void setFirstCategoryIndex(int first) { * * @see #setMaximumCategoryCount(int) */ - public int getMaximumCategoryCount() { + public /*@NonNegative*/ int getMaximumCategoryCount() { return this.maximumCategoryCount; } @@ -145,7 +145,7 @@ public int getMaximumCategoryCount() { * * @see #getMaximumCategoryCount() */ - public void setMaximumCategoryCount(int max) { + public void setMaximumCategoryCount(/*@NonNegative*/ int max) { if (max < 0) { throw new IllegalArgumentException("Requires 'max' >= 0."); } @@ -158,7 +158,7 @@ public void setMaximumCategoryCount(int max) { * * @return The index. */ - private int lastCategoryIndex() { + private /*@GTENegativeOne*/ int lastCategoryIndex() { if (this.maximumCategoryCount == 0) { return -1; } @@ -344,7 +344,7 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { */ @Override public Number getPercentComplete(Comparable rowKey, Comparable columnKey, - int subinterval) { + /*@NonNegative*/ int subinterval) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { @@ -369,7 +369,7 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey, */ @Override public Number getEndValue(Comparable rowKey, Comparable columnKey, - int subinterval) { + /*@NonNegative*/ int subinterval) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { @@ -393,7 +393,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * @see #getStartValue(int, int, int) */ @Override - public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { + public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { return this.underlying.getEndValue(row, column + this.firstCategoryIndex, subinterval); } @@ -407,7 +407,7 @@ public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, * @return The percent complete. */ @Override - public Number getPercentComplete(/*@NonNegative*/ int series, int category) { + public Number getPercentComplete(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { return this.underlying.getPercentComplete(series, category + this.firstCategoryIndex); } @@ -424,7 +424,7 @@ public Number getPercentComplete(/*@NonNegative*/ int series, int category) { * @see #getPercentComplete(Comparable, Comparable, int) */ @Override - public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { + public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { return this.underlying.getPercentComplete(row, column + this.firstCategoryIndex, subinterval); } @@ -442,7 +442,7 @@ public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int */ @Override public Number getStartValue(Comparable rowKey, Comparable columnKey, - int subinterval) { + /*@NonNegative*/ int subinterval) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { @@ -466,7 +466,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * @see #getEndValue(int, int, int) */ @Override - public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { + public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { return this.underlying.getStartValue(row, column + this.firstCategoryIndex, subinterval); } @@ -482,7 +482,7 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum * @see #getSubIntervalCount(int, int) */ @Override - public int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { + public /*@NonNegative*/ int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { @@ -505,7 +505,7 @@ public int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { * @see #getSubIntervalCount(Comparable, Comparable) */ @Override - public int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public /*@NonNegative*/ int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.underlying.getSubIntervalCount(row, column + this.firstCategoryIndex); } @@ -580,7 +580,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey) { * @return The end value (possibly {@code null}). */ @Override - public Number getEndValue(/*@NonNegative*/ int series, int category) { + public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { return this.underlying.getEndValue(series, category + this.firstCategoryIndex); } diff --git a/src/main/java/org/jfree/data/gantt/Task.java b/src/main/java/org/jfree/data/gantt/Task.java index 07228040f..b676410cd 100644 --- a/src/main/java/org/jfree/data/gantt/Task.java +++ b/src/main/java/org/jfree/data/gantt/Task.java @@ -43,7 +43,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.util.Date; @@ -191,7 +191,7 @@ public void removeSubtask(Task subtask) { * * @return The sub-task count. */ - public int getSubtaskCount() { + public /*@NonNegative*/ int getSubtaskCount() { return this.subtasks.size(); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 8d9a9ec05..05b8821e8 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -50,7 +50,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -485,7 +485,7 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { * @return The sub-interval count. */ @Override - public int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public /*@NonNegative*/ int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getSubIntervalCount(rowKey, columnKey); @@ -500,7 +500,7 @@ public int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int co * @return The sub-interval count. */ @Override - public int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { + public /*@NonNegative*/ int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { int result = 0; int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); @@ -521,7 +521,7 @@ public int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { * @return The start value (possibly {@code null}). */ @Override - public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { + public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getStartValue(rowKey, columnKey, subinterval); @@ -538,7 +538,7 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum */ @Override public Number getStartValue(Comparable rowKey, Comparable columnKey, - int subinterval) { + /*@NonNegative*/ int subinterval) { Number result = null; int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); @@ -563,7 +563,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * @return The end value (possibly {@code null}). */ @Override - public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { + public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getEndValue(rowKey, columnKey, subinterval); @@ -580,7 +580,7 @@ public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, */ @Override public Number getEndValue(Comparable rowKey, Comparable columnKey, - int subinterval) { + /*@NonNegative*/ int subinterval) { Number result = null; int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); @@ -605,7 +605,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * @return The percent complete value (possibly {@code null}). */ @Override - public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, int subinterval) { + public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getPercentComplete(rowKey, columnKey, subinterval); @@ -622,7 +622,7 @@ public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int */ @Override public Number getPercentComplete(Comparable rowKey, Comparable columnKey, - int subinterval) { + /*@NonNegative*/ int subinterval) { Number result = null; int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); diff --git a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java index a6005d718..7d042f8cc 100644 --- a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java +++ b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java @@ -40,6 +40,7 @@ */ package org.jfree.data.gantt; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -185,7 +186,8 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // The underlying representation here is a mutable collection, but this annotation is needed to match the interface + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getSeries(series).getItemCount(); } @@ -198,7 +200,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { if (!this.transposed) { return getSeriesValue(series); } @@ -218,7 +220,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The start date/time. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { if (!this.transposed) { return getSeriesStartValue(series); } @@ -238,7 +240,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The end date/time. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { if (!this.transposed) { return getSeriesEndValue(series); } @@ -256,7 +258,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The x-value (in milliseconds). */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getXValue(series, item)); } @@ -271,7 +273,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The start date/time. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getStartXValue(series, item)); } @@ -286,7 +288,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The end date/time. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getEndXValue(series, item)); } @@ -299,7 +301,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { if (!this.transposed) { return getItemValue(series, item); } @@ -318,7 +320,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The y-interval start. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { if (!this.transposed) { return getItemStartValue(series, item); } @@ -337,7 +339,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The y-interval end. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { if (!this.transposed) { return getItemEndValue(series, item); } @@ -357,7 +359,7 @@ public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getYValue(series, item)); } @@ -371,7 +373,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The y-interval start. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getStartYValue(series, item)); } @@ -385,7 +387,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The y-interval end. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getEndYValue(series, item)); } @@ -401,7 +403,7 @@ private double getSeriesEndValue(/*@NonNegative*/ int series) { return series + this.seriesWidth / 2.0; } - private double getItemValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + private double getItemValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); @@ -410,7 +412,7 @@ private double getItemValue(/*@NonNegative*/ int series, /*@NonNegative*/ int it return (start.getTime() + end.getTime()) / 2.0; } - private double getItemStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + private double getItemStartValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); @@ -418,7 +420,7 @@ private double getItemStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ i return start.getTime(); } - private double getItemEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + private double getItemEndValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 8c6186457..fdeb5cb8a 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -128,6 +128,9 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -231,7 +234,7 @@ public static PieDataset createPieDatasetForRow(CategoryDataset dataset, * @return A pie dataset. */ public static PieDataset createPieDatasetForRow(CategoryDataset dataset, - int row) { + /*@NonNegative*/ int row) { DefaultPieDataset result = new DefaultPieDataset(); int columnCount = dataset.getColumnCount(); for (int current = 0; current < columnCount; current++) { @@ -266,7 +269,7 @@ public static PieDataset createPieDatasetForColumn(CategoryDataset dataset, * @return A pie dataset. */ public static PieDataset createPieDatasetForColumn(CategoryDataset dataset, - int column) { + /*@NonNegative*/ int column) { DefaultPieDataset result = new DefaultPieDataset(); int rowCount = dataset.getRowCount(); for (int i = 0; i < rowCount; i++) { @@ -426,8 +429,8 @@ public static CategoryDataset createCategoryDataset(String rowKeyPrefix, * * @return The dataset. */ - public static CategoryDataset createCategoryDataset(Comparable[] rowKeys, - Comparable[] columnKeys, double[][] data) { + public static CategoryDataset createCategoryDataset(Comparable /*@SameLen("#3")*/ [] rowKeys, + Comparable[] columnKeys, double /*@SameLen("#1")*/ [] /*@SameLen("#2")*/ [] data) { Args.nullNotPermitted(rowKeys, "rowKeys"); Args.nullNotPermitted(columnKeys, "columnKeys"); @@ -502,7 +505,7 @@ public static CategoryDataset createCategoryDataset(Comparable rowKey, * @return A dataset. */ public static XYDataset sampleFunction2D(Function2D f, double start, - double end, int samples, Comparable seriesKey) { + double end, /*@Positive*/ int samples, Comparable seriesKey) { // defer argument checking XYSeries series = sampleFunction2DToSeries(f, start, end, samples, @@ -527,7 +530,7 @@ public static XYDataset sampleFunction2D(Function2D f, double start, * @since 1.0.13 */ public static XYSeries sampleFunction2DToSeries(Function2D f, - double start, double end, int samples, Comparable seriesKey) { + double start, double end, /*@Positive*/ int samples, Comparable seriesKey) { Args.nullNotPermitted(f, "f"); Args.nullNotPermitted(seriesKey, "seriesKey"); @@ -2186,6 +2189,7 @@ public static double calculateStackTotal(TableXYDataset dataset, /*@NonNegative* double total = 0.0; int seriesCount = dataset.getSeriesCount(); for (int s = 0; s < seriesCount; s++) { + @SuppressWarnings("index") // This assumes that all series in the dataset have the same number of items double value = dataset.getYValue(s, item); if (!Double.isNaN(value)) { total = total + value; @@ -2284,7 +2288,7 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, * * @see #findYValue(org.jfree.data.xy.XYDataset, int, double) */ - public static int[] findItemIndicesForX(XYDataset dataset, /*@NonNegative*/ int series, + public static int /*@ArrayLen(2)*/ [] findItemIndicesForX(XYDataset dataset, /*@NonNegative*/ int series, double x) { Args.nullNotPermitted(dataset, "dataset"); int itemCount = dataset.getItemCount(series); diff --git a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java index cd09f2938..4438e3a20 100644 --- a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java @@ -39,6 +39,9 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; @@ -53,10 +56,10 @@ public class DefaultHeatMapDataset extends AbstractDataset implements HeatMapDataset, Cloneable, PublicCloneable, Serializable { /** The number of samples in this dataset for the x-dimension. */ - private int xSamples; + private /*@Positive*/ int xSamples; /** The number of samples in this dataset for the y-dimension. */ - private int ySamples; + private /*@Positive*/ int ySamples; /** The minimum x-value in the dataset. */ private double minX; @@ -71,7 +74,7 @@ public class DefaultHeatMapDataset extends AbstractDataset private double maxY; /** Storage for the z-values. */ - private double[][] zValues; + private double /*@MinLen(1)*/ /*@SameLen("this.getData()")*/ [] /*@MinLen(1)*/ /*@SameLen("this.getData()[0]")*/ [] zValues; /** * Creates a new dataset where all the z-values are initially 0. This is @@ -84,7 +87,7 @@ public class DefaultHeatMapDataset extends AbstractDataset * @param minY the minimum y-value in the dataset. * @param maxY the maximum y-value in the dataset. */ - public DefaultHeatMapDataset(int xSamples, int ySamples, double minX, + public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamples, double minX, double maxX, double minY, double maxY) { if (xSamples < 1) { @@ -112,9 +115,13 @@ public DefaultHeatMapDataset(int xSamples, int ySamples, double minX, this.maxX = maxX; this.minY = minY; this.maxY = maxY; - this.zValues = new double[xSamples][]; + @SuppressWarnings("index") // establish repr. invariant + double /*@SameLen("this.getData()")*/ [] /*@SameLen("this.getData()[0]")*/ [] zValues = new double[xSamples][]; + this.zValues = zValues; for (int x = 0; x < xSamples; x++) { - this.zValues[x] = new double[ySamples]; + @SuppressWarnings("index") // establish repr. invariant + double /*@SameLen("this.getData()[0]")*/ [] zValuesX = new double[ySamples]; + this.zValues[x] = zValuesX; } } @@ -126,7 +133,7 @@ public DefaultHeatMapDataset(int xSamples, int ySamples, double minX, * @return The number of x-values (always > 0). */ @Override - public int getXSampleCount() { + public /*@LengthOf("this.getData()")*/ int getXSampleCount() { return this.xSamples; } @@ -138,7 +145,7 @@ public int getXSampleCount() { * @return The number of y-values (always > 0). */ @Override - public int getYSampleCount() { + public /*@LengthOf("this.getData()[0]")*/ int getYSampleCount() { return this.ySamples; } @@ -198,7 +205,7 @@ public double getMaximumYValue() { * @return The x-value. */ @Override - public double getXValue(int xIndex) { + public double getXValue(/*@NonNegative*/ int xIndex) { double x = this.minX + (this.maxX - this.minX) * (xIndex / (double) this.xSamples); return x; @@ -212,7 +219,7 @@ public double getXValue(int xIndex) { * @return The y-value. */ @Override - public double getYValue(int yIndex) { + public double getYValue(/*@NonNegative*/ int yIndex) { double y = this.minY + (this.maxY - this.minY) * (yIndex / (double) this.ySamples); return y; @@ -228,7 +235,7 @@ public double getYValue(int yIndex) { * @return The z-value. */ @Override - public double getZValue(int xIndex, int yIndex) { + public double getZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex) { return this.zValues[xIndex][yIndex]; } @@ -244,10 +251,18 @@ public double getZValue(int xIndex, int yIndex) { * @return The z-value. */ @Override - public Number getZ(int xIndex, int yIndex) { + public Number getZ(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex) { return new Double(getZValue(xIndex, yIndex)); } + /** + * This is a ghost method. Implementations should return null. + */ + @Override + public double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] getData() { + return null; + } + /** * Updates a z-value in the dataset and sends a {@link DatasetChangeEvent} * to all registered listeners. @@ -256,7 +271,7 @@ public Number getZ(int xIndex, int yIndex) { * @param yIndex the y-index. * @param z the new z-value. */ - public void setZValue(int xIndex, int yIndex, double z) { + public void setZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex, double z) { setZValue(xIndex, yIndex, z, true); } @@ -269,7 +284,7 @@ public void setZValue(int xIndex, int yIndex, double z) { * @param z the new z-value. * @param notify notify listeners? */ - public void setZValue(int xIndex, int yIndex, double z, boolean notify) { + public void setZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex, double z, boolean notify) { this.zValues[xIndex][yIndex] = z; if (notify) { fireDatasetChanged(); diff --git a/src/main/java/org/jfree/data/general/DefaultPieDataset.java b/src/main/java/org/jfree/data/general/DefaultPieDataset.java index 67e53bce7..60c0d90b8 100644 --- a/src/main/java/org/jfree/data/general/DefaultPieDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultPieDataset.java @@ -56,7 +56,7 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -228,7 +228,7 @@ public void setValue(Comparable key, double value) { * * @since 1.0.6 */ - public void insertValue(int position, Comparable key, double value) { + public void insertValue(/*@NonNegative*/ int position, Comparable key, double value) { insertValue(position, key, new Double(value)); } @@ -245,7 +245,7 @@ public void insertValue(int position, Comparable key, double value) { * * @since 1.0.6 */ - public void insertValue(int position, Comparable key, Number value) { + public void insertValue(/*@NonNegative*/ int position, Comparable key, Number value) { this.data.insertValue(position, key, value); fireDatasetChanged(); } diff --git a/src/main/java/org/jfree/data/general/HeatMapDataset.java b/src/main/java/org/jfree/data/general/HeatMapDataset.java index db7f8e979..db3128523 100644 --- a/src/main/java/org/jfree/data/general/HeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/HeatMapDataset.java @@ -39,6 +39,9 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /** * A dataset that represents a rectangular grid of (x, y, z) values. The x @@ -56,7 +59,7 @@ public interface HeatMapDataset { * * @return The number of x-values (always > 0). */ - public int getXSampleCount(); + public /*@Positive*/ int getXSampleCount(); /** * Returns the number of y values (or samples) for the dataset. The @@ -65,7 +68,7 @@ public interface HeatMapDataset { * * @return The number of y-values (always > 0). */ - public int getYSampleCount(); + public /*@Positive*/ int getYSampleCount(); /** * Returns the lowest x-value represented in this dataset. A requirement @@ -110,7 +113,7 @@ public interface HeatMapDataset { * * @return The x-value. */ - public double getXValue(int xIndex); + public double getXValue(/*@NonNegative*/ int xIndex); /** * A convenience method that returns the y-value for the given index. @@ -119,7 +122,7 @@ public interface HeatMapDataset { * * @return The y-value. */ - public double getYValue(int yIndex); + public double getYValue(/*@NonNegative*/ int yIndex); /** * Returns the z-value at the specified sample position in the dataset. @@ -130,7 +133,7 @@ public interface HeatMapDataset { * * @return The z-value. */ - public double getZValue(int xIndex, int yIndex); + public double getZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex); /** * Returns the z-value at the specified sample position in the dataset. @@ -149,6 +152,10 @@ public interface HeatMapDataset { * * @return The z-value (possibly {@code null}). */ - public Number getZ(int xIndex, int yIndex); + public Number getZ(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex); + /** + * This is a ghost method. Implementations should return null. + */ + public double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] getData(); } diff --git a/src/main/java/org/jfree/data/general/HeatMapUtils.java b/src/main/java/org/jfree/data/general/HeatMapUtils.java index bb5606801..8a8a26175 100644 --- a/src/main/java/org/jfree/data/general/HeatMapUtils.java +++ b/src/main/java/org/jfree/data/general/HeatMapUtils.java @@ -40,6 +40,7 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -69,7 +70,7 @@ public abstract class HeatMapUtils { * @return The dataset. */ public static XYDataset extractRowFromHeatMapDataset(HeatMapDataset dataset, - int row, Comparable seriesName) { + /*@IndexFor("#1.getData()[0]")*/ int row, Comparable seriesName) { XYSeries series = new XYSeries(seriesName); int cols = dataset.getXSampleCount(); for (int c = 0; c < cols; c++) { @@ -90,7 +91,7 @@ public static XYDataset extractRowFromHeatMapDataset(HeatMapDataset dataset, * @return The dataset. */ public static XYDataset extractColumnFromHeatMapDataset( - HeatMapDataset dataset, /*@NonNegative*/ int column, Comparable seriesName) { + HeatMapDataset dataset, /*@IndexFor("#1.getData()")*/ int column, Comparable seriesName) { XYSeries series = new XYSeries(seriesName); int rows = dataset.getYSampleCount(); for (int r = 0; r < rows; r++) { diff --git a/src/main/java/org/jfree/data/general/WaferMapDataset.java b/src/main/java/org/jfree/data/general/WaferMapDataset.java index c836b8cbe..f753eb0a9 100644 --- a/src/main/java/org/jfree/data/general/WaferMapDataset.java +++ b/src/main/java/org/jfree/data/general/WaferMapDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.general; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.util.Set; import java.util.TreeSet; @@ -61,10 +62,10 @@ public class WaferMapDataset extends AbstractDataset { private DefaultKeyedValues2D data; /** wafer x dimension */ - private int maxChipX; + private /*@NonNegative*/ int maxChipX; /** wafer y dimension */ - private int maxChipY; + private /*@NonNegative*/ int maxChipY; /** space to draw between chips */ private double chipSpace; @@ -84,7 +85,7 @@ public class WaferMapDataset extends AbstractDataset { * @param maxChipX the wafer x-dimension. * @param maxChipY the wafer y-dimension. */ - public WaferMapDataset(int maxChipX, int maxChipY) { + public WaferMapDataset(/*@NonNegative*/ int maxChipX, /*@NonNegative*/ int maxChipY) { this(maxChipX, maxChipY, null); } @@ -95,7 +96,7 @@ public WaferMapDataset(int maxChipX, int maxChipY) { * @param maxChipY the wafer y-dimension. * @param chipSpace the space between chips. */ - public WaferMapDataset(int maxChipX, int maxChipY, Number chipSpace) { + public WaferMapDataset(/*@NonNegative*/ int maxChipX, /*@NonNegative*/ int maxChipY, Number chipSpace) { this.maxValue = new Double(Double.NEGATIVE_INFINITY); this.minValue = new Double(Double.POSITIVE_INFINITY); @@ -130,7 +131,7 @@ public void addValue(Number value, Comparable chipx, Comparable chipy) { * @param x the x-index. * @param y the y-index. */ - public void addValue(int v, int x, int y) { + public void addValue(int v, /*@NonNegative*/ int x, /*@NonNegative*/ int y) { setValue(new Double(v), new Integer(x), new Integer(y)); } @@ -156,7 +157,7 @@ public void setValue(Number value, Comparable chipx, Comparable chipy) { * * @return The number of unique values. */ - public int getUniqueValueCount() { + public /*@NonNegative*/ int getUniqueValueCount() { return getUniqueValues().size(); } @@ -187,7 +188,7 @@ public Set getUniqueValues() { * * @return The data value. */ - public Number getChipValue(int chipx, int chipy) { + public Number getChipValue(/*@NonNegative*/ int chipx, /*@NonNegative*/ int chipy) { return getChipValue(new Integer(chipx), new Integer(chipy)); } @@ -262,7 +263,7 @@ public Number getMinValue() { * * @return The number of chips in the x-dimension. */ - public int getMaxChipX() { + public /*@NonNegative*/ int getMaxChipX() { return this.maxChipX; } @@ -271,7 +272,7 @@ public int getMaxChipX() { * * @param maxChipX the number of chips in the x-dimension. */ - public void setMaxChipX(int maxChipX) { + public void setMaxChipX(/*@NonNegative*/ int maxChipX) { this.maxChipX = maxChipX; } @@ -280,7 +281,7 @@ public void setMaxChipX(int maxChipX) { * * @return The number of chips. */ - public int getMaxChipY() { + public /*@NonNegative*/ int getMaxChipY() { return this.maxChipY; } @@ -289,7 +290,7 @@ public int getMaxChipY() { * * @param maxChipY the number of chips. */ - public void setMaxChipY(int maxChipY) { + public void setMaxChipY(/*@NonNegative*/ int maxChipY) { this.maxChipY = maxChipY; } diff --git a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java index 05d0b2c68..e1b4158a2 100644 --- a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java +++ b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java @@ -424,7 +424,7 @@ public void executeQuery(Connection con, String query) * @see XYDataset */ @Override - public Number getX(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { + public Number getX(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { ArrayList row = (ArrayList) this.rows.get(itemIndex); return (Number) row.get(0); } @@ -440,7 +440,7 @@ public Number getX(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIn * @see XYDataset */ @Override - public Number getY(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIndex) { + public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { ArrayList row = (ArrayList) this.rows.get(itemIndex); return (Number) row.get(seriesIndex + 1); } @@ -455,7 +455,8 @@ public Number getY(/*@NonNegative*/ int seriesIndex, /*@NonNegative*/ int itemIn * @see XYDataset */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { + @SuppressWarnings("index") // establish repr. invariant + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { return this.rows.size(); } diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java index e1c0d398c..bc2baff89 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java @@ -51,6 +51,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -77,7 +78,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The mean for the specified series and item. */ - public Number getMeanValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getMeanValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the median-value for the specified series and item. @@ -87,7 +88,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The median-value for the specified series and item. */ - public Number getMedianValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getMedianValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the Q1 median-value for the specified series and item. @@ -97,7 +98,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The Q1 median-value for the specified series and item. */ - public Number getQ1Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getQ1Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the Q3 median-value for the specified series and item. @@ -107,7 +108,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The Q3 median-value for the specified series and item. */ - public Number getQ3Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getQ3Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the min-value for the specified series and item. @@ -117,7 +118,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The min-value for the specified series and item. */ - public Number getMinRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getMinRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the max-value for the specified series and item. @@ -127,7 +128,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The max-value for the specified series and item. */ - public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the minimum value which is not a farout. @@ -136,7 +137,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return A {@code Number} representing the maximum non-farout value. */ - public Number getMinOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getMinOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the maximum value which is not a farout, ie Q3 + (interquartile @@ -147,7 +148,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return A {@code Number} representing the maximum non-farout value. */ - public Number getMaxOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public Number getMaxOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns a list of outliers for the specified series and item. @@ -158,7 +159,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * @return The list of outliers for the specified series and item * (possibly {@code null}). */ - public List getOutliers(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public List getOutliers(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); /** * Returns the value used as the outlier coefficient. The outlier diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java index 2635cb177..85ea1bb40 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java @@ -55,11 +55,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ - -/*>>> -import org.checkerframework.checker.index.qual.NonNegative; - */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.util.List; import org.jfree.chart.util.ObjectUtils; @@ -85,23 +81,23 @@ public class DefaultBoxAndWhiskerCategoryDataset extends AbstractDataset private double minimumRangeValue; /** The row index for the cell that the minimum range value comes from. */ - private int minimumRangeValueRow; + private /*@GTENegativeOne*/ int minimumRangeValueRow; /** * The column index for the cell that the minimum range value comes from. */ - private int minimumRangeValueColumn; + private /*@GTENegativeOne*/ int minimumRangeValueColumn; /** The maximum range value. */ private double maximumRangeValue; /** The row index for the cell that the maximum range value comes from. */ - private int maximumRangeValueRow; + private /*@GTENegativeOne*/ int maximumRangeValueRow; /** * The column index for the cell that the maximum range value comes from. */ - private int maximumRangeValueColumn; + private /*@GTENegativeOne*/ int maximumRangeValueColumn; /** * Creates a new dataset. diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index bb4169ffa..186d5d8ab 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -59,6 +59,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -216,7 +217,7 @@ public void setFaroutCoefficient(double faroutCoefficient) { * @return The number of items in the specified series. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { return this.dates.size(); } @@ -274,7 +275,7 @@ public Comparable getSeriesKey(int i) { * * @return The item. */ - public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return (BoxAndWhiskerItem) this.items.get(item); } @@ -290,7 +291,7 @@ public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, /*@NonNegative*/ i * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Long(((Date) this.dates.get(item)).getTime()); } @@ -304,7 +305,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * * @return The x-value as a Date. */ - public Date getXDate(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return (Date) this.dates.get(item); } @@ -320,7 +321,7 @@ public Date getXDate(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getMeanValue(series, item); } @@ -333,7 +334,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The mean for the specified series and item. */ @Override - public Number getMeanValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getMeanValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -351,7 +352,7 @@ public Number getMeanValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The median-value for the specified series and item. */ @Override - public Number getMedianValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getMedianValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -369,7 +370,7 @@ public Number getMedianValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The Q1 median-value for the specified series and item. */ @Override - public Number getQ1Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getQ1Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -387,7 +388,7 @@ public Number getQ1Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The Q3 median-value for the specified series and item. */ @Override - public Number getQ3Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getQ3Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -405,7 +406,7 @@ public Number getQ3Value(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The min-value for the specified series and item. */ @Override - public Number getMinRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getMinRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -423,7 +424,7 @@ public Number getMinRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ i * @return The max-value for the specified series and item. */ @Override - public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -440,7 +441,7 @@ public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@NonNegative*/ i * @return A {@code Number} representing the maximum non-farout value. */ @Override - public Number getMinOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getMinOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -459,7 +460,7 @@ public Number getMinOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int it * @return A {@code Number} representing the maximum non-farout value. */ @Override - public Number getMaxOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getMaxOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -478,7 +479,7 @@ public Number getMaxOutlier(/*@NonNegative*/ int series, /*@NonNegative*/ int it * (possibly {@code null}). */ @Override - public List getOutliers(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public List getOutliers(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { List result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { diff --git a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java index c47e8db29..ca302931c 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java @@ -42,7 +42,6 @@ package org.jfree.data.statistics; /*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/org/jfree/data/statistics/HistogramBin.java b/src/main/java/org/jfree/data/statistics/HistogramBin.java index 6b6ec7804..1ff13d582 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramBin.java +++ b/src/main/java/org/jfree/data/statistics/HistogramBin.java @@ -43,6 +43,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; @@ -55,7 +56,7 @@ public class HistogramBin implements Cloneable, Serializable { private static final long serialVersionUID = 7614685080015589931L; /** The number of items in the bin. */ - private int count; + private /*@NonNegative*/ int count; /** The start boundary. */ private double startBoundary; @@ -84,7 +85,7 @@ public HistogramBin(double startBoundary, double endBoundary) { * * @return The item count. */ - public int getCount() { + public /*@NonNegative*/ int getCount() { return this.count; } diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index c6cc6a811..7c7926c4b 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -61,6 +61,9 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -135,7 +138,7 @@ public void setType(HistogramType type) { * @param values the values ({@code null} not permitted). * @param bins the number of bins (must be at least 1). */ - public void addSeries(Comparable key, double[] values, int bins) { + public void addSeries(Comparable key, double /*@MinLen(1)*/ [] values, /*@Positive*/ int bins) { // defer argument checking... double minimum = getMinimum(values); double maximum = getMaximum(values); @@ -154,7 +157,7 @@ public void addSeries(Comparable key, double[] values, int bins) { * @param minimum the lower bound of the bin range. * @param maximum the upper bound of the bin range. */ - public void addSeries(Comparable key, double[] values, int bins, + public void addSeries(Comparable key, double[] values, /*@Positive*/ int bins, double minimum, double maximum) { Args.nullNotPermitted(key, "key"); @@ -220,7 +223,7 @@ public void addSeries(Comparable key, double[] values, int bins, * * @return The minimum value. */ - private double getMinimum(double[] values) { + private double getMinimum(double /*@MinLen(1)*/ [] values) { if (values == null || values.length < 1) { throw new IllegalArgumentException( "Null or zero length 'values' argument."); @@ -242,7 +245,7 @@ private double getMinimum(double[] values) { * * @return The maximum value. */ - private double getMaximum(double[] values) { + private double getMaximum(double /*@MinLen(1)*/ [] values) { if (values == null || values.length < 1) { throw new IllegalArgumentException( "Null or zero length 'values' argument."); @@ -335,7 +338,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { return getBins(series).size(); } @@ -355,7 +358,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); double x = (bin.getStartBoundary() + bin.getEndBoundary()) / 2.; @@ -376,7 +379,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * specified range. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); double total = getTotal(series); @@ -409,7 +412,7 @@ else if (this.type == HistogramType.SCALE_AREA_TO_1) { * specified range. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); return new Double(bin.getStartBoundary()); @@ -428,7 +431,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * specified range. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); return new Double(bin.getEndBoundary()); @@ -449,7 +452,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * specified range. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -468,7 +471,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * specified range. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index 7f7f9d0f2..90436ea1a 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -45,6 +45,9 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -67,7 +70,7 @@ public abstract class Regression { * * @return The parameters. */ - public static double[] getOLSRegression(double[][] data) { + public static double /*@ArrayLen(2)*/ [] getOLSRegression(double /*@MinLen(2)*/ [] /*@MinLen(2)*/ [] data) { int n = data.length; if (n < 2) { @@ -111,7 +114,7 @@ public static double[] getOLSRegression(double[][] data) { * * @return The parameters. */ - public static double[] getOLSRegression(XYDataset data, /*@NonNegative*/ int series) { + public static double /*@ArrayLen(2)*/ [] getOLSRegression(XYDataset data, /*@NonNegative*/ int series) { int n = data.getItemCount(series); if (n < 2) { @@ -154,7 +157,7 @@ public static double[] getOLSRegression(XYDataset data, /*@NonNegative*/ int ser * * @return The parameters. */ - public static double[] getPowerRegression(double[][] data) { + public static double /*@ArrayLen(2)*/ [] getPowerRegression(double /*@MinLen(2)*/ [] /*@MinLen(2)*/ [] data) { int n = data.length; if (n < 2) { @@ -198,7 +201,7 @@ public static double[] getPowerRegression(double[][] data) { * * @return The parameters. */ - public static double[] getPowerRegression(XYDataset data, /*@NonNegative*/ int series) { + public static double /*@ArrayLen(2)*/ [] getPowerRegression(XYDataset data, /*@NonNegative*/ int series) { int n = data.getItemCount(series); if (n < 2) { @@ -251,8 +254,8 @@ public static double[] getPowerRegression(XYDataset data, /*@NonNegative*/ int s * * @since 1.0.14 */ - public static double[] getPolynomialRegression(XYDataset dataset, - int series, int order) { + public static double[] getPolynomialRegression(XYDataset dataset, + /*@NonNegative*/ int series, /*@Positive*/ int order) { Args.nullNotPermitted(dataset, "dataset"); int itemCount = dataset.getItemCount(series); if (itemCount < order + 1) { @@ -330,7 +333,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, * * @return The new matrix. */ - private static double[][] calculateSubMatrix(double[][] matrix){ + private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] matrix){ int equations = matrix.length; int coefficients = matrix[0].length; double[][] result = new double[equations - 1][coefficients - 1]; diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java index bf1bcc130..ef7d140d6 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java @@ -39,7 +39,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; @@ -72,7 +72,7 @@ public class SimpleHistogramBin implements Comparable, private boolean includeUpperBound; /** The item count. */ - private int itemCount; + private /*@NonNegative*/ int itemCount; /** * Creates a new bin. @@ -137,7 +137,7 @@ public double getUpperBound() { * * @param count the item count. */ - public void setItemCount(int count) { + public void setItemCount(/*@NonNegative*/ int count) { this.itemCount = count; } diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index 8b8513351..b833769ee 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -166,7 +167,8 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // establish repr. invariant + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { return this.bins.size(); } @@ -286,7 +288,7 @@ public void removeAllBins() { * @return The x-value (never {@code null}). */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getXValue(series, item)); } @@ -299,7 +301,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return (bin.getLowerBound() + bin.getUpperBound()) / 2.0; } @@ -313,7 +315,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The y-value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getYValue(series, item)); } @@ -328,7 +330,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @see #getAdjustForBinSize() */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); if (this.adjustForBinSize) { return bin.getItemCount() @@ -348,7 +350,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getStartXValue(series, item)); } @@ -362,7 +364,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The start x-value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return bin.getLowerBound(); } @@ -376,7 +378,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getEndXValue(series, item)); } @@ -390,7 +392,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The end x-value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return bin.getUpperBound(); } @@ -404,7 +406,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -418,7 +420,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The start y-value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getYValue(series, item); } @@ -431,7 +433,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @return The value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -445,7 +447,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The end y-value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getYValue(series, item); } diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index 8a4eb34b1..9b4f6948a 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -48,6 +48,9 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.util.ArrayList; import java.util.Collection; @@ -303,7 +306,7 @@ public static double calculateMedian(List values, int start, int end, * * @return The standard deviation of a set of numbers. */ - public static double getStdDev(Number[] data) { + public static double getStdDev(Number /*@MinLen(1)*/ [] data) { Args.nullNotPermitted(data, "data"); if (data.length == 0) { throw new IllegalArgumentException("Zero length 'data' array."); @@ -327,7 +330,7 @@ public static double getStdDev(Number[] data) { * * @return A double array with the intercept in [0] and the slope in [1]. */ - public static double[] getLinearFit(Number[] xData, Number[] yData) { + public static double /*@ArrayLen(2)*/ [] getLinearFit(Number /*@SameLen("#2")*/ [] xData, Number /*@SameLen("#1")*/ [] yData) { Args.nullNotPermitted(xData, "xData"); Args.nullNotPermitted(yData, "yData"); @@ -354,7 +357,7 @@ public static double[] getLinearFit(Number[] xData, Number[] yData) { * * @return The slope. */ - public static double getSlope(Number[] xData, Number[] yData) { + public static double getSlope(Number /*@SameLen("#2")*/ [] xData, Number /*@SameLen("#1")*/ [] yData) { Args.nullNotPermitted(xData, "xData"); Args.nullNotPermitted(yData, "yData"); if (xData.length != yData.length) { @@ -396,7 +399,7 @@ public static double getSlope(Number[] xData, Number[] yData) { * * @return The correlation. */ - public static double getCorrelation(Number[] data1, Number[] data2) { + public static double getCorrelation(Number /*@SameLen("#2")*/ [] data1, Number /*@SameLen("#1")*/ [] data2) { Args.nullNotPermitted(data1, "data1"); Args.nullNotPermitted(data2, "data2"); if (data1.length != data2.length) { @@ -439,8 +442,8 @@ public static double getCorrelation(Number[] data1, Number[] data2) { * @return A double[][] the length of the data set in the first dimension, * with two doubles for x and y in the second dimension */ - public static double[][] getMovingAverage(Number[] xData, Number[] yData, - int period) { + public static double[] /*@ArrayLen(2)*/ [] getMovingAverage(Number /*@SameLen("#2")*/ [] xData, Number /*@SameLen("#1")*/ [] yData, + /*@IndexFor("#1")*/ int period) { // check arguments... if (xData.length != yData.length) { diff --git a/src/main/java/org/jfree/data/time/Day.java b/src/main/java/org/jfree/data/time/Day.java index fd31a2361..d0ddb1604 100644 --- a/src/main/java/org/jfree/data/time/Day.java +++ b/src/main/java/org/jfree/data/time/Day.java @@ -64,6 +64,8 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.text.DateFormat; @@ -193,7 +195,7 @@ public SerialDate getSerialDate() { * * @return The year. */ - public int getYear() { + public /*@IntRange(from=1900, to=9999)*/ int getYear() { return this.serialDate.getYYYY(); } @@ -202,7 +204,7 @@ public int getYear() { * * @return The month. */ - public int getMonth() { + public /*@IntRange(from=1, to=12)*/ int getMonth() { return this.serialDate.getMonth(); } @@ -211,7 +213,7 @@ public int getMonth() { * * @return The day of the month. */ - public int getDayOfMonth() { + public /*@IntRange(from = 1, to = 31)*/ int getDayOfMonth() { return this.serialDate.getDayOfMonth(); } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 681345b11..082b0fe7c 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -61,6 +61,9 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -108,22 +111,22 @@ public class DynamicTimeSeriesCollection extends AbstractIntervalXYDataset public static final int END = 2; /** The maximum number of items for each series (can be overridden). */ - private int maximumItemCount = 2000; // an arbitrary safe default value + private /*@NonNegative*/ int maximumItemCount = 2000; // an arbitrary safe default value /** The history count. */ - protected int historyCount; + protected /*@IndexOrHigh("this.pointsInTime")*/ int historyCount; /** Storage for the series keys. */ - private Comparable[] seriesKeys; + private Comparable /*@SameLen("this.valueHistory")*/ [] seriesKeys; /** The time period class - barely used, and could be removed (DG). */ private Class timePeriodClass = Minute.class; // default value; /** Storage for the x-values. */ - protected RegularTimePeriod[] pointsInTime; + protected RegularTimePeriod /*@MinLen(1)*/ [] pointsInTime; /** The number of series. */ - private int seriesCount; + private /*@NonNegative*/ int seriesCount; /** * A wrapper for a fixed array of float values. @@ -131,7 +134,7 @@ public class DynamicTimeSeriesCollection extends AbstractIntervalXYDataset protected class ValueSequence { /** Storage for the float values. */ - float[] dataPoints; + float /*@SameLen("this")*/ [] dataPoints; /** * Default constructor: @@ -145,7 +148,7 @@ public ValueSequence() { * * @param length the length. */ - public ValueSequence(int length) { + public ValueSequence(/*@NonNegative*/ int length) { this.dataPoints = new float[length]; for (int i = 0; i < length; i++) { this.dataPoints[i] = 0.0f; @@ -158,7 +161,7 @@ public ValueSequence(int length) { * @param index the index. * @param value the value. */ - public void enterData(/*@NonNegative*/ int index, float value) { + public void enterData(/*@IndexFor("this")*/ int index, float value) { this.dataPoints[index] = value; } @@ -169,13 +172,13 @@ public void enterData(/*@NonNegative*/ int index, float value) { * * @return The value. */ - public float getData(/*@NonNegative*/ int index) { + public float getData(/*@IndexFor("this")*/ int index) { return this.dataPoints[index]; } } /** An array for storing the objects that represent each series. */ - protected ValueSequence[] valueHistory; + protected ValueSequence /*@SameLen("this.seriesKeys")*/ [] valueHistory; /** A working calendar (to recycle) */ protected Calendar workingCalendar; @@ -194,10 +197,10 @@ public float getData(/*@NonNegative*/ int index) { private boolean domainIsPointsInTime; /** index for mapping: points to the oldest valid time and data. */ - private int oldestAt; // as a class variable, initializes == 0 + private /*@IndexFor("this.pointsInTime")*/ int oldestAt; // as a class variable, initializes == 0 /** Index of the newest data item. */ - private int newestAt; + private /*@IndexFor("this.pointsInTime")*/ int newestAt; // cached values used for interface DomainInfo: @@ -232,7 +235,7 @@ public float getData(/*@NonNegative*/ int index) { * @param nSeries the number of series to be accommodated. * @param nMoments the number of TimePeriods to be spanned. */ - public DynamicTimeSeriesCollection(int nSeries, int nMoments) { + public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments) { this(nSeries, nMoments, new Millisecond(), TimeZone.getDefault()); this.newestAt = nMoments - 1; } @@ -244,7 +247,7 @@ public DynamicTimeSeriesCollection(int nSeries, int nMoments) { * @param nMoments the number of TimePeriods to be spanned * @param zone the timezone. */ - public DynamicTimeSeriesCollection(int nSeries, int nMoments, + public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments, TimeZone zone) { this(nSeries, nMoments, new Millisecond(), zone); this.newestAt = nMoments - 1; @@ -257,7 +260,7 @@ public DynamicTimeSeriesCollection(int nSeries, int nMoments, * @param nMoments the number of items per series. * @param timeSample a time period sample. */ - public DynamicTimeSeriesCollection(int nSeries, int nMoments, + public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments, RegularTimePeriod timeSample) { this(nSeries, nMoments, timeSample, TimeZone.getDefault()); } @@ -270,7 +273,7 @@ public DynamicTimeSeriesCollection(int nSeries, int nMoments, * @param timeSample a time period sample. * @param zone the time zone. */ - public DynamicTimeSeriesCollection(int nSeries, int nMoments, + public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments, RegularTimePeriod timeSample, TimeZone zone) { // the first initialization must precede creation of the ValueSet array: @@ -281,7 +284,6 @@ public DynamicTimeSeriesCollection(int nSeries, int nMoments, for (int i = 0; i < nSeries; i++) { this.seriesKeys[i] = ""; } - this.newestAt = nMoments - 1; this.valueHistory = new ValueSequence[nSeries]; this.timePeriodClass = timeSample.getClass(); @@ -295,6 +297,9 @@ public DynamicTimeSeriesCollection(int nSeries, int nMoments, } else if (this.timePeriodClass == Hour.class) { this.pointsInTime = new Hour[nMoments]; } + + this.newestAt = nMoments - 1; + /// .. etc.... this.workingCalendar = Calendar.getInstance(zone); this.position = START; @@ -321,6 +326,7 @@ public synchronized long setTimeBase(RegularTimePeriod start) { } long oldestL = this.pointsInTime[0].getFirstMillisecond( this.workingCalendar); + @SuppressWarnings("index") // This seems like a bug to me. There's nothing in the docs for this class that suggests that pointsInTime must have more than 1 element long nextL = this.pointsInTime[1].getFirstMillisecond( this.workingCalendar); this.deltaTime = nextL - oldestL; @@ -377,7 +383,7 @@ public void setPosition(int position) { * Use this as-is during setup only, or add the synchronized keyword around * the copy loop. */ - public void addSeries(float[] values, int seriesNumber, + public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, Comparable seriesKey) { invalidateRangeInfo(); @@ -428,7 +434,7 @@ public void addSeries(float[] values, int seriesNumber, * @param seriesNumber the series. * @param key the new key. */ - public void setSeriesKey(int seriesNumber, Comparable key) { + public void setSeriesKey(/*@IndexFor("this.seriesKeys")*/ int seriesNumber, Comparable key) { this.seriesKeys[seriesNumber] = key; } @@ -439,7 +445,7 @@ public void setSeriesKey(int seriesNumber, Comparable key) { * @param index ??. * @param value the value. */ - public void addValue(int seriesNumber, /*@NonNegative*/ int index, float value) { + public void addValue(/*@NonNegative*/ int seriesNumber, /*@NonNegative*/ int index, float value) { invalidateRangeInfo(); if (seriesNumber >= this.valueHistory.length) { throw new IllegalArgumentException( @@ -480,7 +486,7 @@ public void addValue(int seriesNumber, /*@NonNegative*/ int index, float value) * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, // so ignore argument: return this.historyCount; } @@ -494,7 +500,7 @@ public void addValue(int seriesNumber, /*@NonNegative*/ int index, float value) * * @return The translated index. */ - protected int translateGet(int toFetch) { + protected /*@NonNegative*/ int translateGet(/*@NonNegative*/ int toFetch) { if (this.oldestAt == 0) { return toFetch; // no translation needed } @@ -513,7 +519,7 @@ protected int translateGet(int toFetch) { * * @return The offset. */ - public int offsetFromNewest(int delta) { + public /*@IndexFor("this.pointsInTime")*/ int offsetFromNewest(int delta) { return wrapOffset(this.newestAt + delta); } @@ -524,7 +530,7 @@ public int offsetFromNewest(int delta) { * * @return The offset. */ - public int offsetFromOldest(int delta) { + public /*@IndexFor("this.pointsInTime")*/ int offsetFromOldest(int delta) { return wrapOffset(this.oldestAt + delta); } @@ -535,7 +541,8 @@ public int offsetFromOldest(int delta) { * * @return The offset. */ - protected int wrapOffset(int protoIndex) { + @SuppressWarnings("index") // this method assumes that protoIndex will be within an absolute value of an actual index + protected /*@IndexFor("this.pointsInTime")*/ int wrapOffset(int protoIndex) { int tmp = protoIndex; if (tmp >= this.historyCount) { tmp -= this.historyCount; diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index 38a75a058..b8e3489c1 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -219,7 +219,7 @@ public void removeSeries(/*@NonNegative*/ int index) { * @return The number of items in the specified series. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index bf087a785..5d9f912d3 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -403,7 +403,7 @@ public void removeAllSeries() { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index a3f94c23d..2119f5795 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -326,7 +326,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { * @return The number of items within the series. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { return getItemCount(); } diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index 9d7b26f4b..5e859cd6e 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -43,6 +43,7 @@ */ package org.jfree.data.time.ohlc; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -178,7 +179,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public /*@NonNegative*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -213,7 +214,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); RegularTimePeriod period = di.getPeriod(); @@ -229,7 +230,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getXValue(series, item)); } @@ -242,7 +243,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return new Double(di.getYValue()); @@ -257,7 +258,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The open-value. */ @Override - public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getOpenValue(); @@ -272,7 +273,7 @@ public double getOpenValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The open-value. */ @Override - public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getOpenValue(series, item)); } @@ -285,7 +286,7 @@ public Number getOpen(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The close-value. */ @Override - public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getCloseValue(); @@ -300,7 +301,7 @@ public double getCloseValue(/*@NonNegative*/ int series, /*@NonNegative*/ int it * @return The close-value. */ @Override - public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getCloseValue(series, item)); } @@ -313,7 +314,7 @@ public Number getClose(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The high-value. */ @Override - public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getHighValue(); @@ -328,7 +329,7 @@ public double getHighValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The high-value. */ @Override - public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getHighValue(series, item)); } @@ -341,7 +342,7 @@ public Number getHigh(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The low-value. */ @Override - public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getLowValue(); @@ -356,7 +357,7 @@ public double getLowValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item * @return The low-value. */ @Override - public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getLowValue(series, item)); } @@ -370,7 +371,7 @@ public Number getLow(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return {@code null}. */ @Override - public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return null; } @@ -384,7 +385,7 @@ public Number getVolume(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return {@code Double.NaN}. */ @Override - public double getVolumeValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return Double.NaN; } diff --git a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java index 72a21755c..02d355c78 100644 --- a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java +++ b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java @@ -428,7 +428,7 @@ public Object clone() throws CloneNotSupportedException { } @Override - public Number getStartValue(/*@NonNegative*/ int series, int category) { + public Number getStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(series, category); if (item == null) { @@ -448,7 +448,7 @@ public Number getStartValue(Comparable series, Comparable category) { } @Override - public Number getEndValue(/*@NonNegative*/ int series, int category) { + public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(series, category); if (item == null) { From 3dbc04816bbb7748e7c4883f3bb20b4b2e7cc8ba Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Mon, 18 Dec 2017 18:06:22 -0800 Subject: [PATCH 13/79] improve annotations on data package. All classes now annotated; reducing remaining errors --- .../renderer/xy/CyclicXYItemRenderer.java | 2 +- .../jfree/data/ComparableObjectSeries.java | 8 +- src/main/java/org/jfree/data/DataUtils.java | 11 +- .../org/jfree/data/DefaultKeyedValues.java | 6 +- .../org/jfree/data/DefaultKeyedValues2D.java | 6 +- .../java/org/jfree/data/KeyToGroupMap.java | 4 +- .../DefaultIntervalCategoryDataset.java | 33 ++++-- .../data/category/SlidingCategoryDataset.java | 8 +- .../gantt/SlidingGanttCategoryDataset.java | 36 ++++-- .../data/gantt/TaskSeriesCollection.java | 21 ++-- .../org/jfree/data/general/DatasetUtils.java | 110 ++++++++++++------ .../data/general/DefaultHeatMapDataset.java | 20 ++-- .../jfree/data/general/HeatMapDataset.java | 4 +- src/main/java/org/jfree/data/io/CSV.java | 18 ++- .../org/jfree/data/jdbc/JDBCXYDataset.java | 9 +- .../DefaultBoxAndWhiskerXYDataset.java | 4 +- .../data/statistics/HistogramDataset.java | 9 +- .../org/jfree/data/statistics/Regression.java | 23 ++-- .../statistics/SimpleHistogramDataset.java | 4 +- .../org/jfree/data/statistics/Statistics.java | 15 ++- src/main/java/org/jfree/data/time/Day.java | 10 +- .../time/DynamicTimeSeriesCollection.java | 53 +++++---- src/main/java/org/jfree/data/time/Hour.java | 13 ++- .../java/org/jfree/data/time/Millisecond.java | 7 +- src/main/java/org/jfree/data/time/Minute.java | 5 +- src/main/java/org/jfree/data/time/Month.java | 9 +- .../org/jfree/data/time/MovingAverage.java | 8 +- src/main/java/org/jfree/data/time/Second.java | 7 +- .../org/jfree/data/time/TimePeriodValues.java | 3 +- .../data/time/TimePeriodValuesCollection.java | 17 +-- .../java/org/jfree/data/time/TimeSeries.java | 15 +-- .../jfree/data/time/TimeSeriesCollection.java | 22 ++-- .../jfree/data/time/TimeTableXYDataset.java | 22 ++-- src/main/java/org/jfree/data/time/Week.java | 13 ++- src/main/java/org/jfree/data/time/Year.java | 7 +- .../data/time/ohlc/OHLCSeriesCollection.java | 4 +- .../java/org/jfree/data/xml/KeyHandler.java | 5 +- .../java/org/jfree/data/xml/RootHandler.java | 5 +- .../java/org/jfree/data/xml/ValueHandler.java | 5 +- src/main/java/org/jfree/data/xy/XYSeries.java | 4 +- .../java/org/jfree/chart/GanttChartTest.java | 2 +- 41 files changed, 372 insertions(+), 215 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 7c0b9654a..3f43850a8 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -369,7 +369,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.x.length; } diff --git a/src/main/java/org/jfree/data/ComparableObjectSeries.java b/src/main/java/org/jfree/data/ComparableObjectSeries.java index 7b10c263a..8a4a1a463 100644 --- a/src/main/java/org/jfree/data/ComparableObjectSeries.java +++ b/src/main/java/org/jfree/data/ComparableObjectSeries.java @@ -159,7 +159,7 @@ public boolean getAllowDuplicateXValues() { * * @param maximum the maximum number of items for the series. */ - public void setMaximumItemCount(int maximum) { + public void setMaximumItemCount(/*@NonNegative*/ int maximum) { this.maximumItemCount = maximum; boolean dataRemoved = false; while (this.data.size() > maximum) { @@ -218,7 +218,8 @@ protected void add(ComparableObjectItem item, boolean notify) { Args.nullNotPermitted(item, "item"); if (this.autoSort) { - int index = Collections.binarySearch(this.data, item); + @SuppressWarnings("index") // binary search on list + /*@SearchIndexFor("this.data")*/ int index = Collections.binarySearch(this.data, item); if (index < 0) { this.data.add(-index - 1, item); } @@ -271,7 +272,7 @@ protected void add(ComparableObjectItem item, boolean notify) { * * @return The index. */ - public /*@GTENegativeOne*/ int indexOf(Comparable x) { + public int indexOf(Comparable x) { if (this.autoSort) { return Collections.binarySearch(this.data, new ComparableObjectItem( x, null)); @@ -382,6 +383,7 @@ protected ComparableObjectItem remove(/*@NonNegative*/ int index) { * @return The item removed. */ + @SuppressWarnings("index") // method precondition is that this element is in the list, so indexOf will return NN public ComparableObjectItem remove(Comparable x) { return remove(indexOf(x)); } diff --git a/src/main/java/org/jfree/data/DataUtils.java b/src/main/java/org/jfree/data/DataUtils.java index ac97338f0..8060382fb 100644 --- a/src/main/java/org/jfree/data/DataUtils.java +++ b/src/main/java/org/jfree/data/DataUtils.java @@ -47,7 +47,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Arrays; import org.jfree.chart.util.Args; @@ -99,7 +100,7 @@ public static boolean equal(double[][] a, double[][] b) { * * @since 1.0.13 */ - public static double[][] clone(double[][] source) { + public static double /*@SameLen("#1")*/ [][] clone(double[][] source) { Args.nullNotPermitted(source, "source"); double[][] clone = new double[source.length][]; for (int i = 0; i < source.length; i++) { @@ -147,7 +148,7 @@ public static double calculateColumnTotal(Values2D data, /*@NonNegative*/ int co * @since 1.0.13 */ public static double calculateColumnTotal(Values2D data, /*@NonNegative*/ int column, - int[] validRows) { + /*@NonNegative*/ int[] validRows) { Args.nullNotPermitted(data, "data"); double total = 0.0; int rowCount = data.getRowCount(); @@ -198,7 +199,7 @@ public static double calculateRowTotal(Values2D data, /*@NonNegative*/ int row) * @since 1.0.13 */ public static double calculateRowTotal(Values2D data, /*@NonNegative*/ int row, - int[] validCols) { + /*@NonNegative*/ int[] validCols) { Args.nullNotPermitted(data, "data"); double total = 0.0; int colCount = data.getColumnCount(); @@ -239,7 +240,7 @@ public static Number[] createNumberArray(double[] data) { * * @return An array of {@code double}. */ - public static Number[][] createNumberArray2D(double[][] data) { + public static Number /*@SameLen("#1")*/ [][] createNumberArray2D(double[][] data) { Args.nullNotPermitted(data, "data"); int l1 = data.length; Number[][] result = new Number[l1][]; diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues.java b/src/main/java/org/jfree/data/DefaultKeyedValues.java index d6725f7b8..ac35f8156 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues.java @@ -59,7 +59,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -158,7 +158,9 @@ public Comparable getKey(/*@NonNegative*/ int index) { if (i == null) { return -1; // key not found } - return i.intValue(); + @SuppressWarnings("index") // the map only contains indices, so if the value is in the map, then result is non-negative + /*@NonNegative*/ int result = i.intValue(); + return result; } /** diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java index 151004f2f..6beefdc1d 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java @@ -57,7 +57,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -186,6 +186,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getColumnIndex(Comparable) */ @Override + @SuppressWarnings("index") // I think this is a bug. Binary search can return a search index, inconsistent with docs on this method public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { Args.nullNotPermitted(key, "key"); if (this.sortRowKeys) { @@ -362,7 +363,8 @@ public void removeValue(Comparable rowKey, Comparable columnKey) { // 1. check whether the row is now empty. boolean allNull = true; - int rowIndex = getRowIndex(rowKey); + @SuppressWarnings("index") // this method assumes that the rowKey is valid, which can't be checked b/c it's a list + /*@NonNegative*/ int rowIndex = getRowIndex(rowKey); DefaultKeyedValues row = (DefaultKeyedValues) this.rows.get(rowIndex); for (int item = 0, itemCount = row.getItemCount(); item < itemCount; diff --git a/src/main/java/org/jfree/data/KeyToGroupMap.java b/src/main/java/org/jfree/data/KeyToGroupMap.java index a6176e012..7b9cec628 100644 --- a/src/main/java/org/jfree/data/KeyToGroupMap.java +++ b/src/main/java/org/jfree/data/KeyToGroupMap.java @@ -44,7 +44,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.lang.reflect.Method; @@ -100,7 +100,7 @@ public KeyToGroupMap(Comparable defaultGroup) { * * @return The number of groups in the map. */ - public int getGroupCount() { + public /*@Positive*/ int getGroupCount() { return this.groups.size() + 1; } diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index 1b7c536a9..bbf46cf60 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -61,6 +61,7 @@ import org.jfree.chart.util.Args; import org.jfree.chart.util.ResourceBundleWrapper; +import org.jfree.data.ComparableObjectSeries; import org.jfree.data.DataUtils; import org.jfree.data.UnknownKeyException; import org.jfree.data.general.AbstractSeriesDataset; @@ -172,6 +173,14 @@ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, } if (seriesCount > 0) { + @SuppressWarnings({"index", "value"}) // seriesCount is the length of starts, so checking it against zero implies minlen(1) + Number /*@MinLen(1)*/ [][] starts1 = starts; + starts = starts1; + + @SuppressWarnings({"index", "value"}) // seriesCount is the length of starts, so checking it against zero implies minlen(1) + Number /*@MinLen(1)*/ [][] ends1 = ends; + ends = ends1; + // set up the series names... if (seriesKeys != null) { @@ -273,7 +282,9 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { if ((series >= getSeriesCount()) || (series < 0)) { throw new IllegalArgumentException("No such series : " + series); } - return this.seriesKeys[series]; + @SuppressWarnings("index") // getSeriesCount() should be annotated as LengthOf, but because most implementations of this interface implement the series with a list it isn't + Comparable result = this.seriesKeys[series]; + return result; } /** @@ -306,7 +317,9 @@ public void setSeriesKeys(Comparable[] seriesKeys) { int result = 0; if (this.startData != null) { if (getSeriesCount() > 0) { - result = this.startData[0].length; + @SuppressWarnings("index") // getSeriesCount is the length of startData, but can't be annotated that way b/c implementation detail + int newResult = this.startData[0].length; + result = newResult; } } return result; @@ -455,8 +468,9 @@ public Number getStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ca } // fetch the value... - return this.startData[series][category]; - + @SuppressWarnings("index") // that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. + Number result = this.startData[series][category]; + return result; } /** @@ -505,8 +519,9 @@ public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int cate "DefaultIntervalCategoryDataset.getValue(): " + "category index out of range."); } - - return this.endData[series][category]; + @SuppressWarnings("index") // that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. + Number result = this.endData[series][category]; + return result; } /** @@ -537,7 +552,8 @@ public void setStartValue(/*@NonNegative*/ int series, Comparable category, Numb } // update the data... - this.startData[series][categoryIndex] = value; + @SuppressWarnings("index") // that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. + Number tmp = (this.startData[series][categoryIndex] = value); fireDatasetChanged(); } @@ -570,7 +586,8 @@ public void setEndValue(/*@NonNegative*/ int series, Comparable category, Number } // update the data... - this.endData[series][categoryIndex] = value; + @SuppressWarnings("index") // that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. + Number tmp = (this.endData[series][categoryIndex] = value); fireDatasetChanged(); } diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index caeefd4e7..18c5af0b0 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -175,7 +175,9 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { - return index - this.firstCategoryIndex; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 index >= this.firstCategoryIndex is a condition to this block + /*@NonNegative*/ int result = index - this.firstCategoryIndex; + return result; } return -1; // we didn't find the key } @@ -262,7 +264,9 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getValue(r, c + this.firstCategoryIndex); + @SuppressWarnings("index") // I think this is a bug. Why isn't r checked the way c is checked? + Number result = this.underlying.getValue(r, c + this.firstCategoryIndex); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index 6c61a8089..6f2605761 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -177,7 +177,9 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { - return index - this.firstCategoryIndex; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 + /*@NonNegative*/ int result = index - this.firstCategoryIndex; + return result; } return -1; // we didn't find the key } @@ -264,7 +266,9 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getValue(r, c + this.firstCategoryIndex); + @SuppressWarnings("index") // I think this is a bug. Why isn't r checked the same way that c is checked? + Number result = this.underlying.getValue(r, c + this.firstCategoryIndex); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); @@ -323,8 +327,10 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getPercentComplete(r, + @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + Number result = this.underlying.getPercentComplete(r, c + this.firstCategoryIndex); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); @@ -348,8 +354,10 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey, int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getPercentComplete(r, + @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + Number result = this.underlying.getPercentComplete(r, c + this.firstCategoryIndex, subinterval); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); @@ -373,8 +381,10 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getEndValue(r, + @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + Number result = this.underlying.getEndValue(r, c + this.firstCategoryIndex, subinterval); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); @@ -446,8 +456,10 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getStartValue(r, + @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + Number result = this.underlying.getStartValue(r, c + this.firstCategoryIndex, subinterval); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); @@ -486,8 +498,10 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getSubIntervalCount(r, + @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + int result = this.underlying.getSubIntervalCount(r, c + this.firstCategoryIndex); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); @@ -525,8 +539,10 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getStartValue(r, + @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + Number result = this.underlying.getStartValue(r, c + this.firstCategoryIndex); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); @@ -564,7 +580,9 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - return this.underlying.getEndValue(r, c + this.firstCategoryIndex); + @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + Number result = this.underlying.getEndValue(r, c + this.firstCategoryIndex); + return result; } else { throw new UnknownKeyException("Unknown columnKey: " + columnKey); diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 05b8821e8..6f9840734 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -375,7 +375,8 @@ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { @Override public Number getStartValue(Comparable rowKey, Comparable columnKey) { Number result = null; - int row = getRowIndex(rowKey); + @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -414,7 +415,8 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum @Override public Number getEndValue(Comparable rowKey, Comparable columnKey) { Number result = null; - int row = getRowIndex(rowKey); + @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -467,7 +469,8 @@ public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int @Override public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { Number result = null; - int row = getRowIndex(rowKey); + @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -502,7 +505,8 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { @Override public /*@NonNegative*/ int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { int result = 0; - int row = getRowIndex(rowKey); + @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -540,7 +544,8 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum public Number getStartValue(Comparable rowKey, Comparable columnKey, /*@NonNegative*/ int subinterval) { Number result = null; - int row = getRowIndex(rowKey); + @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -582,7 +587,8 @@ public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, public Number getEndValue(Comparable rowKey, Comparable columnKey, /*@NonNegative*/ int subinterval) { Number result = null; - int row = getRowIndex(rowKey); + @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -624,7 +630,8 @@ public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int public Number getPercentComplete(Comparable rowKey, Comparable columnKey, /*@NonNegative*/ int subinterval) { Number result = null; - int row = getRowIndex(rowKey); + @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index fdeb5cb8a..2f494afab 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -220,7 +220,8 @@ public static double calculatePieDatasetTotal(PieDataset dataset) { */ public static PieDataset createPieDatasetForRow(CategoryDataset dataset, Comparable rowKey) { - int row = dataset.getRowIndex(rowKey); + @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int row = dataset.getRowIndex(rowKey); return createPieDatasetForRow(dataset, row); } @@ -255,7 +256,8 @@ public static PieDataset createPieDatasetForRow(CategoryDataset dataset, */ public static PieDataset createPieDatasetForColumn(CategoryDataset dataset, Comparable columnKey) { - int column = dataset.getColumnIndex(columnKey); + @SuppressWarnings("index") // columnKey is being assumed to be a valid key. It should probably be checked - this is a bug + /*@NonNegative*/ int column = dataset.getColumnIndex(columnKey); return createPieDatasetForColumn(dataset, column); } @@ -740,7 +742,7 @@ public static Range iterateDomainBounds(XYDataset dataset, if (includeInterval && dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; for (int series = 0; series < seriesCount; series++) { - int itemCount = dataset.getItemCount(series); + int itemCount = intervalXYData.getItemCount(series); for (int item = 0; item < itemCount; item++) { double value = intervalXYData.getXValue(series, item); lvalue = intervalXYData.getStartXValue(series, item); @@ -1027,7 +1029,8 @@ public static Range iterateToFindRangeBounds(CategoryDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.getRowIndex(seriesKey); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); int itemCount = dataset.getColumnCount(); for (int item = 0; item < itemCount; item++) { Number lvalue = bx.getMinRegularValue(series, item); @@ -1056,7 +1059,8 @@ else if (includeInterval Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.getRowIndex(seriesKey); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { lvalue = icd.getStartValue(series, column); uvalue = icd.getEndValue(series, column); @@ -1078,7 +1082,8 @@ else if (includeInterval Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.getRowIndex(seriesKey); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { List values = mvcd.getValues(series, column); Iterator valueIterator = values.iterator(); @@ -1104,7 +1109,8 @@ else if (includeInterval Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.getRowIndex(seriesKey); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { Number meanN = scd.getMeanValue(series, column); if (meanN != null) { @@ -1130,7 +1136,8 @@ else if (includeInterval Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.getRowIndex(seriesKey); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { Number value = dataset.getValue(series, column); if (value != null) { @@ -1189,7 +1196,7 @@ public static Range iterateRangeBounds(XYDataset dataset, // handle special case of IntervalXYDataset IntervalXYDataset ixyd = (IntervalXYDataset) dataset; for (int series = 0; series < seriesCount; series++) { - int itemCount = dataset.getItemCount(series); + int itemCount = ixyd.getItemCount(series); for (int item = 0; item < itemCount; item++) { double value = ixyd.getYValue(series, item); double lvalue = ixyd.getStartYValue(series, item); @@ -1213,7 +1220,7 @@ else if (includeInterval && dataset instanceof OHLCDataset) { // handle special case of OHLCDataset OHLCDataset ohlc = (OHLCDataset) dataset; for (int series = 0; series < seriesCount; series++) { - int itemCount = dataset.getItemCount(series); + int itemCount = ohlc.getItemCount(series); for (int item = 0; item < itemCount; item++) { double lvalue = ohlc.getLowValue(series, item); double uvalue = ohlc.getHighValue(series, item); @@ -1377,8 +1384,9 @@ public static Range iterateToFindDomainBounds(XYDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.indexOf(seriesKey); - int itemCount = dataset.getItemCount(series); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + int itemCount = ixyd.getItemCount(series); for (int item = 0; item < itemCount; item++) { double xvalue = ixyd.getXValue(series, item); double lvalue = ixyd.getStartXValue(series, item); @@ -1400,7 +1408,8 @@ public static Range iterateToFindDomainBounds(XYDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.indexOf(seriesKey); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = dataset.getXValue(series, item); @@ -1453,8 +1462,9 @@ public static Range iterateToFindRangeBounds(XYDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.indexOf(seriesKey); - int itemCount = dataset.getItemCount(series); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + int itemCount = ohlc.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = ohlc.getXValue(series, item); if (xRange.contains(x)) { @@ -1476,8 +1486,9 @@ else if (includeInterval && dataset instanceof BoxAndWhiskerXYDataset) { Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.indexOf(seriesKey); - int itemCount = dataset.getItemCount(series); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + int itemCount = bx.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = bx.getXValue(series, item); if (xRange.contains(x)) { @@ -1499,8 +1510,9 @@ else if (includeInterval && dataset instanceof IntervalXYDataset) { Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.indexOf(seriesKey); - int itemCount = dataset.getItemCount(series); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + int itemCount = ixyd.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = ixyd.getXValue(series, item); if (xRange.contains(x)) { @@ -1525,7 +1537,8 @@ else if (includeInterval && dataset instanceof IntervalXYDataset) { Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.indexOf(seriesKey); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = dataset.getXValue(series, item); @@ -1573,7 +1586,8 @@ public static Range iterateToFindZBounds(XYZDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - int series = dataset.indexOf(seriesKey); + @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = dataset.getXValue(series, item); @@ -1626,7 +1640,9 @@ public static Number findMinimumDomainValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - value = intervalXYData.getStartXValue(series, item); + @SuppressWarnings("index") // intervalXyData and dataset are the same object + double valueTmp = intervalXYData.getStartXValue(series, item); + value = valueTmp; } else { value = dataset.getXValue(series, item); @@ -1681,7 +1697,9 @@ public static Number findMaximumDomainValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - value = intervalXYData.getEndXValue(series, item); + @SuppressWarnings("index") // intervalXyData and dataset are the same object + double valueTmp = intervalXYData.getEndXValue(series, item); + value = valueTmp; } else { value = dataset.getXValue(series, item); @@ -1733,7 +1751,7 @@ public static Number findMinimumRangeValue(CategoryDataset dataset) { if (dataset instanceof IntervalCategoryDataset) { IntervalCategoryDataset icd = (IntervalCategoryDataset) dataset; - value = icd.getStartValue(series, item); + Number valueTmp = icd.getStartValue(series, item); } else { value = dataset.getValue(series, item); @@ -1787,11 +1805,15 @@ public static Number findMinimumRangeValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - value = intervalXYData.getStartYValue(series, item); + @SuppressWarnings("index") // intervalXyData and dataset are the same object + double valueTmp = intervalXYData.getStartYValue(series, item); + value = valueTmp; } else if (dataset instanceof OHLCDataset) { OHLCDataset highLowData = (OHLCDataset) dataset; - value = highLowData.getLowValue(series, item); + @SuppressWarnings("index") // highlowdata and dataset are the same object + double valueTmp = highLowData.getLowValue(series, item); + value = valueTmp; } else { value = dataset.getYValue(series, item); @@ -1900,11 +1922,15 @@ public static Number findMaximumRangeValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - value = intervalXYData.getEndYValue(series, item); + @SuppressWarnings("index") // intervalXyData and dataset are the same object + double valueTmp = intervalXYData.getEndYValue(series, item); + value = valueTmp; } else if (dataset instanceof OHLCDataset) { OHLCDataset highLowData = (OHLCDataset) dataset; - value = highLowData.getHighValue(series, item); + @SuppressWarnings("index") // highlowdata and dataset are the same object + double valueTmp = highLowData.getHighValue(series, item); + value = valueTmp; } else { value = dataset.getYValue(series, item); @@ -1997,8 +2023,9 @@ public static Range findStackedRangeBounds(CategoryDataset dataset, Range result = null; // create an array holding the group indices for each series... - int[] groupIndex = new int[dataset.getRowCount()]; - for (int i = 0; i < dataset.getRowCount(); i++) { + int rowCount = dataset.getRowCount(); + int[] groupIndex = new int[rowCount]; + for (int i = 0; i < rowCount; i++) { groupIndex[i] = map.getGroupIndex(map.getGroup( dataset.getRowKey(i))); } @@ -2012,8 +2039,7 @@ public static Range findStackedRangeBounds(CategoryDataset dataset, for (int item = 0; item < categoryCount; item++) { double[] positive = new double[groupCount]; double[] negative = new double[groupCount]; - int seriesCount = dataset.getRowCount(); - for (int series = 0; series < seriesCount; series++) { + for (int series = 0; series < rowCount; series++) { Number number = dataset.getValue(series, item); if (number != null) { hasValidData = true; @@ -2149,6 +2175,7 @@ public static Range findStackedRangeBounds(TableXYDataset dataset, double negative = base; int seriesCount = dataset.getSeriesCount(); for (int seriesNo = 0; seriesNo < seriesCount; seriesNo++) { + @SuppressWarnings("index") // all the series of a TableXYDataset have the same length double y = dataset.getYValue(seriesNo, itemNo); if (!Double.isNaN(y)) { if (y > 0.0) { @@ -2288,7 +2315,7 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, * * @see #findYValue(org.jfree.data.xy.XYDataset, int, double) */ - public static int /*@ArrayLen(2)*/ [] findItemIndicesForX(XYDataset dataset, /*@NonNegative*/ int series, + public static /*@IndexOrLow("#1.getSeries(#2)")*/ int /*@ArrayLen(2)*/ [] findItemIndicesForX(XYDataset dataset, /*@NonNegative*/ int series, double x) { Args.nullNotPermitted(dataset, "dataset"); int itemCount = dataset.getItemCount(series); @@ -2296,15 +2323,19 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, return new int[] {-1, -1}; } if (itemCount == 1) { - if (x == dataset.getXValue(series, 0)) { + @SuppressWarnings("index") // 0 is a valid index, because itemCount is at least 1 + double xValue = dataset.getXValue(series, 0); + if (x == xValue) { return new int[] {0, 0}; } else { return new int[] {-1, -1}; } } if (dataset.getDomainOrder() == DomainOrder.ASCENDING) { - int low = 0; - int high = itemCount - 1; + @SuppressWarnings("index") // 0 is an index, because itemCount > 1 + /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @SuppressWarnings("index") // itemCount - 1 is an index, because itemCount > 1 + /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > x) { return new int[] {-1, -1}; @@ -2336,8 +2367,10 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, return new int[] {low, high}; } else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { - int high = 0; - int low = itemCount - 1; + @SuppressWarnings("index") // 0 is an index, because itemCount > 1 + /*@IndexFor("dataset.getSeries(series)")*/ int high = 0; + @SuppressWarnings("index") // itemCount - 1 is an index, because itemCount > 1 + /*@IndexFor("dataset.getSeries(series)")*/ int low = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > x) { return new int[] {-1, -1}; @@ -2366,6 +2399,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // we don't know anything about the ordering of the x-values, // so we iterate until we find the first crossing of x (if any) // we know there are at least 2 items in the series at this point + @SuppressWarnings("index") // 0 is an index because itemCount > 1 double prev = dataset.getXValue(series, 0); if (x == prev) { return new int[] {0, 0}; // exact match on first item diff --git a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java index 4438e3a20..114ecb876 100644 --- a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java @@ -56,10 +56,10 @@ public class DefaultHeatMapDataset extends AbstractDataset implements HeatMapDataset, Cloneable, PublicCloneable, Serializable { /** The number of samples in this dataset for the x-dimension. */ - private /*@Positive*/ int xSamples; + private /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int xSamples; /** The number of samples in this dataset for the y-dimension. */ - private /*@Positive*/ int ySamples; + private /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int ySamples; /** The minimum x-value in the dataset. */ private double minX; @@ -109,14 +109,18 @@ public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamp throw new IllegalArgumentException("'maxY' cannot be INF or NaN."); } - this.xSamples = xSamples; - this.ySamples = ySamples; + @SuppressWarnings("index") // establish repr invariant + /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int xSamplesTmp = xSamples; + this.xSamples = xSamplesTmp; + @SuppressWarnings("index") // establish repr invariant + /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int ySamplesTmp = ySamples; + this.ySamples = ySamplesTmp; this.minX = minX; this.maxX = maxX; this.minY = minY; this.maxY = maxY; - @SuppressWarnings("index") // establish repr. invariant - double /*@SameLen("this.getData()")*/ [] /*@SameLen("this.getData()[0]")*/ [] zValues = new double[xSamples][]; + @SuppressWarnings({"index", "value"}) // establish repr. invariant ; since ySamples is positive and will be used to create each inner array, the MinLen is true + double /*@SameLen("this.getData()")*/ [] /*@SameLen("this.getData()[0]")*/ /*@MinLen(1)*/ [] zValues = new double[xSamples][]; this.zValues = zValues; for (int x = 0; x < xSamples; x++) { @SuppressWarnings("index") // establish repr. invariant @@ -133,7 +137,7 @@ public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamp * @return The number of x-values (always > 0). */ @Override - public /*@LengthOf("this.getData()")*/ int getXSampleCount() { + public /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int getXSampleCount() { return this.xSamples; } @@ -145,7 +149,7 @@ public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamp * @return The number of y-values (always > 0). */ @Override - public /*@LengthOf("this.getData()[0]")*/ int getYSampleCount() { + public /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int getYSampleCount() { return this.ySamples; } diff --git a/src/main/java/org/jfree/data/general/HeatMapDataset.java b/src/main/java/org/jfree/data/general/HeatMapDataset.java index db3128523..cff77af75 100644 --- a/src/main/java/org/jfree/data/general/HeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/HeatMapDataset.java @@ -59,7 +59,7 @@ public interface HeatMapDataset { * * @return The number of x-values (always > 0). */ - public /*@Positive*/ int getXSampleCount(); + public /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int getXSampleCount(); /** * Returns the number of y values (or samples) for the dataset. The @@ -68,7 +68,7 @@ public interface HeatMapDataset { * * @return The number of y-values (always > 0). */ - public /*@Positive*/ int getYSampleCount(); + public /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int getYSampleCount(); /** * Returns the lowest x-value represented in this dataset. A requirement diff --git a/src/main/java/org/jfree/data/io/CSV.java b/src/main/java/org/jfree/data/io/CSV.java index 8dfad2694..105ee08b5 100644 --- a/src/main/java/org/jfree/data/io/CSV.java +++ b/src/main/java/org/jfree/data/io/CSV.java @@ -127,6 +127,7 @@ private List extractColumnKeys(String line) { if (line.charAt(i) == this.fieldDelimiter) { if (fieldIndex > 0) { // first field is ignored, since // column 0 is for row keys + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/138 String key = line.substring(start, i); keys.add(removeStringDelimiters(key)); } @@ -134,6 +135,7 @@ private List extractColumnKeys(String line) { fieldIndex++; } } + @SuppressWarnings("index") // the for loop above cannot increment start more than line.length times, so start is IOH of line String key = line.substring(start, line.length()); keys.add(removeStringDelimiters(key)); return keys; @@ -151,11 +153,11 @@ private void extractRowKeyAndData(String line, List columnKeys) { Comparable rowKey = null; int fieldIndex = 0; - int start = 0; + /*@IndexOrHigh("line")*/ int start = 0; for (int i = 0; i < line.length(); i++) { if (line.charAt(i) == this.fieldDelimiter) { if (fieldIndex == 0) { // first field contains the row key - String key = line.substring(start, i); + String key = line.substring(start, i); rowKey = removeStringDelimiters(key); } else { // remaining fields contain values @@ -167,10 +169,17 @@ private void extractRowKeyAndData(String line, (Comparable) columnKeys.get(fieldIndex - 1) ); } - start = i + 1; + @SuppressWarnings("index") // line is CSV formatted, so skipping is okay here + /*@IndexOrHigh("line")*/ int skipIndex = i + 1; + start = skipIndex; fieldIndex++; } } + + @SuppressWarnings("index") // CSV format guarantees at least one field + /*@Positive*/ int fieldIndexTmp = fieldIndex; + fieldIndex = fieldIndexTmp; + Double value = Double.valueOf( removeStringDelimiters(line.substring(start, line.length())) ); @@ -188,7 +197,8 @@ private void extractRowKeyAndData(String line, * @return The key without delimiters. */ private String removeStringDelimiters(String key) { - String k = key.trim(); + @SuppressWarnings({"index", "value"}) // key must have a non-whitespace value is a precondition of this function + /*@MinLen(1)*/ String k = key.trim(); if (k.charAt(0) == this.textDelimiter) { k = k.substring(1); } diff --git a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java index e1b4158a2..aa50eecf5 100644 --- a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java +++ b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java @@ -243,7 +243,8 @@ public void executeQuery(Connection con, String query) resultSet = statement.executeQuery(query); ResultSetMetaData metaData = resultSet.getMetaData(); - int numberOfColumns = metaData.getColumnCount(); + @SuppressWarnings("index") // ResultSetMetaData#getColumnCount needs an annotation + /*@Positive*/ int numberOfColumns = metaData.getColumnCount(); int numberOfValidColumns = 0; int [] columnTypes = new int[numberOfColumns]; for (int column = 0; column < numberOfColumns; column++) { @@ -287,12 +288,14 @@ public void executeQuery(Connection con, String query) /// First column is X data this.columnNames = new String[numberOfValidColumns - 1]; /// Get the column names and cache them. - int currentColumn = 0; + /*@IndexFor("this.columnNames")*/ int currentColumn = 0; for (int column = 1; column < numberOfColumns; column++) { if (columnTypes[column] != Types.NULL) { this.columnNames[currentColumn] = metaData.getColumnLabel(column + 1); - ++currentColumn; + @SuppressWarnings("index") // this update only happens when the column is valid + /*@IndexFor("this.columnNames")*/ int currentColumnTmp = currentColumn + 1; + currentColumn = currentColumnTmp; } } diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index 186d5d8ab..5618cdb96 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -59,7 +59,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -217,7 +217,7 @@ public void setFaroutCoefficient(double faroutCoefficient) { * @return The number of items in the specified series. */ @Override - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.dates.size(); } diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index 7c7926c4b..c6be31f9a 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -61,9 +61,9 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -202,6 +202,7 @@ public void addSeries(Comparable key, double[] values, /*@Positive*/ int bins, binIndex = bins - 1; } } + @SuppressWarnings("index") // see the comment about the known bug above HistogramBin bin = (HistogramBin) binList.get(binIndex); bin.incrementCount(); } @@ -338,7 +339,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getBins(series).size(); } diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index 90436ea1a..ee2ed107b 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -45,9 +45,9 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -261,22 +261,25 @@ public static double[] getPolynomialRegression(XYDataset dataset, if (itemCount < order + 1) { throw new IllegalArgumentException("Not enough data."); } - int validItems = 0; double[][] data = new double[2][itemCount]; + @SuppressWarnings("index") // validItems will only be used as a index if there is at least one item + /*@IndexFor(value={"data[0]","data[1]"}, offset={"0","0"})*/ int validItems = 0; for(int item = 0; item < itemCount; item++){ double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); if (!Double.isNaN(x) && !Double.isNaN(y)){ data[0][validItems] = x; data[1][validItems] = y; - validItems++; + @SuppressWarnings("index") // validItems is incremented at most as often as item, which is a valid index + /*@IndexFor(value={"data[0]","data[1]"}, offset={"0","0"})*/ int validItemsTmp = validItems + 1; + validItems = validItemsTmp; } } if (validItems < order + 1) { throw new IllegalArgumentException("Not enough data."); } - int equations = order + 1; - int coefficients = order + 2; + /*@Positive*/ int equations = order + 1; + /*@Positive*/ int coefficients = order + 2; double[] result = new double[equations + 1]; double[][] matrix = new double[equations][coefficients]; double sumX = 0.0; @@ -286,7 +289,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, sumX += data[0][item]; sumY += data[1][item]; for(int eq = 0; eq < equations; eq++){ - for(int coe = 0; coe < coefficients - 1; coe++){ + for(int coe = 0; coe < matrix[eq].length - 1; coe++){ matrix[eq][coe] += Math.pow(data[0][item],eq + coe); } matrix[eq][coefficients - 1] += data[1][item] @@ -334,8 +337,8 @@ public static double[] getPolynomialRegression(XYDataset dataset, * @return The new matrix. */ private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] matrix){ - int equations = matrix.length; - int coefficients = matrix[0].length; + /*@Positive*/ int equations = matrix.length; + /*@Positive*/ int coefficients = matrix[0].length; double[][] result = new double[equations - 1][coefficients - 1]; for (int eq = 1; eq < equations; eq++) { double factor = matrix[0][0] / matrix[eq][0]; diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index b833769ee..4766a8dab 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -42,7 +42,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -168,7 +168,7 @@ public DomainOrder getDomainOrder() { */ @Override @SuppressWarnings("index") // establish repr. invariant - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.bins.size(); } diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index 9b4f6948a..bccc19325 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -48,9 +48,9 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.util.ArrayList; import java.util.Collection; @@ -223,6 +223,7 @@ public static double calculateMedian(List values, boolean copyAndSort) { } } else { + @SuppressWarnings("index") // count is a positive even number (min. 2), so count/2 - 1 is at least zero Number value1 = (Number) values.get(count / 2 - 1); Number value2 = (Number) values.get(count / 2); result = (value1.doubleValue() + value2.doubleValue()) @@ -260,11 +261,12 @@ public static double calculateMedian(List values, int start, int end) { * * @return The median. */ - public static double calculateMedian(List values, int start, int end, + public static double calculateMedian(List values, /*@NonNegative*/ int start, /*@NonNegative*/ int end, boolean copyAndSort) { double result = Double.NaN; if (copyAndSort) { + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 end > start List working = new ArrayList(end - start + 1); for (int i = start; i <= end; i++) { working.add(values.get(i)); @@ -287,6 +289,7 @@ public static double calculateMedian(List values, int start, int end, } } else { + @SuppressWarnings("index") // count is a positive even integer -> count >= 2 -> count / 2 - 1 is NN Number value1 = (Number) values.get(start + count / 2 - 1); Number value2 = (Number) values.get(start + count / 2); result @@ -455,7 +458,9 @@ public static double getCorrelation(Number /*@SameLen("#2")*/ [] data1, Number / "Period can't be longer than dataset."); } - double[][] result = new double[xData.length - period][2]; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 xData.length > period + /*@NonNegative*/ int resultLen = xData.length - period; + double[][] result = new double[resultLen][2]; for (int i = 0; i < result.length; i++) { result[i][0] = xData[i + period].doubleValue(); // holds the moving average sum diff --git a/src/main/java/org/jfree/data/time/Day.java b/src/main/java/org/jfree/data/time/Day.java index d0ddb1604..ba2e5fe12 100644 --- a/src/main/java/org/jfree/data/time/Day.java +++ b/src/main/java/org/jfree/data/time/Day.java @@ -64,8 +64,8 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.text.DateFormat; @@ -128,7 +128,7 @@ public Day() { * @param month the month (1 to 12). * @param year the year (1900 <= year <= 9999). */ - public Day(int day, int month, int year) { + public Day(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { this.serialDate = SerialDate.createInstance(day, month, year); peg(Calendar.getInstance()); } @@ -173,7 +173,9 @@ public Day(Date time, TimeZone zone, Locale locale) { int d = calendar.get(Calendar.DAY_OF_MONTH); int m = calendar.get(Calendar.MONTH) + 1; int y = calendar.get(Calendar.YEAR); - this.serialDate = SerialDate.createInstance(d, m, y); + @SuppressWarnings("index") // Calendar needs index annotations + SerialDate tmpDate = SerialDate.createInstance(d, m, y); + this.serialDate = tmpDate; peg(calendar); } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 082b0fe7c..2bd568052 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -61,9 +61,9 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -114,7 +114,7 @@ public class DynamicTimeSeriesCollection extends AbstractIntervalXYDataset private /*@NonNegative*/ int maximumItemCount = 2000; // an arbitrary safe default value /** The history count. */ - protected /*@IndexOrHigh("this.pointsInTime")*/ int historyCount; + protected /*@LTEqLengthOf("this.pointsInTime")*/ /*@Positive*/ int historyCount; /** Storage for the series keys. */ private Comparable /*@SameLen("this.valueHistory")*/ [] seriesKeys; @@ -149,7 +149,9 @@ public ValueSequence() { * @param length the length. */ public ValueSequence(/*@NonNegative*/ int length) { - this.dataPoints = new float[length]; + @SuppressWarnings("index") // establish repr. invariant + float /*@SameLen("this")*/ [] dataPointsTmp = new float[length]; + this.dataPoints = dataPointsTmp; for (int i = 0; i < length; i++) { this.dataPoints[i] = 0.0f; } @@ -237,7 +239,9 @@ public float getData(/*@IndexFor("this")*/ int index) { */ public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments) { this(nSeries, nMoments, new Millisecond(), TimeZone.getDefault()); - this.newestAt = nMoments - 1; + @SuppressWarnings("index") // nMoments is used later to populate the field this annotation refers to + /*@IndexFor("this.pointsInTime")*/ int newestAtTmp = nMoments - 1; + this.newestAt = newestAtTmp; } /** @@ -250,7 +254,9 @@ public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ i public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments, TimeZone zone) { this(nSeries, nMoments, new Millisecond(), zone); - this.newestAt = nMoments - 1; + @SuppressWarnings("index") // nMoments is used later to populate the field this annotation refers to + /*@IndexFor("this.pointsInTime")*/ int newestAtTmp = nMoments - 1; + this.newestAt = newestAtTmp; } /** @@ -273,6 +279,7 @@ public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ i * @param timeSample a time period sample. * @param zone the time zone. */ + @SuppressWarnings("index") // this constructor establishes the repr. invariants public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments, RegularTimePeriod timeSample, TimeZone zone) { @@ -472,7 +479,8 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@NonNegative*/ int ind * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + @SuppressWarnings("index") + public /*@NonNegative*/ /*@LTEqLengthOf("this.valueHistory")*/ int getSeriesCount() { return this.seriesCount; } @@ -486,7 +494,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@NonNegative*/ int ind * @return The item count. */ @Override - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, // so ignore argument: return this.historyCount; } @@ -593,10 +601,15 @@ public synchronized RegularTimePeriod advanceTime() { // Update the array of TimePeriods: this.pointsInTime[this.newestAt] = nextInstant; // Now advance "oldestAt", wrapping at end of the array - this.oldestAt++; + int newOldestAt; if (this.oldestAt >= this.historyCount) { - this.oldestAt = 0; + @SuppressWarnings("index") // the check right below ensures this doesn't go out of bounds for more than a few insr + /*@IndexFor("this.pointsInTime")*/ int tmp = 0; + newOldestAt = tmp; + } else { + newOldestAt = this.oldestAt + 1; } + this.oldestAt = newOldestAt; // Update the domain limits: long startL = this.domainStart.longValue(); //(time is kept in msec) this.domainStart = new Long(startL + this.deltaTime); @@ -642,7 +655,7 @@ protected double findMaxValue() { * * @return The index. */ - public int getOldestIndex() { + public /*@IndexFor("this.pointsInTime")*/ int getOldestIndex() { return this.oldestAt; } @@ -651,7 +664,7 @@ public int getOldestIndex() { * * @return The index. */ - public int getNewestIndex() { + public /*@IndexFor("this.pointsInTime")*/ int getNewestIndex() { return this.newestAt; } @@ -737,7 +750,7 @@ public RegularTimePeriod getOldestTime() { // getXxx() ftns can ignore the "series" argument: // Don't synchronize this!! Instead, synchronize the loop that calls it. @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(getX(tp)); } @@ -751,7 +764,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { // Don't synchronize this!! // Instead, synchronize the loop that calls it. ValueSequence values = this.valueHistory[series]; @@ -767,7 +780,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Float(getYValue(series, item)); } @@ -780,7 +793,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(tp.getFirstMillisecond(this.workingCalendar)); } @@ -794,7 +807,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; return new Long(tp.getLastMillisecond(this.workingCalendar)); } @@ -808,7 +821,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -821,7 +834,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/Hour.java b/src/main/java/org/jfree/data/time/Hour.java index 9048ed7d9..9bdf7c3c6 100644 --- a/src/main/java/org/jfree/data/time/Hour.java +++ b/src/main/java/org/jfree/data/time/Hour.java @@ -65,6 +65,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -113,7 +114,7 @@ public Hour() { * @param hour the hour (in the range 0 to 23). * @param day the day ({@code null} not permitted). */ - public Hour(int hour, Day day) { + public Hour(/*@IntRange(from = 0, to = 23)*/ int hour, Day day) { Args.nullNotPermitted(day, "day"); this.hour = (byte) hour; this.day = day; @@ -128,7 +129,7 @@ public Hour(int hour, Day day) { * @param month the month (1-12). * @param year the year (1900-9999). */ - public Hour(int hour, int day, int month, int year) { + public Hour(/*@IntRange(from = 0, to = 23)*/ int hour, /*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { this(hour, new Day(day, month, year)); } @@ -171,7 +172,7 @@ public Hour(Date time, TimeZone zone, Locale locale) { * * @return The hour (0 <= hour <= 23). */ - public int getHour() { + public /*@IntRange(from = 0, to = 23)*/ int getHour() { return this.hour; } @@ -189,7 +190,7 @@ public Day getDay() { * * @return The year. */ - public int getYear() { + public /*@IntRange(from = 1900, to = 9999)*/ int getYear() { return this.day.getYear(); } @@ -198,7 +199,7 @@ public int getYear() { * * @return The month. */ - public int getMonth() { + public /*@IntRange(from = 1, to = 12)*/ int getMonth() { return this.day.getMonth(); } @@ -207,7 +208,7 @@ public int getMonth() { * * @return The day-of-the-month. */ - public int getDayOfMonth() { + public /*@IntRange(from = 1, to = 31)*/ int getDayOfMonth() { return this.day.getDayOfMonth(); } diff --git a/src/main/java/org/jfree/data/time/Millisecond.java b/src/main/java/org/jfree/data/time/Millisecond.java index 864f0d3ca..bd202c599 100644 --- a/src/main/java/org/jfree/data/time/Millisecond.java +++ b/src/main/java/org/jfree/data/time/Millisecond.java @@ -59,6 +59,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -114,7 +115,7 @@ public Millisecond() { * @param millisecond the millisecond (0-999). * @param second the second. */ - public Millisecond(int millisecond, Second second) { + public Millisecond(/*@IntRange(from = 0, to = 999)*/ int millisecond, Second second) { this.millisecond = millisecond; this.second = (byte) second.getSecond(); this.minute = (byte) second.getMinute().getMinute(); @@ -134,8 +135,8 @@ public Millisecond(int millisecond, Second second) { * @param month the month (1-12). * @param year the year (1900-9999). */ - public Millisecond(int millisecond, int second, int minute, int hour, - int day, int month, int year) { + public Millisecond(/*@IntRange(from = 0, to = 999)*/ int millisecond, /*@IntRange(from = 0, to = 59)*/ int second, /*@IntRange(from = 0, to = 59)*/ int minute, /*@IntRange(from = 0, to = 23)*/ int hour, + /*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { this(millisecond, new Second(second, minute, hour, day, month, year)); diff --git a/src/main/java/org/jfree/data/time/Minute.java b/src/main/java/org/jfree/data/time/Minute.java index 1e7d2316b..d482a045f 100644 --- a/src/main/java/org/jfree/data/time/Minute.java +++ b/src/main/java/org/jfree/data/time/Minute.java @@ -66,6 +66,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -117,7 +118,7 @@ public Minute() { * @param minute the minute (0 to 59). * @param hour the hour ({@code null} not permitted). */ - public Minute(int minute, Hour hour) { + public Minute(/*@IntRange(from = 0, to = 59)*/ int minute, Hour hour) { Args.nullNotPermitted(hour, "hour"); this.minute = (byte) minute; this.hour = (byte) hour.getHour(); @@ -169,7 +170,7 @@ public Minute(Date time, TimeZone zone, Locale locale) { * @param month the month (1-12). * @param year the year (1900-9999). */ - public Minute(int minute, int hour, int day, int month, int year) { + public Minute(/*@IntRange(from = 0, to = 59)*/ int minute, /*@IntRange(from = 0, to = 23)*/ int hour, /*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { this(minute, new Hour(hour, new Day(day, month, year))); } diff --git a/src/main/java/org/jfree/data/time/Month.java b/src/main/java/org/jfree/data/time/Month.java index cc0c30f6b..dc2472063 100644 --- a/src/main/java/org/jfree/data/time/Month.java +++ b/src/main/java/org/jfree/data/time/Month.java @@ -65,6 +65,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -84,10 +85,10 @@ public class Month extends RegularTimePeriod implements Serializable { private static final long serialVersionUID = -5090216912548722570L; /** The month (1-12). */ - private int month; + private /*@IntRange(from = 1, to = 12)*/ int month; /** The year in which the month falls. */ - private int year; + private /*@IntRange(from = 1900, to = 9999)*/ int year; /** The first millisecond. */ private long firstMillisecond; @@ -108,7 +109,7 @@ public Month() { * @param month the month (in the range 1 to 12). * @param year the year. */ - public Month(int month, int year) { + public Month(/*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { if ((month < 1) || (month > 12)) { throw new IllegalArgumentException("Month outside valid range."); } @@ -123,7 +124,7 @@ public Month(int month, int year) { * @param month the month (in the range 1 to 12). * @param year the year. */ - public Month(int month, Year year) { + public Month(/*@IntRange(from = 1, to = 12)*/ int month, Year year) { if ((month < 1) || (month > 12)) { throw new IllegalArgumentException("Month outside valid range."); } diff --git a/src/main/java/org/jfree/data/time/MovingAverage.java b/src/main/java/org/jfree/data/time/MovingAverage.java index 08774c045..89564e2b4 100644 --- a/src/main/java/org/jfree/data/time/MovingAverage.java +++ b/src/main/java/org/jfree/data/time/MovingAverage.java @@ -49,6 +49,8 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -76,7 +78,7 @@ public class MovingAverage { * @return A collection of moving average time series. */ public static TimeSeriesCollection createMovingAverage( - TimeSeriesCollection source, String suffix, int periodCount, + TimeSeriesCollection source, String suffix, /*@Positive*/ int periodCount, int skip) { Args.nullNotPermitted(source, "source"); @@ -110,7 +112,7 @@ public static TimeSeriesCollection createMovingAverage( * @return The moving average series. */ public static TimeSeries createMovingAverage(TimeSeries source, - String name, int periodCount, int skip) { + String name, /*@Positive*/ int periodCount, int skip) { Args.nullNotPermitted(source, "source"); if (periodCount < 1) { @@ -192,7 +194,7 @@ public static TimeSeries createMovingAverage(TimeSeries source, * @return The moving average series. */ public static TimeSeries createPointMovingAverage(TimeSeries source, - String name, int pointCount) { + String name, /*@Positive*/ int pointCount) { Args.nullNotPermitted(source, "source"); if (pointCount < 2) { diff --git a/src/main/java/org/jfree/data/time/Second.java b/src/main/java/org/jfree/data/time/Second.java index 47beeb956..98a6b2009 100644 --- a/src/main/java/org/jfree/data/time/Second.java +++ b/src/main/java/org/jfree/data/time/Second.java @@ -61,6 +61,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -115,7 +116,7 @@ public Second() { * @param second the second (0 to 59). * @param minute the minute ({@code null} not permitted). */ - public Second(int second, Minute minute) { + public Second(/*@IntRange(from = 0, to = 59)*/ int second, Minute minute) { Args.requireInRange(second, "second", Second.FIRST_SECOND_IN_MINUTE, Second.LAST_SECOND_IN_MINUTE); Args.nullNotPermitted(minute, "minute"); @@ -136,8 +137,8 @@ public Second(int second, Minute minute) { * @param month the month (1-12). * @param year the year (1900-9999). */ - public Second(int second, int minute, int hour, - int day, int month, int year) { + public Second(/*@IntRange(from = 0, to = 59)*/ int second, /*@IntRange(from = 0, to = 59)*/ int minute, /*@IntRange(from = 0, to = 23)*/ int hour, + /*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { this(second, new Minute(minute, hour, day, month, year)); } diff --git a/src/main/java/org/jfree/data/time/TimePeriodValues.java b/src/main/java/org/jfree/data/time/TimePeriodValues.java index 84767a00e..875a9a4d6 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValues.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValues.java @@ -47,7 +47,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.GTENegativeOne; */ +/*>>> import org.checkerframework.checker.index.qual.GTENegativeOne; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -396,6 +396,7 @@ public void update(/*@NonNegative*/ int index, Number value) { * @param start the index of the first period to delete. * @param end the index of the last period to delete. */ + @SuppressWarnings("index") // https://github.com/kelloggm/issues/158 end > start is precondition public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { for (int i = 0; i <= (end - start); i++) { this.data.remove(start); diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index b8e3489c1..f66a85af8 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -49,6 +49,8 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -219,7 +221,8 @@ public void removeSeries(/*@NonNegative*/ int index) { * @return The number of items in the specified series. */ @Override - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // getSeries(series).getItemCount is LengthOf(this.getSeries) + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } @@ -232,7 +235,7 @@ public void removeSeries(/*@NonNegative*/ int index) { * @return The x-value for the specified series and item. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); TimePeriod period = dp.getPeriod(); @@ -273,7 +276,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The starting X value for the specified series and item. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return new Long(dp.getPeriod().getStart().getTime()); @@ -288,7 +291,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The ending X value for the specified series and item. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return new Long(dp.getPeriod().getEnd().getTime()); @@ -303,7 +306,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The y-value for the specified series and item. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return dp.getValue(); @@ -318,7 +321,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The starting Y value for the specified series and item. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -331,7 +334,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The ending Y value for the specified series and item. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index 37fc82bf7..c82280c0e 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -143,7 +143,7 @@ public class TimeSeries extends Series implements Cloneable, Serializable { protected List data; /** The maximum number of items for the series. */ - private int maximumItemCount; + private /*@NonNegative*/ int maximumItemCount; /** * The maximum age of items for the series, specified as a number of @@ -281,7 +281,7 @@ public List getItems() { * * @see #setMaximumItemCount(int) */ - public int getMaximumItemCount() { + public /*@NonNegative*/ int getMaximumItemCount() { return this.maximumItemCount; } @@ -296,7 +296,7 @@ public int getMaximumItemCount() { * * @see #getMaximumItemCount() */ - public void setMaximumItemCount(int maximum) { + public void setMaximumItemCount(/*@NonNegative*/ int maximum) { if (maximum < 0) { throw new IllegalArgumentException("Negative 'maximum' argument."); } @@ -605,7 +605,7 @@ public Collection getTimePeriodsUniqueToOtherSeries(TimeSeries series) { * * @return The index. */ - public /*@GTENegativeOne*/ int getIndex(RegularTimePeriod period) { + public int getIndex(RegularTimePeriod period) { Args.nullNotPermitted(period, "period"); TimeSeriesDataItem dummy = new TimeSeriesDataItem( period, Integer.MIN_VALUE); @@ -1076,7 +1076,7 @@ public void delete(RegularTimePeriod period) { * @param start the index of the first period to delete. * @param end the index of the last period to delete. */ - public void delete(int start, int end) { + public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { delete(start, end, true); } @@ -1089,7 +1089,8 @@ public void delete(int start, int end) { * * @since 1.0.14 */ - public void delete(int start, int end, boolean notify) { + @SuppressWarnings("index") // https://github.com/kelloggm/issues/158 end > start is precondition + public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end, boolean notify) { if (end < start) { throw new IllegalArgumentException("Requires start <= end."); } @@ -1139,7 +1140,7 @@ public Object clone() throws CloneNotSupportedException { * * @throws CloneNotSupportedException if there is a cloning problem. */ - public TimeSeries createCopy(int start, int end) + public TimeSeries createCopy(/*@NonNegative*/ int start, /*@NonNegative*/ int end) throws CloneNotSupportedException { if (start < 0) { throw new IllegalArgumentException("Requires start >= 0."); diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index 5d9f912d3..e013a8827 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -87,6 +87,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> @@ -322,7 +323,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * * @since 1.0.17 */ - public int getSeriesIndex(Comparable key) { + public /*@GTENegativeOne*/ int getSeriesIndex(Comparable key) { Args.nullNotPermitted(key, "key"); int seriesCount = getSeriesCount(); for (int i = 0; i < seriesCount; i++) { @@ -403,7 +404,8 @@ public void removeAllSeries() { * @return The item count. */ @Override - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // getSeries(series).getItemCount is LengthOf(this.getSeries(series) + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } @@ -416,7 +418,7 @@ public void removeAllSeries() { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimeSeries s = (TimeSeries) this.data.get(series); RegularTimePeriod period = s.getTimePeriod(item); return getX(period); @@ -431,7 +433,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimeSeries ts = (TimeSeries) this.data.get(series); RegularTimePeriod period = ts.getTimePeriod(item); return new Long(getX(period)); @@ -467,7 +469,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The value. */ @Override - public synchronized Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public synchronized Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return new Long(ts.getTimePeriod(item).getFirstMillisecond( this.workingCalendar)); @@ -482,7 +484,7 @@ public synchronized Number getStartX(/*@NonNegative*/ int series, /*@NonNegative * @return The value. */ @Override - public synchronized Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public synchronized Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return new Long(ts.getTimePeriod(item).getLastMillisecond( this.workingCalendar)); @@ -497,7 +499,7 @@ public synchronized Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ * @return The value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return ts.getValue(item); } @@ -511,7 +513,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value (possibly {@code null}). */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -524,7 +526,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value (possibly {@code null}). */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -539,7 +541,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return An array containing the (two) indices of the items surrounding * the time. */ - public int[] getSurroundingItems(/*@NonNegative*/ int series, long milliseconds) { + public int /*@ArrayLen(2)*/ [] getSurroundingItems(/*@NonNegative*/ int series, long milliseconds) { int[] result = new int[] {-1, -1}; TimeSeries timeSeries = getSeries(series); for (int i = 0; i < timeSeries.getItemCount(); i++) { diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index 2119f5795..fd8567458 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -56,6 +56,8 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -326,7 +328,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { * @return The number of items within the series. */ @Override - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getItemCount(); } @@ -363,7 +365,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getXValue(series, item)); } @@ -376,7 +378,7 @@ public Number getX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return getXValue(period); } @@ -392,7 +394,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @see #getStartXValue(int, int) */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getStartXValue(series, item)); } @@ -406,7 +408,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return period.getStart().getTime(); } @@ -422,7 +424,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int i * @see #getEndXValue(int, int) */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return new Double(getEndXValue(series, item)); } @@ -436,7 +438,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return period.getEnd().getTime(); } @@ -450,7 +452,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ite * @return The y-value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.values.getValue(item, series); } @@ -463,7 +465,7 @@ public Number getY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return The starting Y value for the specified series and item. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } @@ -476,7 +478,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) * @return The ending Y value for the specified series and item. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/Week.java b/src/main/java/org/jfree/data/time/Week.java index 7504115f8..cb84fbad2 100644 --- a/src/main/java/org/jfree/data/time/Week.java +++ b/src/main/java/org/jfree/data/time/Week.java @@ -73,6 +73,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -103,10 +104,10 @@ public class Week extends RegularTimePeriod implements Serializable { public static final int LAST_WEEK_IN_YEAR = 53; /** The year in which the week falls. */ - private short year; + private /*@IntRange(from = 1900, to = 9999)*/ short year; /** The week (1-53). */ - private byte week; + private /*@IntRange(from = 1, to = 53)*/ byte week; /** The first millisecond. */ private long firstMillisecond; @@ -128,7 +129,7 @@ public Week() { * @param week the week (1 to 53). * @param year the year (1900 to 9999). */ - public Week(int week, int year) { + public Week(/*@IntRange(from = 1, to = 53)*/ int week, /*@IntRange(from = 1900, to = 9999)*/ int year) { if ((week < FIRST_WEEK_IN_YEAR) && (week > LAST_WEEK_IN_YEAR)) { throw new IllegalArgumentException( "The 'week' argument must be in the range 1 - 53."); @@ -144,7 +145,7 @@ public Week(int week, int year) { * @param week the week (1 to 53). * @param year the year (1900 to 9999). */ - public Week(int week, Year year) { + public Week(/*@IntRange(from = 1, to = 53)*/ int week, Year year) { if ((week < FIRST_WEEK_IN_YEAR) && (week > LAST_WEEK_IN_YEAR)) { throw new IllegalArgumentException( "The 'week' argument must be in the range 1 - 53."); @@ -223,7 +224,7 @@ public Year getYear() { * * @return The year. */ - public int getYearValue() { + public /*@IntRange(from = 1900, to = 9999)*/ int getYearValue() { return this.year; } @@ -232,7 +233,7 @@ public int getYearValue() { * * @return The week. */ - public int getWeek() { + public /*@IntRange(from = 1, to = 53)*/ int getWeek() { return this.week; } diff --git a/src/main/java/org/jfree/data/time/Year.java b/src/main/java/org/jfree/data/time/Year.java index 67a941512..8a921d3ba 100644 --- a/src/main/java/org/jfree/data/time/Year.java +++ b/src/main/java/org/jfree/data/time/Year.java @@ -61,6 +61,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -92,7 +93,7 @@ public class Year extends RegularTimePeriod implements Serializable { private static final long serialVersionUID = -7659990929736074836L; /** The year. */ - private short year; + private /*@IntRange(from = 1900, to = 9999)*/ short year; /** The first millisecond. */ private long firstMillisecond; @@ -112,7 +113,7 @@ public Year() { * * @param year the year. */ - public Year(int year) { + public Year(/*@IntRange(from = 1900, to = 9999)*/ int year) { if ((year < Year.MINIMUM_YEAR) || (year > Year.MAXIMUM_YEAR)) { throw new IllegalArgumentException( "Year constructor: year (" + year + ") outside valid range."); @@ -155,7 +156,7 @@ public Year(Date time, TimeZone zone, Locale locale) { * * @return The year. */ - public int getYear() { + public /*@IntRange(from = 1900, to = 9999)*/ int getYear() { return this.year; } diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index 5e859cd6e..a9d591784 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -43,7 +43,7 @@ */ package org.jfree.data.time.ohlc; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -179,7 +179,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - public /*@LengthOf("this.getSeries(#1)")"*/ int getItemCount(/*@NonNegative*/ int series) { + public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); } diff --git a/src/main/java/org/jfree/data/xml/KeyHandler.java b/src/main/java/org/jfree/data/xml/KeyHandler.java index 4c480b998..9ca8542ab 100644 --- a/src/main/java/org/jfree/data/xml/KeyHandler.java +++ b/src/main/java/org/jfree/data/xml/KeyHandler.java @@ -39,6 +39,8 @@ */ package org.jfree.data.xml; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -134,7 +136,8 @@ public void endElement(String namespaceURI, * @param length the length of the valid character data. */ @Override - public void characters(char[] ch, int start, int length) { + @SuppressWarnings("index") // need xml annotations + public void characters(char[] ch, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int length) { if (this.currentText != null) { this.currentText.append(String.copyValueOf(ch, start, length)); } diff --git a/src/main/java/org/jfree/data/xml/RootHandler.java b/src/main/java/org/jfree/data/xml/RootHandler.java index de6fe59cb..61c9cc7c1 100644 --- a/src/main/java/org/jfree/data/xml/RootHandler.java +++ b/src/main/java/org/jfree/data/xml/RootHandler.java @@ -39,6 +39,8 @@ */ package org.jfree.data.xml; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.util.Stack; @@ -79,7 +81,8 @@ public Stack getSubHandlers() { * @throws SAXException for errors. */ @Override - public void characters(char[] ch, int start, int length) + @SuppressWarnings("index") // need xml annotations + public void characters(char[] ch, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int length) throws SAXException { DefaultHandler handler = getCurrentHandler(); if (handler != this) { diff --git a/src/main/java/org/jfree/data/xml/ValueHandler.java b/src/main/java/org/jfree/data/xml/ValueHandler.java index f387e1c8f..1c4c692ed 100644 --- a/src/main/java/org/jfree/data/xml/ValueHandler.java +++ b/src/main/java/org/jfree/data/xml/ValueHandler.java @@ -40,6 +40,8 @@ */ package org.jfree.data.xml; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -139,7 +141,8 @@ public void endElement(String namespaceURI, * @param length the length of the valid character data. */ @Override - public void characters(char[] ch, int start, int length) { + @SuppressWarnings("index") // need xml annotations + public void characters(char[] ch, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int length) { if (this.currentText != null) { this.currentText.append(String.copyValueOf(ch, start, length)); } diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index bd61dcee3..19ebed0df 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -826,7 +826,9 @@ else if (item.getY() != null) { // append the value to the list... item = (XYDataItem) item.clone(); if (this.autoSort) { - this.data.add(-index - 1, item); + @SuppressWarnings("index") // this is a search index iff this.autoSort is true + /*@NonNegative*/ int addIndex = -index - 1; + this.data.add(addIndex, item); } else { this.data.add(item); diff --git a/src/test/java/org/jfree/chart/GanttChartTest.java b/src/test/java/org/jfree/chart/GanttChartTest.java index e9366f2be..5c87ddbfb 100644 --- a/src/test/java/org/jfree/chart/GanttChartTest.java +++ b/src/test/java/org/jfree/chart/GanttChartTest.java @@ -271,7 +271,7 @@ public static IntervalCategoryDataset createDataset() { * * @return a date. */ - private static Date date(int day, int month, int year) { + private static Date date(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month, day); From 56ef4ca42010f7134d93c681fb502431da38b623 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Wed, 20 Dec 2017 07:55:01 -0800 Subject: [PATCH 14/79] add suppresswarnings/switch some annotations to remove all? warnings except those caused by missing annotations in javax.swing classes --- .../jfree/data/ComparableObjectSeries.java | 7 ++- src/main/java/org/jfree/data/DataUtils.java | 6 +- .../org/jfree/data/DefaultKeyedValues2D.java | 3 + .../java/org/jfree/data/KeyToGroupMap.java | 2 + src/main/java/org/jfree/data/Values2D.java | 3 + .../data/category/DefaultCategoryDataset.java | 5 +- .../DefaultIntervalCategoryDataset.java | 8 +-- .../data/category/SlidingCategoryDataset.java | 3 + .../gantt/SlidingGanttCategoryDataset.java | 3 + .../data/gantt/TaskSeriesCollection.java | 3 + .../org/jfree/data/general/DatasetUtils.java | 18 ++++-- .../data/general/DefaultHeatMapDataset.java | 2 +- src/main/java/org/jfree/data/io/CSV.java | 7 ++- .../statistics/BoxAndWhiskerCalculator.java | 4 +- .../DefaultBoxAndWhiskerCategoryDataset.java | 3 + .../DefaultBoxAndWhiskerXYDataset.java | 1 + .../DefaultMultiValueCategoryDataset.java | 3 + .../DefaultStatisticalCategoryDataset.java | 5 +- .../data/statistics/HistogramDataset.java | 1 + .../org/jfree/data/statistics/Regression.java | 4 +- .../org/jfree/data/statistics/Statistics.java | 12 ++-- src/main/java/org/jfree/data/time/Day.java | 2 +- .../time/DynamicTimeSeriesCollection.java | 56 ++++++++++++------- src/main/java/org/jfree/data/time/Hour.java | 5 +- .../java/org/jfree/data/time/Millisecond.java | 11 ++-- src/main/java/org/jfree/data/time/Minute.java | 10 ++-- src/main/java/org/jfree/data/time/Month.java | 6 +- .../org/jfree/data/time/MovingAverage.java | 12 ++-- .../java/org/jfree/data/time/Quarter.java | 9 ++- .../jfree/data/time/RegularTimePeriod.java | 2 + src/main/java/org/jfree/data/time/Second.java | 11 ++-- .../org/jfree/data/time/SimpleTimePeriod.java | 2 + .../java/org/jfree/data/time/TimePeriod.java | 2 + .../org/jfree/data/time/TimePeriodValue.java | 2 + .../org/jfree/data/time/TimePeriodValues.java | 28 ++++++---- .../data/time/TimePeriodValuesCollection.java | 1 + .../java/org/jfree/data/time/TimeSeries.java | 23 ++++++-- .../jfree/data/time/TimeSeriesCollection.java | 6 +- .../jfree/data/time/TimeTableXYDataset.java | 9 ++- src/main/java/org/jfree/data/time/Week.java | 13 +++-- src/main/java/org/jfree/data/time/Year.java | 14 +++-- .../data/time/ohlc/OHLCSeriesCollection.java | 1 + .../general/TestIntervalCategoryDataset.java | 2 + 43 files changed, 221 insertions(+), 109 deletions(-) diff --git a/src/main/java/org/jfree/data/ComparableObjectSeries.java b/src/main/java/org/jfree/data/ComparableObjectSeries.java index 8a4a1a463..79f04d8f6 100644 --- a/src/main/java/org/jfree/data/ComparableObjectSeries.java +++ b/src/main/java/org/jfree/data/ComparableObjectSeries.java @@ -218,10 +218,11 @@ protected void add(ComparableObjectItem item, boolean notify) { Args.nullNotPermitted(item, "item"); if (this.autoSort) { - @SuppressWarnings("index") // binary search on list - /*@SearchIndexFor("this.data")*/ int index = Collections.binarySearch(this.data, item); + int index = Collections.binarySearch(this.data, item); if (index < 0) { - this.data.add(-index - 1, item); + @SuppressWarnings("index") // binary search on list + /*@NonNegative*/ int reverseIndex = -index - 1; + this.data.add(reverseIndex, item); } else { if (this.allowDuplicateXValues) { diff --git a/src/main/java/org/jfree/data/DataUtils.java b/src/main/java/org/jfree/data/DataUtils.java index 8060382fb..37a118121 100644 --- a/src/main/java/org/jfree/data/DataUtils.java +++ b/src/main/java/org/jfree/data/DataUtils.java @@ -47,7 +47,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.Arrays; @@ -240,10 +240,10 @@ public static Number[] createNumberArray(double[] data) { * * @return An array of {@code double}. */ - public static Number /*@SameLen("#1")*/ [][] createNumberArray2D(double[][] data) { + public static Number /*@SameLen("#1")*/ /*@PolyLength*/ [][] createNumberArray2D(double /*@PolyLength*/ [][] data) { Args.nullNotPermitted(data, "data"); int l1 = data.length; - Number[][] result = new Number[l1][]; + Number[][] result = new Number[data.length][]; for (int i = 0; i < l1; i++) { result[i] = createNumberArray(data[i]); } diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java index 6beefdc1d..c968b56ea 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java @@ -57,6 +57,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -130,6 +131,7 @@ public DefaultKeyedValues2D(boolean sortRowKeys) { * @see #getRowCount() */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { return this.columnKeys.size(); } @@ -145,6 +147,7 @@ public DefaultKeyedValues2D(boolean sortRowKeys) { * @see #getValue(Comparable, Comparable) */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { Number result = null; DefaultKeyedValues rowData = (DefaultKeyedValues) this.rows.get(row); diff --git a/src/main/java/org/jfree/data/KeyToGroupMap.java b/src/main/java/org/jfree/data/KeyToGroupMap.java index 7b9cec628..a98644c85 100644 --- a/src/main/java/org/jfree/data/KeyToGroupMap.java +++ b/src/main/java/org/jfree/data/KeyToGroupMap.java @@ -44,6 +44,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; @@ -100,6 +101,7 @@ public KeyToGroupMap(Comparable defaultGroup) { * * @return The number of groups in the map. */ + /*@Pure*/ public /*@Positive*/ int getGroupCount() { return this.groups.size() + 1; } diff --git a/src/main/java/org/jfree/data/Values2D.java b/src/main/java/org/jfree/data/Values2D.java index 16d0b7e53..817dc4b4c 100644 --- a/src/main/java/org/jfree/data/Values2D.java +++ b/src/main/java/org/jfree/data/Values2D.java @@ -39,6 +39,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ /** @@ -58,6 +59,7 @@ public interface Values2D { * * @return The column count. */ + /*@Pure*/ public /*@NonNegative*/ int getColumnCount(); /** @@ -71,6 +73,7 @@ public interface Values2D { * @throws IndexOutOfBoundsException if the {@code row} * or {@code column} is out of bounds. */ + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); } diff --git a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java index 8c3269705..773de7641 100644 --- a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java @@ -47,7 +47,8 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.dataflow.qual.Pure; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -98,6 +99,7 @@ public DefaultCategoryDataset() { * @see #getRowCount() */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } @@ -114,6 +116,7 @@ public DefaultCategoryDataset() { * @see #removeValue(Comparable, Comparable) */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.data.getValue(row, column); } diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index bbf46cf60..4e43c3e0d 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -47,11 +47,9 @@ */ package org.jfree.data.category; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ - -/*>>> -import org.checkerframework.checker.index.qual.NonNegative; - */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.util.ArrayList; import java.util.Arrays; @@ -412,6 +410,7 @@ public Number getValue(Comparable series, Comparable category) { * @see #getEndValue(int, int) */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { return getEndValue(series, category); } @@ -724,6 +723,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getRowCount() */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { return this.categoryKeys.length; } diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index 18c5af0b0..f2d89ea18 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -40,6 +40,7 @@ */ package org.jfree.data.category; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -279,6 +280,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The column count. */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { int last = lastCategoryIndex(); if (last == -1) { @@ -308,6 +310,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The value (possibly {@code null}). */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.underlying.getValue(row, column + this.firstCategoryIndex); } diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index 6f2605761..bf143f733 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -39,6 +39,7 @@ */ package org.jfree.data.gantt; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> @@ -281,6 +282,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The column count. */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { int last = lastCategoryIndex(); if (last == -1) { @@ -310,6 +312,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The value (possibly {@code null}). */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return this.underlying.getValue(row, column + this.firstCategoryIndex); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 6f9840734..828a4d13a 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -50,6 +50,7 @@ */ package org.jfree.data.gantt; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> @@ -181,6 +182,7 @@ public List getRowKeys() { * @return The column count. */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { return this.keys.size(); } @@ -359,6 +361,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The start value. */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getStartValue(row, column); } diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 2f494afab..9390c0363 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -1752,6 +1752,7 @@ public static Number findMinimumRangeValue(CategoryDataset dataset) { IntervalCategoryDataset icd = (IntervalCategoryDataset) dataset; Number valueTmp = icd.getStartValue(series, item); + value = valueTmp; } else { value = dataset.getValue(series, item); @@ -2039,6 +2040,9 @@ public static Range findStackedRangeBounds(CategoryDataset dataset, for (int item = 0; item < categoryCount; item++) { double[] positive = new double[groupCount]; double[] negative = new double[groupCount]; + @SuppressWarnings("index") // group indices are all <= group count by definition + /*@IndexFor({"positive", "negative", "maximum", "minimum"})*/ int[] groupIndexTmp = groupIndex; + groupIndex = groupIndexTmp; for (int series = 0; series < rowCount; series++) { Number number = dataset.getValue(series, item); if (number != null) { @@ -2280,7 +2284,7 @@ public static Range findCumulativeRangeBounds(CategoryDataset dataset) { */ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, double x) { // delegate null check on dataset - int[] indices = findItemIndicesForX(dataset, series, x); + /*@IndexOrLow("dataset.getSeries(series)")*/ int[] indices = findItemIndicesForX(dataset, series, x); if (indices[0] == -1) { return Double.NaN; } @@ -2324,9 +2328,10 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, } if (itemCount == 1) { @SuppressWarnings("index") // 0 is a valid index, because itemCount is at least 1 - double xValue = dataset.getXValue(series, 0); + /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + double xValue = dataset.getXValue(series, zero); if (x == xValue) { - return new int[] {0, 0}; + return new int[] {zero, zero}; } else { return new int[] {-1, -1}; } @@ -2399,10 +2404,11 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // we don't know anything about the ordering of the x-values, // so we iterate until we find the first crossing of x (if any) // we know there are at least 2 items in the series at this point - @SuppressWarnings("index") // 0 is an index because itemCount > 1 - double prev = dataset.getXValue(series, 0); + @SuppressWarnings("index") // 0 is a valid index, because itemCount is at least 1 + /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + double prev = dataset.getXValue(series, zero); if (x == prev) { - return new int[] {0, 0}; // exact match on first item + return new int[] {zero, zero}; // exact match on first item } for (int i = 1; i < itemCount; i++) { double next = dataset.getXValue(series, i); diff --git a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java index 114ecb876..1e2546b19 100644 --- a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java @@ -41,7 +41,6 @@ package org.jfree.data.general; /*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; @@ -345,6 +344,7 @@ public boolean equals(Object obj) { * cloning. */ @Override + @SuppressWarnings({"index", "value"}) // clone's internal state and this object's internal state are the same. Not inferred by SameLen Checker. public Object clone() throws CloneNotSupportedException { DefaultHeatMapDataset clone = (DefaultHeatMapDataset) super.clone(); clone.zValues = DataUtils.clone(this.zValues); diff --git a/src/main/java/org/jfree/data/io/CSV.java b/src/main/java/org/jfree/data/io/CSV.java index 105ee08b5..9ac0868fa 100644 --- a/src/main/java/org/jfree/data/io/CSV.java +++ b/src/main/java/org/jfree/data/io/CSV.java @@ -40,6 +40,9 @@ package org.jfree.data.io; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ + import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; @@ -196,9 +199,9 @@ private void extractRowKeyAndData(String line, * * @return The key without delimiters. */ + @SuppressWarnings({"index", "value"}) // I manually audited this. It relies on several properties of the passed String that I can't express: that removing whitespace leaves a MinLen(1) string, that if the first character of the trimmed string is a delimiter, there is another character, that if the last character is a delimiter, it isn't the only character private String removeStringDelimiters(String key) { - @SuppressWarnings({"index", "value"}) // key must have a non-whitespace value is a precondition of this function - /*@MinLen(1)*/ String k = key.trim(); + String k = key.trim(); if (k.charAt(0) == this.textDelimiter) { k = k.substring(1); } diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java index 17caaada3..eeb953e56 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java @@ -193,7 +193,9 @@ public static double calculateQ1(List values) { } } else { - result = Statistics.calculateMedian(values, 0, count / 2 - 1); + @SuppressWarnings("index") // since count is a nonnegative even number, this expression is >= 0 + /*@NonNegative*/ int count1 = count / 2 - 1; + result = Statistics.calculateMedian(values, 0, count1); } } diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java index 85ea1bb40..7aacae8c1 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java @@ -55,6 +55,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ import java.util.List; @@ -318,6 +319,7 @@ public BoxAndWhiskerItem getItem(/*@NonNegative*/ int row, /*@NonNegative*/ int * @see #getValue(Comparable, Comparable) */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getMedianValue(row, column); } @@ -609,6 +611,7 @@ public List getRowKeys() { * @see #getRowCount() */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index 5618cdb96..afb13552a 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -217,6 +217,7 @@ public void setFaroutCoefficient(double faroutCoefficient) { * @return The number of items in the specified series. */ @Override + @SuppressWarnings("index") // establish repr. invariant public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.dates.size(); } diff --git a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java index ca302931c..053a8fc7e 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java @@ -41,6 +41,7 @@ */ package org.jfree.data.statistics; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ import java.util.ArrayList; @@ -227,6 +228,7 @@ public Number getValue(Comparable row, Comparable column) { * @return The average value. */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { List l = (List) this.data.getObject(row, column); double average = 0.0d; @@ -331,6 +333,7 @@ public List getRowKeys() { * @return The column count. */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } diff --git a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java index 4509c181c..64171c602 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java @@ -56,7 +56,8 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.dataflow.qual.Pure; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.util.List; @@ -174,6 +175,7 @@ public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column * @return The value (possibly {@code null}). */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return getMeanValue(row, column); } @@ -339,6 +341,7 @@ public List getRowKeys() { * @see #getRowCount() */ @Override + /*@Pure*/ public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); } diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index c6be31f9a..3a273b731 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -339,6 +339,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override + @SuppressWarnings("index") // establish repr. invariant public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getBins(series).size(); } diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index ee2ed107b..8f937ee1f 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -263,7 +263,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, } double[][] data = new double[2][itemCount]; @SuppressWarnings("index") // validItems will only be used as a index if there is at least one item - /*@IndexFor(value={"data[0]","data[1]"}, offset={"0","0"})*/ int validItems = 0; + /*@LTLengthOf(value={"data[0]","data[1]"}, offset={"0","0"})*/ /*@NonNegative*/ int validItems = 0; for(int item = 0; item < itemCount; item++){ double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); @@ -271,7 +271,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, data[0][validItems] = x; data[1][validItems] = y; @SuppressWarnings("index") // validItems is incremented at most as often as item, which is a valid index - /*@IndexFor(value={"data[0]","data[1]"}, offset={"0","0"})*/ int validItemsTmp = validItems + 1; + /*@LTLengthOf(value={"data[0]","data[1]"}, offset={"0","0"})*/ /*@NonNegative*/ int validItemsTmp = validItems + 1; validItems = validItemsTmp; } } diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index bccc19325..2f42ddbcb 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -244,7 +244,7 @@ public static double calculateMedian(List values, boolean copyAndSort) { * * @return The median. */ - public static double calculateMedian(List values, int start, int end) { + public static double calculateMedian(List values, /*@NonNegative*/ int start, /*@NonNegative*/ int end) { return calculateMedian(values, start, end, true); } @@ -460,13 +460,17 @@ public static double getCorrelation(Number /*@SameLen("#2")*/ [] data1, Number / @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 xData.length > period /*@NonNegative*/ int resultLen = xData.length - period; - double[][] result = new double[resultLen][2]; + double[] /*@ArrayLen(2)*/ [] result = new double[resultLen][2]; for (int i = 0; i < result.length; i++) { - result[i][0] = xData[i + period].doubleValue(); + @SuppressWarnings("index") // result's length is exactly xData.length - period, so adding period to an index for result is always an index for xData + /*@IndexFor("xData")*/ int iPeriod = i + period; + result[i][0] = xData[iPeriod].doubleValue(); // holds the moving average sum double sum = 0.0; for (int j = 0; j < period; j++) { - sum += yData[i + j].doubleValue(); + @SuppressWarnings("index") // result's length is exactly yData.length - period, so adding a nonnegative value less than period to an index for result is always an index for yData + /*@IndexFor("yData")*/ int ij = i + j; + sum += yData[ij].doubleValue(); } sum = sum / period; result[i][1] = sum; diff --git a/src/main/java/org/jfree/data/time/Day.java b/src/main/java/org/jfree/data/time/Day.java index ba2e5fe12..c285e2147 100644 --- a/src/main/java/org/jfree/data/time/Day.java +++ b/src/main/java/org/jfree/data/time/Day.java @@ -173,7 +173,7 @@ public Day(Date time, TimeZone zone, Locale locale) { int d = calendar.get(Calendar.DAY_OF_MONTH); int m = calendar.get(Calendar.MONTH) + 1; int y = calendar.get(Calendar.YEAR); - @SuppressWarnings("index") // Calendar needs index annotations + @SuppressWarnings({"index", "value"}) // Calendar needs index annotations SerialDate tmpDate = SerialDate.createInstance(d, m, y); this.serialDate = tmpDate; peg(calendar); diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 2bd568052..d9f5e1aaf 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -180,7 +180,7 @@ public float getData(/*@IndexFor("this")*/ int index) { } /** An array for storing the objects that represent each series. */ - protected ValueSequence /*@SameLen("this.seriesKeys")*/ [] valueHistory; + protected /*@SameLen("this.pointsInTime")*/ ValueSequence /*@SameLen("this.seriesKeys")*/ [] valueHistory; /** A working calendar (to recycle) */ protected Calendar workingCalendar; @@ -404,19 +404,23 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, + "cannot add more series than specified in c'tor"); } if (this.valueHistory[seriesNumber] == null) { - this.valueHistory[seriesNumber] - = new ValueSequence(this.historyCount); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); + this.valueHistory[seriesNumber] = valueSequence; this.seriesCount++; } // But if that series array already exists, just overwrite its contents // Avoid IndexOutOfBoundsException: int srcLength = values.length; - int copyLength = this.historyCount; + @SuppressWarnings("index") // this.valueHistory[seriesNumber]'s length is <= this.historyCount + /*@LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"})*/ int copyLength = this.historyCount; boolean fillNeeded = false; if (srcLength < this.historyCount) { fillNeeded = true; - copyLength = srcLength; + @SuppressWarnings("index") // this.valueHistory[seriesNumber]'s length is <= this.historyCount + /*@LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"})*/ int newCopyLength = srcLength; + copyLength = newCopyLength; } //{ for (i = 0; i < copyLength; i++) { // deep copy from values[], caller @@ -452,7 +456,7 @@ public void setSeriesKey(/*@IndexFor("this.seriesKeys")*/ int seriesNumber, Comp * @param index ??. * @param value the value. */ - public void addValue(/*@NonNegative*/ int seriesNumber, /*@NonNegative*/ int index, float value) { + public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSeries(#1)")*/ int index, float value) { invalidateRangeInfo(); if (seriesNumber >= this.valueHistory.length) { throw new IllegalArgumentException( @@ -461,8 +465,9 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@NonNegative*/ int ind ); } if (this.valueHistory[seriesNumber] == null) { - this.valueHistory[seriesNumber] - = new ValueSequence(this.historyCount); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); + this.valueHistory[seriesNumber] = valueSequence; this.seriesCount++; } // But if that series array already exists, just overwrite its contents @@ -494,6 +499,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@NonNegative*/ int ind * @return The item count. */ @Override + @SuppressWarnings("index") // establish repr. invariant public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, // so ignore argument: return this.historyCount; @@ -505,10 +511,12 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@NonNegative*/ int ind * Re-map an index, for use in retrieving data. * * @param toFetch the index. + * @param series a ghost variable necessary for the annotations * * @return The translated index. */ - protected /*@NonNegative*/ int translateGet(/*@NonNegative*/ int toFetch) { + @SuppressWarnings("index") // internal method that breaks abstraction boundaries + protected /*@IndexFor("this.pointsInTime")*/ int translateGet(/*@IndexFor("this.getSeries(#2)")*/ int toFetch, int series) { if (this.oldestAt == 0) { return toFetch; // no translation needed } @@ -603,13 +611,13 @@ public synchronized RegularTimePeriod advanceTime() { // Now advance "oldestAt", wrapping at end of the array int newOldestAt; if (this.oldestAt >= this.historyCount) { - @SuppressWarnings("index") // the check right below ensures this doesn't go out of bounds for more than a few insr - /*@IndexFor("this.pointsInTime")*/ int tmp = 0; - newOldestAt = tmp; + newOldestAt = 0; } else { newOldestAt = this.oldestAt + 1; } - this.oldestAt = newOldestAt; + @SuppressWarnings("index") // the check right above ensures this doesn't go out of bounds + /*@IndexFor("this.pointsInTime")*/ int tmp = newOldestAt; + this.oldestAt = tmp; // Update the domain limits: long startL = this.domainStart.longValue(); //(time is kept in msec) this.domainStart = new Long(startL + this.deltaTime); @@ -686,7 +694,9 @@ public void appendData(float[] newData) { // check whether the "valueHistory" array member exists; if not, // create them: if (this.valueHistory[s] == null) { - this.valueHistory[s] = new ValueSequence(this.historyCount); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); + this.valueHistory[s] = valueSequence; } this.valueHistory[s].enterData(this.newestAt, newData[s]); } @@ -701,7 +711,7 @@ public void appendData(float[] newData) { * @param refresh value of n in "refresh the display on every nth call" * (ignored if <= 0 ) */ - public void appendData(float[] newData, int insertionIndex, int refresh) { + public void appendData(float[] newData, /*@IndexFor("this.pointsInTime")*/ int insertionIndex, int refresh) { int nDataPoints = newData.length; if (nDataPoints > this.valueHistory.length) { throw new IllegalArgumentException( @@ -709,7 +719,9 @@ public void appendData(float[] newData, int insertionIndex, int refresh) { } for (int s = 0; s < nDataPoints; s++) { if (this.valueHistory[s] == null) { - this.valueHistory[s] = new ValueSequence(this.historyCount); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); + this.valueHistory[s] = valueSequence; } this.valueHistory[s].enterData(insertionIndex, newData[s]); } @@ -751,7 +763,7 @@ public RegularTimePeriod getOldestTime() { // Don't synchronize this!! Instead, synchronize the loop that calls it. @Override public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; + RegularTimePeriod tp = this.pointsInTime[translateGet(item, series)]; return new Long(getX(tp)); } @@ -767,8 +779,9 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { // Don't synchronize this!! // Instead, synchronize the loop that calls it. + @SuppressWarnings("index") // every other class that implements these interfaces uses a list to store series, so the annotation here is wrong ValueSequence values = this.valueHistory[series]; - return values.getData(translateGet(item)); + return values.getData(translateGet(item, series)); } /** @@ -794,7 +807,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; + RegularTimePeriod tp = this.pointsInTime[translateGet(item, series)]; return new Long(tp.getFirstMillisecond(this.workingCalendar)); } @@ -808,7 +821,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - RegularTimePeriod tp = this.pointsInTime[translateGet(item)]; + RegularTimePeriod tp = this.pointsInTime[translateGet(item, series)]; return new Long(tp.getLastMillisecond(this.workingCalendar)); } @@ -857,7 +870,8 @@ public float getUntranslatedY(int series, @NonNegative int item) * @return The key. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + @SuppressWarnings("index") // every other class that implements this interface backs the series with a list, so the annotation on this class don't correspond to the ones on the interface + public Comparable getSeriesKey(/*@IndexFor("this.seriesKeys")*/ int series) { return this.seriesKeys[series]; } diff --git a/src/main/java/org/jfree/data/time/Hour.java b/src/main/java/org/jfree/data/time/Hour.java index 9bdf7c3c6..1ab4aa691 100644 --- a/src/main/java/org/jfree/data/time/Hour.java +++ b/src/main/java/org/jfree/data/time/Hour.java @@ -65,7 +65,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -93,7 +93,7 @@ public class Hour extends RegularTimePeriod implements Serializable { private Day day; /** The hour. */ - private byte hour; + /*@IntRange(from = 0, to = 23)*/ private byte hour; /** The first millisecond. */ private long firstMillisecond; @@ -156,6 +156,7 @@ public Hour(Date time) { * * @since 1.0.13 */ + @SuppressWarnings({"value", "index"}) // calendar needs index annotations public Hour(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); diff --git a/src/main/java/org/jfree/data/time/Millisecond.java b/src/main/java/org/jfree/data/time/Millisecond.java index bd202c599..d951b0f77 100644 --- a/src/main/java/org/jfree/data/time/Millisecond.java +++ b/src/main/java/org/jfree/data/time/Millisecond.java @@ -59,7 +59,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -86,16 +86,16 @@ public class Millisecond extends RegularTimePeriod implements Serializable { private Day day; /** The hour in the day. */ - private byte hour; + /*@IntRange(from = 0, to = 23)*/ private byte hour; /** The minute. */ - private byte minute; + /*@IntRange(from = 0, to = 59)*/ private byte minute; /** The second. */ - private byte second; + /*@IntRange(from = 0, to = 59)*/ private byte second; /** The millisecond. */ - private int millisecond; + /*@IntRange(from = 0, to = 999)*/ private int millisecond; /** * The pegged millisecond. @@ -162,6 +162,7 @@ public Millisecond(Date time) { * * @since 1.0.13 */ + @SuppressWarnings({"value", "index"}) // calendar needs index annotations public Millisecond(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/Minute.java b/src/main/java/org/jfree/data/time/Minute.java index d482a045f..a49753f56 100644 --- a/src/main/java/org/jfree/data/time/Minute.java +++ b/src/main/java/org/jfree/data/time/Minute.java @@ -66,7 +66,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -94,10 +94,10 @@ public class Minute extends RegularTimePeriod implements Serializable { private Day day; /** The hour in which the minute falls. */ - private byte hour; + /*@IntRange(from = 0, to = 23)*/ private byte hour; /** The minute. */ - private byte minute; + /*@IntRange(from = 0, to = 59)*/ private byte minute; /** The first millisecond. */ private long firstMillisecond; @@ -201,7 +201,7 @@ public Hour getHour() { * * @since 1.0.3 */ - public int getHourValue() { + public /*@IntRange(from = 0, to = 23)*/ int getHourValue() { return this.hour; } @@ -210,7 +210,7 @@ public int getHourValue() { * * @return The minute. */ - public int getMinute() { + public /*@IntRange(from = 0, to = 59)*/ int getMinute() { return this.minute; } diff --git a/src/main/java/org/jfree/data/time/Month.java b/src/main/java/org/jfree/data/time/Month.java index dc2472063..60dee532c 100644 --- a/src/main/java/org/jfree/data/time/Month.java +++ b/src/main/java/org/jfree/data/time/Month.java @@ -65,7 +65,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -88,7 +88,7 @@ public class Month extends RegularTimePeriod implements Serializable { private /*@IntRange(from = 1, to = 12)*/ int month; /** The year in which the month falls. */ - private /*@IntRange(from = 1900, to = 9999)*/ int year; + private /*@IntRange(from = -9999, to = 9999)*/ int year; /** The first millisecond. */ private long firstMillisecond; @@ -155,6 +155,7 @@ public Month(Date time) { * * @since 1.0.12 */ + @SuppressWarnings({"index", "value"}) // Calendar needs index annotations public Month(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); @@ -440,6 +441,7 @@ public long getLastMillisecond(Calendar calendar) { * @return {@code null} if the string is not parseable, the month * otherwise. */ + @SuppressWarnings({"value", "index"}) // This method repeatedly assumes properties of the String s, especially that it is "wellformed" according to the documentation (i.e. either YYYY-MM or MM-YYYY) public static Month parseMonth(String s) { Month result = null; if (s == null) { diff --git a/src/main/java/org/jfree/data/time/MovingAverage.java b/src/main/java/org/jfree/data/time/MovingAverage.java index 89564e2b4..c53bbf072 100644 --- a/src/main/java/org/jfree/data/time/MovingAverage.java +++ b/src/main/java/org/jfree/data/time/MovingAverage.java @@ -49,8 +49,8 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -302,6 +302,7 @@ public static XYSeries createMovingAverage(XYDataset source, // if the initial averaging period is to be excluded, then // calculate the lowest x-value to have an average calculated... + @SuppressWarnings("index") // item count was checked just above to be greater than zero, so zero is an index double first = source.getXValue(series, 0) + skip; for (int i = source.getItemCount(series) - 1; i >= 0; i--) { @@ -318,9 +319,10 @@ public static XYSeries createMovingAverage(XYDataset source, boolean finished = false; while (!finished) { - if ((i - offset) >= 0) { - double xx = source.getXValue(series, i - offset); - Number yy = source.getY(series, i - offset); + int ioff = i - offset; + if (ioff >= 0) { + double xx = source.getXValue(series, ioff); + Number yy = source.getY(series, ioff); if (xx > limit) { if (yy != null) { sum = sum + yy.doubleValue(); diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index 2b4776c5d..ede2a8831 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -96,13 +96,13 @@ public class Quarter extends RegularTimePeriod implements Serializable { }; /** The last month in each quarter. */ - public static final int /*@ArrayLen(5)*/ [] LAST_MONTH_IN_QUARTER = { + public static final /*@IntRange(from = 0, to = 12)*/ int /*@ArrayLen(5)*/ [] LAST_MONTH_IN_QUARTER = { 0, MonthConstants.MARCH, MonthConstants.JUNE, MonthConstants.SEPTEMBER, MonthConstants.DECEMBER }; /** The year in which the quarter falls. */ - private short year; + /*@IntRange(from = -9999, to = 9999)*/ private short year; /** The quarter (1-4). */ private /*@IntVal({1,2,3,4})*/ byte quarter; @@ -172,6 +172,7 @@ public Quarter(Date time) { * * @since 1.0.12 */ + @SuppressWarnings({"index", "value"}) // Calendar needs index annotations public Quarter(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); @@ -441,7 +442,8 @@ public long getFirstMillisecond(Calendar calendar) { */ @Override public long getLastMillisecond(Calendar calendar) { - int month = Quarter.LAST_MONTH_IN_QUARTER[this.quarter]; + @SuppressWarnings({"index", "value"}) // this.quarter is always 1, 2, 3, or 4 - and only the 0th element of this array is out of the range 1-12 + /*@IntRange(from = 1, to = 12)*/ int month = Quarter.LAST_MONTH_IN_QUARTER[this.quarter]; int eom = SerialDate.lastDayOfMonth(month, this.year); calendar.set(this.year, month - 1, eom, 23, 59, 59); calendar.set(Calendar.MILLISECOND, 999); @@ -457,6 +459,7 @@ public long getLastMillisecond(Calendar calendar) { * * @return The quarter. */ + @SuppressWarnings({"index", "value"}) // parse method relies on string being properly formatted public static Quarter parseQuarter(String s) { // find the Q and the integer following it (remove both from the diff --git a/src/main/java/org/jfree/data/time/RegularTimePeriod.java b/src/main/java/org/jfree/data/time/RegularTimePeriod.java index a396266bf..3d61763b6 100644 --- a/src/main/java/org/jfree/data/time/RegularTimePeriod.java +++ b/src/main/java/org/jfree/data/time/RegularTimePeriod.java @@ -53,6 +53,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ import java.lang.reflect.Constructor; import java.util.Calendar; @@ -177,6 +178,7 @@ else if (c.equals(Second.class)) { * @see #getFirstMillisecond() */ @Override + /*@Pure*/ public Date getStart() { return new Date(getFirstMillisecond()); } diff --git a/src/main/java/org/jfree/data/time/Second.java b/src/main/java/org/jfree/data/time/Second.java index 98a6b2009..1ce299cd8 100644 --- a/src/main/java/org/jfree/data/time/Second.java +++ b/src/main/java/org/jfree/data/time/Second.java @@ -61,7 +61,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -89,13 +89,13 @@ public class Second extends RegularTimePeriod implements Serializable { private Day day; /** The hour of the day. */ - private byte hour; + /*@IntRange(from = 0, to = 23)*/ private byte hour; /** The minute. */ - private byte minute; + /*@IntRange(from = 0, to = 59)*/ private byte minute; /** The second. */ - private byte second; + /*@IntRange(from = 0, to = 59)*/ private byte second; /** * The first millisecond. We don't store the last millisecond, because it @@ -163,6 +163,7 @@ public Second(Date time) { * * @since 1.0.13 */ + @SuppressWarnings({"value", "index"}) // calendar needs index annotations public Second(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); @@ -178,7 +179,7 @@ public Second(Date time, TimeZone zone, Locale locale) { * * @return The second (0 - 59). */ - public int getSecond() { + public /*@IntRange(from = 0, to = 59)*/ int getSecond() { return this.second; } diff --git a/src/main/java/org/jfree/data/time/SimpleTimePeriod.java b/src/main/java/org/jfree/data/time/SimpleTimePeriod.java index 9e081a1c5..8a872750d 100644 --- a/src/main/java/org/jfree/data/time/SimpleTimePeriod.java +++ b/src/main/java/org/jfree/data/time/SimpleTimePeriod.java @@ -45,6 +45,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ import java.io.Serializable; import java.util.Date; @@ -97,6 +98,7 @@ public SimpleTimePeriod(Date start, Date end) { * @return The start date/time (never {@code null}). */ @Override + /*@Pure*/ public Date getStart() { return new Date(this.start); } diff --git a/src/main/java/org/jfree/data/time/TimePeriod.java b/src/main/java/org/jfree/data/time/TimePeriod.java index f1b1a7ec7..0ad578fc3 100644 --- a/src/main/java/org/jfree/data/time/TimePeriod.java +++ b/src/main/java/org/jfree/data/time/TimePeriod.java @@ -41,6 +41,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ import java.util.Date; @@ -56,6 +57,7 @@ public interface TimePeriod extends Comparable { * * @return The start date/time (never {@code null}). */ + /*@Pure*/ public Date getStart(); /** diff --git a/src/main/java/org/jfree/data/time/TimePeriodValue.java b/src/main/java/org/jfree/data/time/TimePeriodValue.java index b403f9fb6..0a3fad619 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValue.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValue.java @@ -42,6 +42,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ import java.io.Serializable; import org.jfree.chart.util.Args; @@ -91,6 +92,7 @@ public TimePeriodValue(TimePeriod period, double value) { * * @return The time period (never {@code null}). */ + /*@Pure*/ public TimePeriod getPeriod() { return this.period; } diff --git a/src/main/java/org/jfree/data/time/TimePeriodValues.java b/src/main/java/org/jfree/data/time/TimePeriodValues.java index 875a9a4d6..0b43bb8a3 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValues.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValues.java @@ -47,6 +47,7 @@ */ package org.jfree.data.time; +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.GTENegativeOne; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -203,6 +204,7 @@ public void setRangeDescription(String description) { * * @return One data item for the series. */ + /*@Pure*/ public TimePeriodValue getDataItem(/*@NonNegative*/ int index) { return (TimePeriodValue) this.data.get(index); } @@ -244,7 +246,9 @@ public Number getValue(/*@NonNegative*/ int index) { public void add(TimePeriodValue item) { Args.nullNotPermitted(item, "item"); this.data.add(item); - updateBounds(item.getPeriod(), this.data.size() - 1); + @SuppressWarnings("index") // data.size is positive because we just added an item to data on the previous line + /*@NonNegative*/ int lastIndex = this.data.size() - 1; + updateBounds(item.getPeriod(), lastIndex); fireSeriesChanged(); } @@ -281,11 +285,13 @@ private void updateBounds(TimePeriod period, /*@NonNegative*/ int index) { else { this.maxStartIndex = index; } - - if (this.minMiddleIndex >= 0) { - long s = getDataItem(this.minMiddleIndex).getPeriod().getStart() + + // don't use field directly to satisfy typechecker that field is not side-effected + int minMiddleIndex = this.minMiddleIndex; + if (minMiddleIndex >= 0) { + long s = getDataItem(minMiddleIndex).getPeriod().getStart() .getTime(); - long e = getDataItem(this.minMiddleIndex).getPeriod().getEnd() + long e = getDataItem(minMiddleIndex).getPeriod().getEnd() .getTime(); long minMiddle = s + (e - s) / 2; if (middle < minMiddle) { @@ -295,11 +301,13 @@ private void updateBounds(TimePeriod period, /*@NonNegative*/ int index) { else { this.minMiddleIndex = index; } - - if (this.maxMiddleIndex >= 0) { - long s = getDataItem(this.maxMiddleIndex).getPeriod().getStart() + + // don't use field directly to satisfy typechecker that field is not side-effected + int maxMiddleIndex = this.maxMiddleIndex; + if (maxMiddleIndex >= 0) { + long s = getDataItem(maxMiddleIndex).getPeriod().getStart() .getTime(); - long e = getDataItem(this.maxMiddleIndex).getPeriod().getEnd() + long e = getDataItem(maxMiddleIndex).getPeriod().getEnd() .getTime(); long maxMiddle = s + (e - s) / 2; if (middle > maxMiddle) { @@ -496,7 +504,7 @@ public Object clone() throws CloneNotSupportedException { * * @throws CloneNotSupportedException if there is a cloning problem. */ - public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@NonNegative*/ int end) + public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@GTENegativeOne*/ int end) throws CloneNotSupportedException { TimePeriodValues copy = (TimePeriodValues) super.clone(); diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index f66a85af8..fbfb7e102 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -383,6 +383,7 @@ public double getDomainUpperBound(boolean includeInterval) { * @return The range. */ @Override + @SuppressWarnings("index") // every call to getXIndex in this method (there are a lot) is guarded by the if (count > 0) check, which ensures that those values can't be negative. public Range getDomainBounds(boolean includeInterval) { boolean interval = includeInterval; Range result = null; diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index c82280c0e..c7d13fde3 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -303,7 +303,9 @@ public void setMaximumItemCount(/*@NonNegative*/ int maximum) { this.maximumItemCount = maximum; int count = this.data.size(); if (count > maximum) { - delete(0, count - maximum - 1); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 + /*@NonNegative*/ int deleteIndex = count - maximum - 1; + delete(0, deleteIndex); } } @@ -682,7 +684,7 @@ else if (!this.timePeriodClass.equals(c)) { added = true; } else { - RegularTimePeriod last = getTimePeriod(getItemCount() - 1); + RegularTimePeriod last = getTimePeriod(count - 1); if (item.getPeriod().compareTo(last) > 0) { this.data.add(item); added = true; @@ -690,7 +692,9 @@ else if (!this.timePeriodClass.equals(c)) { else { int index = Collections.binarySearch(this.data, item); if (index < 0) { - this.data.add(-index - 1, item); + @SuppressWarnings("index") // binary search on list + /*@NonNegative*/ int index1 = -index - 1; + this.data.add(index1, item); added = true; } else { @@ -939,7 +943,9 @@ else if (item.getValue() != null) { } else { item = (TimeSeriesDataItem) item.clone(); - this.data.add(-index - 1, item); + @SuppressWarnings("index") // binary search on list + /*@NonNegative*/ int index1 = -index - 1; + this.data.add(index1, item); updateBoundsForAddedItem(item); // check if this addition will exceed the maximum item count... @@ -967,8 +973,9 @@ else if (item.getValue() != null) { public void removeAgedItems(boolean notify) { // check if there are any values earlier than specified by the history // count... - if (getItemCount() > 1) { - long latest = getTimePeriod(getItemCount() - 1).getSerialIndex(); + int count = getItemCount(); + if (count > 1) { + long latest = getTimePeriod(count - 1).getSerialIndex(); boolean removed = false; while ((latest - getTimePeriod(0).getSerialIndex()) > this.maximumItemAge) { @@ -1211,6 +1218,10 @@ public TimeSeries createCopy(RegularTimePeriod start, RegularTimePeriod end) copy.data = new java.util.ArrayList(); return copy; } + @SuppressWarnings("index") // if endIndex < 0, emptyRange is true, so the function returns before we get here. + /*@NonNegative*/ int endIndex1 = endIndex; + endIndex = endIndex1; + return createCopy(startIndex, endIndex); } diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index e013a8827..a965b03ae 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -1,3 +1,4 @@ + /* =========================================================== * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== @@ -87,7 +88,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> @@ -543,8 +544,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# */ public int /*@ArrayLen(2)*/ [] getSurroundingItems(/*@NonNegative*/ int series, long milliseconds) { int[] result = new int[] {-1, -1}; - TimeSeries timeSeries = getSeries(series); - for (int i = 0; i < timeSeries.getItemCount(); i++) { + for (int i = 0; i < this.getItemCount(series); i++) { Number x = getX(series, i); long m = x.longValue(); if (m <= milliseconds) { diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index fd8567458..51dca3cbb 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -56,8 +56,8 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -328,6 +328,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { * @return The number of items within the series. */ @Override + @SuppressWarnings("index") // establish repr. invariant public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getItemCount(); } @@ -557,7 +558,9 @@ public Range getDomainBounds(boolean includeInterval) { } TimePeriod first = (TimePeriod) keys.get(0); - TimePeriod last = (TimePeriod) keys.get(keys.size() - 1); + @SuppressWarnings("index") // keys.isEmpty() call above establishes that this is safe + /*@NonNegative*/ int lastIndex = keys.size() - 1; + TimePeriod last = (TimePeriod) keys.get(lastIndex); if (!includeInterval || this.domainIsPointsInTime) { return new Range(getXValue(first), getXValue(last)); diff --git a/src/main/java/org/jfree/data/time/Week.java b/src/main/java/org/jfree/data/time/Week.java index cb84fbad2..ee678b82b 100644 --- a/src/main/java/org/jfree/data/time/Week.java +++ b/src/main/java/org/jfree/data/time/Week.java @@ -73,7 +73,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -104,7 +104,7 @@ public class Week extends RegularTimePeriod implements Serializable { public static final int LAST_WEEK_IN_YEAR = 53; /** The year in which the week falls. */ - private /*@IntRange(from = 1900, to = 9999)*/ short year; + private /*@IntRange(from = -9999, to = 9999)*/ short year; /** The week (1-53). */ private /*@IntRange(from = 1, to = 53)*/ byte week; @@ -180,6 +180,7 @@ public Week(Date time) { * * @since 1.0.7 */ + @SuppressWarnings({"index", "value"}) // Calendar needs index annotations public Week(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); @@ -302,8 +303,10 @@ public RegularTimePeriod previous() { int yy = this.year - 1; Calendar prevYearCalendar = Calendar.getInstance(); prevYearCalendar.set(yy, Calendar.DECEMBER, 31); - result = new Week(prevYearCalendar.getActualMaximum( + @SuppressWarnings({"index", "value"}) // Calendar.WEEKOFYEAR needs an annotation + Week resultTmp = new Week(prevYearCalendar.getActualMaximum( Calendar.WEEK_OF_YEAR), yy); + result = resultTmp; } else { result = null; @@ -332,7 +335,8 @@ public RegularTimePeriod next() { else { Calendar calendar = Calendar.getInstance(); calendar.set(this.year, Calendar.DECEMBER, 31); - int actualMaxWeek + @SuppressWarnings({"index", "value"}) // Calendar.WEEKOFYEAR needs an annotation + /*@IntRange(from = 52, to = 54)*/ int actualMaxWeek = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); if (this.week < actualMaxWeek) { result = new Week(this.week + 1, this.year); @@ -523,6 +527,7 @@ else if (o1 instanceof RegularTimePeriod) { * @return {@code null} if the string is not parseable, the week * otherwise. */ + @SuppressWarnings({"index", "value"}) // parsing code relies on wellformedness of the String passed in public static Week parseWeek(String s) { Week result = null; diff --git a/src/main/java/org/jfree/data/time/Year.java b/src/main/java/org/jfree/data/time/Year.java index 8a921d3ba..a255ef0d8 100644 --- a/src/main/java/org/jfree/data/time/Year.java +++ b/src/main/java/org/jfree/data/time/Year.java @@ -61,7 +61,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.io.Serializable; import java.util.Calendar; @@ -80,20 +80,20 @@ public class Year extends RegularTimePeriod implements Serializable { * * @since 1.0.11 */ - public static final int MINIMUM_YEAR = -9999; + public static final /*@IntVal(-9999)*/ int MINIMUM_YEAR = -9999; /** * The maximum year value. * * @since 1.0.11 */ - public static final int MAXIMUM_YEAR = 9999; + public static final /*@IntVal(9999)*/ int MAXIMUM_YEAR = 9999; /** For serialization. */ private static final long serialVersionUID = -7659990929736074836L; /** The year. */ - private /*@IntRange(from = 1900, to = 9999)*/ short year; + private /*@IntRange(from = -9999, to = 9999)*/ short year; /** The first millisecond. */ private long firstMillisecond; @@ -113,7 +113,7 @@ public Year() { * * @param year the year. */ - public Year(/*@IntRange(from = 1900, to = 9999)*/ int year) { + public Year(/*@IntRange(from = -9999, to = 9999)*/ int year) { if ((year < Year.MINIMUM_YEAR) || (year > Year.MAXIMUM_YEAR)) { throw new IllegalArgumentException( "Year constructor: year (" + year + ") outside valid range."); @@ -144,6 +144,7 @@ public Year(Date time) { * * @since 1.0.12 */ + @SuppressWarnings({"index", "value"}) // Calendar needs index annotations public Year(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); @@ -156,7 +157,7 @@ public Year(Date time, TimeZone zone, Locale locale) { * * @return The year. */ - public /*@IntRange(from = 1900, to = 9999)*/ int getYear() { + public /*@IntRange(from = -9999, to = 9999)*/ int getYear() { return this.year; } @@ -384,6 +385,7 @@ public String toString() { * @return {@code null} if the string is not parseable, the year * otherwise. */ + @SuppressWarnings({"index", "value"}) // parsing method is intended to throw an exception if the year isn't valid public static Year parseYear(String s) { // parse the string... diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index a9d591784..dd5dcbd68 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -179,6 +179,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override + @SuppressWarnings("index") // establish repr. invariant public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); diff --git a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java index 02d355c78..6295ac64c 100644 --- a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java +++ b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java @@ -85,6 +85,7 @@ public TestIntervalCategoryDataset() { * * @see #getRowCount() */ + /*@Pure*/ @Override public /*@NonNegative*/ int getColumnCount() { return this.data.getColumnCount(); @@ -102,6 +103,7 @@ public TestIntervalCategoryDataset() { * @see #removeValue(Comparable, Comparable) */ @Override + /*@Pure*/ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(row, column); From 8d9a53661ed4a660fdf8e235a871ba99e48f2711 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Wed, 20 Dec 2017 12:32:40 -0800 Subject: [PATCH 15/79] finish annotating/suppressing warnings in data package --- src/main/java/org/jfree/data/DataUtils.java | 4 +- .../DefaultIntervalCategoryDataset.java | 11 ++-- .../org/jfree/data/general/DatasetUtils.java | 32 +++++---- .../statistics/BoxAndWhiskerCalculator.java | 2 + .../org/jfree/data/statistics/Regression.java | 65 ++++++++++++------- .../time/DynamicTimeSeriesCollection.java | 34 +++++++--- src/main/java/org/jfree/data/time/Minute.java | 1 + src/main/java/org/jfree/data/time/Month.java | 2 +- .../java/org/jfree/data/time/Quarter.java | 4 +- src/main/java/org/jfree/data/time/Week.java | 6 +- 10 files changed, 104 insertions(+), 57 deletions(-) diff --git a/src/main/java/org/jfree/data/DataUtils.java b/src/main/java/org/jfree/data/DataUtils.java index 37a118121..0e91398fa 100644 --- a/src/main/java/org/jfree/data/DataUtils.java +++ b/src/main/java/org/jfree/data/DataUtils.java @@ -47,6 +47,7 @@ */ package org.jfree.data; +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -240,7 +241,8 @@ public static Number[] createNumberArray(double[] data) { * * @return An array of {@code double}. */ - public static Number /*@SameLen("#1")*/ /*@PolyLength*/ [][] createNumberArray2D(double /*@PolyLength*/ [][] data) { + @SuppressWarnings("value") // the result array is manifestly the same size as the parameter + public static Number /*@SameLen("#1")*/ /*@PolyValue*/ [][] createNumberArray2D(double /*@PolyValue*/ [][] data) { Args.nullNotPermitted(data, "data"); int l1 = data.length; Number[][] result = new Number[data.length][]; diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index 4e43c3e0d..f823b422d 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -47,7 +47,7 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.*; */ @@ -95,7 +95,8 @@ public class DefaultIntervalCategoryDataset extends AbstractSeriesDataset * @param ends the ending values for the intervals ({@code null} not * permitted). */ - public DefaultIntervalCategoryDataset(double /*@SameLen("#2")*/ [][] starts, double /*@SameLen("#1")*/ [][] ends) { + @SuppressWarnings("index") // results of DataUtils.createNumberArray should have the same length as their inputs, but SameLens don't propagate correctly :( + public DefaultIntervalCategoryDataset(double /*@SameLen({"#1", "#2"})*/ [][] starts, double /*@SameLen({"#1", "#2"})*/ [][] ends) { this(DataUtils.createNumberArray2D(starts), DataUtils.createNumberArray2D(ends)); } @@ -111,7 +112,7 @@ public DefaultIntervalCategoryDataset(double /*@SameLen("#2")*/ [][] starts, dou * @param starts the start values data. * @param ends the end values data. */ - public DefaultIntervalCategoryDataset(Number /*@SameLen("#2")*/ [][] starts, Number /*@SameLen("#1")*/ [][] ends) { + public DefaultIntervalCategoryDataset(Number /*@SameLen({"#1", "#2"})*/ [][] starts, Number /*@SameLen({"#1", "#2"})*/ [][] ends) { this(null, null, starts, ends); } @@ -128,8 +129,8 @@ public DefaultIntervalCategoryDataset(Number /*@SameLen("#2")*/ [][] starts, Num * @param ends the end values data, indexed as data[series][category]. */ public DefaultIntervalCategoryDataset(String[] seriesNames, - Number /*@SameLen("#3")*/ [][] starts, - Number /*@SameLen("#2")*/ [][] ends) { + Number /*@SameLen({"#2", "#3"})*/ [][] starts, + Number /*@SameLen({"#2", "#3"})*/ [][] ends) { this(seriesNames, null, starts, ends); diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 9390c0363..133684e2d 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -2040,21 +2040,20 @@ public static Range findStackedRangeBounds(CategoryDataset dataset, for (int item = 0; item < categoryCount; item++) { double[] positive = new double[groupCount]; double[] negative = new double[groupCount]; - @SuppressWarnings("index") // group indices are all <= group count by definition - /*@IndexFor({"positive", "negative", "maximum", "minimum"})*/ int[] groupIndexTmp = groupIndex; - groupIndex = groupIndexTmp; for (int series = 0; series < rowCount; series++) { Number number = dataset.getValue(series, item); if (number != null) { hasValidData = true; double value = number.doubleValue(); + @SuppressWarnings("index") // group indices are all <= group count by definition + /*@IndexFor({"positive", "negative", "maximum", "minimum"})*/ int groupIndexTmp = groupIndex[series]; if (value > 0.0) { - positive[groupIndex[series]] - = positive[groupIndex[series]] + value; + positive[groupIndexTmp] + = positive[groupIndexTmp] + value; } if (value < 0.0) { - negative[groupIndex[series]] - = negative[groupIndex[series]] + value; + negative[groupIndexTmp] + = negative[groupIndexTmp] + value; // '+', remember value is negative } } @@ -2288,13 +2287,20 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, if (indices[0] == -1) { return Double.NaN; } - if (indices[0] == indices[1]) { - return dataset.getYValue(series, indices[0]); + + @SuppressWarnings("index") // the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. + /*@IndexFor("dataset.getSeries(series)")*/ int indices0 = indices[0]; + + @SuppressWarnings("index") // the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. + /*@IndexFor("dataset.getSeries(series)")*/ int indices1 = indices[1]; + + if (indices0 == indices1) { + return dataset.getYValue(series, indices0); } - double x0 = dataset.getXValue(series, indices[0]); - double x1 = dataset.getXValue(series, indices[1]); - double y0 = dataset.getYValue(series, indices[0]); - double y1 = dataset.getYValue(series, indices[1]); + double x0 = dataset.getXValue(series, indices0); + double x1 = dataset.getXValue(series, indices1); + double y0 = dataset.getYValue(series, indices0); + double y1 = dataset.getYValue(series, indices1); return y0 + (y1 - y0) * (x - x0) / (x1 - x0); } diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java index eeb953e56..d1b5ec563 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java @@ -47,6 +47,8 @@ package org.jfree.data.statistics; +/*>>> import org.checkerframework.checker.index.qual.*; */ + import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index 8f937ee1f..192586de7 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -281,7 +281,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, /*@Positive*/ int equations = order + 1; /*@Positive*/ int coefficients = order + 2; double[] result = new double[equations + 1]; - double[][] matrix = new double[equations][coefficients]; + double[] /*@MinLen(1)*/ [] matrix = new double[equations][coefficients]; double sumX = 0.0; double sumY = 0.0; @@ -292,23 +292,31 @@ public static double[] getPolynomialRegression(XYDataset dataset, for(int coe = 0; coe < matrix[eq].length - 1; coe++){ matrix[eq][coe] += Math.pow(data[0][item],eq + coe); } - matrix[eq][coefficients - 1] += data[1][item] + @SuppressWarnings("index") // coefficients is positive, and matrix's subarrays are all exactly `coefficients` long + /*@IndexFor("matrix[eq]")*/ int coe1 = coefficients - 1; + matrix[eq][coe1] += data[1][item] * Math.pow(data[0][item],eq); } } double[][] subMatrix = calculateSubMatrix(matrix); for (int eq = 1; eq < equations; eq++) { matrix[eq][0] = 0; - for (int coe = 1; coe < coefficients; coe++) { - matrix[eq][coe] = subMatrix[eq - 1][coe - 1]; + for (int coe = 1; coe < matrix[eq].length; coe++) { + @SuppressWarnings("index") // subMatrix is a reduced version of matrix, with rows and columns shifted so that subtracting one is always safe + double subMatrixEntry = subMatrix[eq - 1][coe - 1]; + matrix[eq][coe] = subMatrixEntry; } } for (int eq = equations - 1; eq > -1; eq--) { - double value = matrix[eq][coefficients - 1]; - for (int coe = eq; coe < coefficients -1; coe++) { - value -= matrix[eq][coe] * result[coe]; + double value = matrix[eq][matrix[eq].length - 1]; + for (int coe = eq; coe < matrix[eq].length -1; coe++) { + @SuppressWarnings("index") // coe is LTOM for matrix[eq], which means that it is LTL for result[eq], which is one smaller in each dimension + double resultCoefficient = result[coe]; + value -= matrix[eq][coe] * resultCoefficient; } - result[eq] = value / matrix[eq][eq]; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 equations < coeffecients (equations = order + 1, coeffecients = order + 2) + double diag = matrix[eq][eq]; + result[eq] = value / diag; } double meanY = sumY / validItems; double yObsSquare = 0.0; @@ -342,24 +350,35 @@ private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen( double[][] result = new double[equations - 1][coefficients - 1]; for (int eq = 1; eq < equations; eq++) { double factor = matrix[0][0] / matrix[eq][0]; - for (int coe = 1; coe < coefficients; coe++) { - result[eq - 1][coe -1] = matrix[0][coe] - matrix[eq][coe] + // I added the second condition here - matrix is rectangular, and this is the easiest way to guarantee this typechecks + for (int coe = 1; coe < matrix[eq].length && coe < matrix[0].length; coe++) { + int resultEq = eq - 1; + @SuppressWarnings("index") // result is one smaller in both dimensions than matrix, and coe is an index for matrix. Also note the use of a temporary here: the Index Checker's java expression parser chokes on "result[eq - 1]" + /*@IndexFor("result[resultEq]")*/ int resultCoe = coe -1; + result[resultEq][resultCoe] = matrix[0][coe] - matrix[eq][coe] * factor; } } if (equations == 1) { return result; } + @SuppressWarnings({"value", "index"}) // equations != 1 -> equations >= 2 -> result is minlen(1) + double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] result1 = result; + // check for zero pivot element - if (result[0][0] == 0) { + if (result1[0][0] == 0) { boolean found = false; - for (int i = 0; i < result.length; i ++) { - if (result[i][0] != 0) { + for (int i = 0; i < result1.length; i ++) { + if (result1[i][0] != 0) { found = true; - double[] temp = result[0]; - System.arraycopy(result[i], 0, result[0], 0, - result[i].length); - System.arraycopy(temp, 0, result[i], 0, temp.length); + double[] temp = result1[0]; + @SuppressWarnings("index") // result1 is a rectangular array + /*@IndexOrHigh({"result1[i]", "result1[0]"})*/ int result1ILength = result1[i].length; + System.arraycopy(result1[i], 0, result1[0], 0, + result1ILength); + @SuppressWarnings("index") // result1 is a rectangular array + /*@IndexOrHigh({"result1[i]", "temp", "result1[0]"})*/ int tempLen = temp.length; + System.arraycopy(temp, 0, result1[i], 0, tempLen); break; } } @@ -368,14 +387,16 @@ private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen( return new double[equations - 1][coefficients - 1]; } } - double[][] subMatrix = calculateSubMatrix(result); + double[][] subMatrix = calculateSubMatrix(result1); for (int eq = 1; eq < equations - 1; eq++) { - result[eq][0] = 0; - for (int coe = 1; coe < coefficients - 1; coe++) { - result[eq][coe] = subMatrix[eq - 1][coe - 1]; + result1[eq][0] = 0; + for (int coe = 1; coe < result1[eq].length; coe++) { + @SuppressWarnings("index") // subMatrix is always one smaller than result1 + double submatrixresult1 = subMatrix[eq - 1][coe - 1]; + result1[eq][coe] = submatrixresult1; } } - return result; + return result1; } } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index d9f5e1aaf..a4967794f 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -429,7 +429,9 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, } if (fillNeeded) { for (i = copyLength; i < this.historyCount; i++) { - this.valueHistory[seriesNumber].enterData(i, 0.0f); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + /*@LTLengthOf("this.valueHistory[seriesNumber]")*/ int i0 = i; + this.valueHistory[seriesNumber].enterData(i0, 0.0f); } } //} @@ -473,7 +475,9 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer // But if that series array already exists, just overwrite its contents //synchronized(this) //{ - this.valueHistory[seriesNumber].enterData(index, value); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + /*@LTLengthOf("this.valueHistory[seriesNumber]")*/ int index0 = index; + this.valueHistory[seriesNumber].enterData(index0, value); //} fireSeriesChanged(); } @@ -591,7 +595,9 @@ public synchronized RegularTimePeriod advanceTime() { oldMax = this.maxValue.floatValue(); } for (int s = 0; s < getSeriesCount(); s++) { - if (this.valueHistory[s].getData(this.oldestAt) == oldMax) { + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + /*@LTLengthOf("this.valueHistory[s]")*/ int oldestAt = this.oldestAt; + if (this.valueHistory[s].getData(oldestAt) == oldMax) { extremaChanged = true; } if (extremaChanged) { @@ -604,7 +610,9 @@ public synchronized RegularTimePeriod advanceTime() { // wipe the next (about to be used) set of data slots float wiper = (float) 0.0; for (int s = 0; s < getSeriesCount(); s++) { - this.valueHistory[s].enterData(this.newestAt, wiper); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + /*@LTLengthOf("this.valueHistory[s]")*/ int newestAt = this.newestAt; + this.valueHistory[s].enterData(newestAt, wiper); } // Update the array of TimePeriods: this.pointsInTime[this.newestAt] = nextInstant; @@ -647,7 +655,9 @@ protected double findMaxValue() { double max = 0.0f; for (int s = 0; s < getSeriesCount(); s++) { for (int i = 0; i < this.historyCount; i++) { - double tmp = getYValue(s, i); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + /*@LTLengthOf("this.getSeries(s)")*/ int i0 = i; + double tmp = getYValue(s, i0); if (tmp > max) { max = tmp; } @@ -698,7 +708,9 @@ public void appendData(float[] newData) { /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } - this.valueHistory[s].enterData(this.newestAt, newData[s]); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + /*@LTLengthOf("this.valueHistory[s]")*/ int newestAt = this.newestAt; + this.valueHistory[s].enterData(newestAt, newData[s]); } fireSeriesChanged(); } @@ -711,7 +723,7 @@ public void appendData(float[] newData) { * @param refresh value of n in "refresh the display on every nth call" * (ignored if <= 0 ) */ - public void appendData(float[] newData, /*@IndexFor("this.pointsInTime")*/ int insertionIndex, int refresh) { + public void appendData(float[] newData, final /*@IndexFor("this.pointsInTime")*/ int insertionIndex, int refresh) { int nDataPoints = newData.length; if (nDataPoints > this.valueHistory.length) { throw new IllegalArgumentException( @@ -723,11 +735,13 @@ public void appendData(float[] newData, /*@IndexFor("this.pointsInTime")*/ int i /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } - this.valueHistory[s].enterData(insertionIndex, newData[s]); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + /*@LTLengthOf("this.valueHistory[s]")*/ int insertionIndex0 = insertionIndex; + this.valueHistory[s].enterData(insertionIndex0, newData[s]); } if (refresh > 0) { - insertionIndex++; - if (insertionIndex % refresh == 0) { + int insertionIndexPlus = insertionIndex + 1; + if (insertionIndexPlus % refresh == 0) { fireSeriesChanged(); } } diff --git a/src/main/java/org/jfree/data/time/Minute.java b/src/main/java/org/jfree/data/time/Minute.java index a49753f56..c10e0ebab 100644 --- a/src/main/java/org/jfree/data/time/Minute.java +++ b/src/main/java/org/jfree/data/time/Minute.java @@ -148,6 +148,7 @@ public Minute(Date time) { * * @since 1.0.13 */ + @SuppressWarnings({"index", "value"}) // calendar needs index annotations public Minute(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); diff --git a/src/main/java/org/jfree/data/time/Month.java b/src/main/java/org/jfree/data/time/Month.java index 60dee532c..77d1e0f4a 100644 --- a/src/main/java/org/jfree/data/time/Month.java +++ b/src/main/java/org/jfree/data/time/Month.java @@ -109,7 +109,7 @@ public Month() { * @param month the month (in the range 1 to 12). * @param year the year. */ - public Month(/*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { + public Month(/*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = -9999, to = 9999)*/ int year) { if ((month < 1) || (month > 12)) { throw new IllegalArgumentException("Month outside valid range."); } diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index ede2a8831..3b04be401 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -126,7 +126,7 @@ public Quarter() { * @param year the year (1900 to 9999). * @param quarter the quarter (1 to 4). */ - public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, /*@IntRange(from=1900, to = 9999)*/int year) { + public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, /*@IntRange(from=-9999, to = 9999)*/int year) { if ((quarter < FIRST_QUARTER) || (quarter > LAST_QUARTER)) { throw new IllegalArgumentException("Quarter outside valid range."); } @@ -207,7 +207,7 @@ public Year getYear() { * * @since 1.0.3 */ - public /*@IntRange(from = 1900, to = 9999)*/ int getYearValue() { + public /*@IntRange(from = -9999, to = 9999)*/ int getYearValue() { return this.year; } diff --git a/src/main/java/org/jfree/data/time/Week.java b/src/main/java/org/jfree/data/time/Week.java index ee678b82b..dfeae8597 100644 --- a/src/main/java/org/jfree/data/time/Week.java +++ b/src/main/java/org/jfree/data/time/Week.java @@ -129,7 +129,7 @@ public Week() { * @param week the week (1 to 53). * @param year the year (1900 to 9999). */ - public Week(/*@IntRange(from = 1, to = 53)*/ int week, /*@IntRange(from = 1900, to = 9999)*/ int year) { + public Week(/*@IntRange(from = 1, to = 53)*/ int week, /*@IntRange(from = -9999, to = 9999)*/ int year) { if ((week < FIRST_WEEK_IN_YEAR) && (week > LAST_WEEK_IN_YEAR)) { throw new IllegalArgumentException( "The 'week' argument must be in the range 1 - 53."); @@ -225,7 +225,7 @@ public Year getYear() { * * @return The year. */ - public /*@IntRange(from = 1900, to = 9999)*/ int getYearValue() { + public /*@IntRange(from = -9999, to = 9999)*/ int getYearValue() { return this.year; } @@ -336,7 +336,7 @@ public RegularTimePeriod next() { Calendar calendar = Calendar.getInstance(); calendar.set(this.year, Calendar.DECEMBER, 31); @SuppressWarnings({"index", "value"}) // Calendar.WEEKOFYEAR needs an annotation - /*@IntRange(from = 52, to = 54)*/ int actualMaxWeek + /*@IntRange(from = 52, to = 53)*/ int actualMaxWeek = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); if (this.week < actualMaxWeek) { result = new Week(this.week + 1, this.year); From a02a68ab94929f0a9f6f76bda149d842c6ef72e5 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Thu, 21 Dec 2017 22:56:49 -0500 Subject: [PATCH 16/79] begin annotating chart super-package --- src/main/java/org/jfree/chart/ChartColor.java | 4 +- src/main/java/org/jfree/chart/LegendItem.java | 2 +- .../java/org/jfree/chart/PolarChartPanel.java | 4 +- .../org/jfree/chart/date/SpreadsheetDate.java | 31 +++++--- .../labels/AbstractXYItemLabelGenerator.java | 7 +- .../BoxAndWhiskerXYToolTipGenerator.java | 9 ++- .../labels/BubbleXYItemLabelGenerator.java | 10 +-- .../labels/HighLowItemLabelGenerator.java | 8 +- .../labels/IntervalXYItemLabelGenerator.java | 12 +-- .../labels/IntervalXYToolTipGenerator.java | 3 +- .../StandardCategoryToolTipGenerator.java | 4 +- .../labels/StandardXYZToolTipGenerator.java | 9 ++- .../labels/SymbolicXYItemLabelGenerator.java | 3 +- .../chart/labels/XYToolTipGenerator.java | 3 +- .../org/jfree/chart/plot/CrosshairState.java | 2 +- .../java/org/jfree/chart/plot/PolarPlot.java | 5 +- .../java/org/jfree/chart/plot/XYPlot.java | 75 +++++++++++-------- 17 files changed, 115 insertions(+), 76 deletions(-) diff --git a/src/main/java/org/jfree/chart/ChartColor.java b/src/main/java/org/jfree/chart/ChartColor.java index d77e00a1a..3c945566e 100644 --- a/src/main/java/org/jfree/chart/ChartColor.java +++ b/src/main/java/org/jfree/chart/ChartColor.java @@ -44,6 +44,8 @@ */ package org.jfree.chart; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.awt.Color; import java.awt.Paint; @@ -146,7 +148,7 @@ public ChartColor(int r, int g, int b) { * * @return An array of objects with the {@code Paint} interface. */ - public static Paint[] createDefaultPaintArray() { + public static Paint /*@ArrayLen(34)*/ [] createDefaultPaintArray() { return new Paint[] { new Color(0xFF, 0x55, 0x55), diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index 564bacb0f..99fadd618 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -119,7 +119,7 @@ public class LegendItem implements Cloneable, Serializable { private Comparable seriesKey; /** The dataset index. */ - private int datasetIndex; + private /*@NonNegative*/ int datasetIndex; /** The series index. */ private /*@NonNegative*/ int series; diff --git a/src/main/java/org/jfree/chart/PolarChartPanel.java b/src/main/java/org/jfree/chart/PolarChartPanel.java index d5b333353..6aa7c2891 100644 --- a/src/main/java/org/jfree/chart/PolarChartPanel.java +++ b/src/main/java/org/jfree/chart/PolarChartPanel.java @@ -43,6 +43,8 @@ */ package org.jfree.chart; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.awt.Component; import java.awt.event.ActionEvent; @@ -246,7 +248,7 @@ private void checkChart(JFreeChart chart) { * * @return The item index. */ - private int getPopupMenuItem(JPopupMenu menu, String text) { + private /*@GTENegativeOne*/ int getPopupMenuItem(JPopupMenu menu, String text) { int index = -1; for (int i = 0; (index == -1) && (i < menu.getComponentCount()); i++) { Component comp = menu.getComponent(i); diff --git a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java index 36dcb404c..90807207c 100644 --- a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java +++ b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java @@ -31,6 +31,7 @@ /*>>> import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; +import org.checkerframework.checker.index.qual.*; */ import java.util.Calendar; @@ -130,26 +131,32 @@ public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { // get the year from the serial date final int days = this.serial - SERIAL_LOWER_BOUND; // overestimated because we ignored leap days - final int overestimatedYYYY = 1900 + (days / 365); + @SuppressWarnings({"index", "value"}) // not really true, but gets this to typecheck. Safety is assured by checks later in this method + final /*@IntRange(from = 1900, to = 9999)*/ int overestimatedYYYY = 1900 + (days / 365); final int leaps = SerialDate.leapYearCount(overestimatedYYYY); final int nonleapdays = days - leaps; // underestimated because we overestimated years - int underestimatedYYYY = 1900 + (nonleapdays / 365); + @SuppressWarnings({"index", "value"}) // not really true, but gets this to typecheck. Safety is assured by checks later in this method + /*@IntRange(from = 1900, to = 9999)*/ int underestimatedYYYY = 1900 + (nonleapdays / 365); if (underestimatedYYYY == overestimatedYYYY) { this.year = underestimatedYYYY; } else { int ss1 = calcSerial(1, 1, underestimatedYYYY); + @SuppressWarnings({"index", "value"}) // Necessary for typechecking the modified code below. + /*@IntRange(from = 1901, to = 10000)*/ int underestimatedYYYY2 = underestimatedYYYY; while (ss1 <= this.serial) { - underestimatedYYYY = underestimatedYYYY + 1; - ss1 = calcSerial(1, 1, underestimatedYYYY); + @SuppressWarnings({"index", "value"}) // This code rolls the year up to one higher than the correct one. + /*@IntRange(from = 1901, to = 10000)*/ int underestimatedYYYYTmp = underestimatedYYYY2 + 1; + underestimatedYYYY2 = underestimatedYYYYTmp; + ss1 = calcSerial(1, 1, underestimatedYYYY2); } - this.year = underestimatedYYYY - 1; + this.year = underestimatedYYYY2 - 1; } final int ss2 = calcSerial(1, 1, this.year); - int /*@ArrayLen(14)*/ [] daysToEndOfPrecedingMonth + /*@IntRange(from = 0, to = 365)*/ int /*@ArrayLen(14)*/ [] daysToEndOfPrecedingMonth = AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH; if (isLeapYear(this.year)) { @@ -166,11 +173,15 @@ public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { mm = mm1; sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1; } - this.month = mm - 1; + @SuppressWarnings("index") // previous loop always goes around at least once + /*@Positive*/ int newMonth = mm - 1; + this.month = newMonth; // what's left is d(+1); - this.day = this.serial - ss2 + @SuppressWarnings({"index", "value"}) // date math + /*@IntRange(from = 1, to = 31)*/ int newDay = this.serial - ss2 - daysToEndOfPrecedingMonth[this.month] + 1; + this.day = newDay; } @@ -439,7 +450,9 @@ else if (include == SerialDate.INCLUDE_SECOND) { /*@IntRange(from = 0, to = 336)*/ int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m]; if (m > MonthConstants.FEBRUARY) { if (SerialDate.isLeapYear(y)) { - mm = mm + 1; + @SuppressWarnings({"index", "value"}) // Adding leap day doesn't change this value's range + /*@IntRange(from = 0, to = 336)*/ int mm1 = mm + 1; + mm = mm1; } } int dd = d; diff --git a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java index 758eefa3e..6d10bec92 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java @@ -54,7 +54,8 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.MinLen; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -238,7 +239,7 @@ public DateFormat getYDateFormat() { * * @return The label (possibly {@code null}). */ - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { String result; Object[] items = createItemArray(dataset, series, item); result = MessageFormat.format(this.formatString, items); @@ -268,7 +269,7 @@ public String getNullYString() { * {@code String} objects (never {@code null}). */ protected Object /*@MinLen(3)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - /*@NonNegative*/ int item) { + /*@IndexFor("#1.getSeries(#2)")*/ int item) { Object[] result = new Object[3]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index cab94584a..de8c67d7b 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -48,8 +48,8 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.MinLen; @@ -131,7 +131,7 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, */ @Override protected Object /*@MinLen(8)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - /*@NonNegative*/ int item) { + /*@IndexFor("#1.getSeries(#2)")*/ int item) { Object[] result = new Object[8]; result[0] = dataset.getSeriesKey(series).toString(); Number x = dataset.getX(series, item); @@ -144,7 +144,8 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, NumberFormat formatter = getYFormat(); if (dataset instanceof BoxAndWhiskerXYDataset) { - BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@SameLen("dataset")*/ BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; result[2] = formatter.format(d.getMeanValue(series, item)); result[3] = formatter.format(d.getMedianValue(series, item)); result[4] = formatter.format(d.getMinRegularValue(series, item)); diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index ef66495eb..9d16128bd 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -44,8 +44,8 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.MinLen; @@ -168,7 +168,7 @@ public DateFormat getZDateFormat() { * @return The item label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { return generateLabelString(dataset, series, item); } @@ -182,7 +182,7 @@ public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@N * @return The label (possibly {@code null}). */ @Override - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { String result; Object[] items; if (dataset instanceof XYZDataset) { @@ -206,7 +206,7 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series * @return The items (never {@code null}). */ protected Object /*@MinLen(4)*/ [] createItemArray(XYZDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { Object[] result = new Object[4]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index 3d30f02fb..e8e4e7f5c 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -51,6 +51,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -122,12 +123,13 @@ public HighLowItemLabelGenerator(DateFormat dateFormatter, * @return The tooltip text. */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { if (!(dataset instanceof OHLCDataset)) { return null; } StringBuilder sb = new StringBuilder(); - OHLCDataset d = (OHLCDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@SameLen("dataset")*/ OHLCDataset d = (OHLCDataset) dataset; Number high = d.getHigh(series, item); Number low = d.getLow(series, item); Number open = d.getOpen(series, item); @@ -168,7 +170,7 @@ public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /* * @return The label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int category) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int category) { return null; //TODO: implement this method properly } diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index c9653979c..f026d2845 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -39,8 +39,8 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.MinLen; @@ -157,11 +157,13 @@ public IntervalXYItemLabelGenerator(String formatString, */ @Override protected Object /*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - /*@NonNegative*/ int item) { + /*@IndexFor("#1.getSeries(#2)")*/ int item) { - IntervalXYDataset intervalDataset = null; + /*@SameLen("dataset")*/ IntervalXYDataset intervalDataset = null; if (dataset instanceof IntervalXYDataset) { - intervalDataset = (IntervalXYDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@SameLen("dataset")*/ IntervalXYDataset intervalDataset1 = (IntervalXYDataset) dataset; + intervalDataset = intervalDataset1; } Object[] result = new Object[7]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index 3acf7a026..3b76175d8 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> @@ -152,7 +153,7 @@ public IntervalXYToolTipGenerator(String formatString, */ @Override protected Object/*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - /*@NonNegative*/ int item) { + /*@IndexFor("#1.getSeries(#2)")*/ int item) { IntervalXYDataset intervalDataset = null; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java index 25aae45ae..fa7a32653 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java @@ -41,7 +41,7 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; import java.text.DateFormat; @@ -108,7 +108,7 @@ public StandardCategoryToolTipGenerator(String labelFormat, */ @Override public String generateToolTip(CategoryDataset dataset, - int row, /*@NonNegative*/ int column) { + /*@NonNegative*/ int row, /*@NonNegative*/ int column) { return generateLabelString(dataset, row, column); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index 113a76406..d35c5a74f 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -41,7 +41,8 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.MinLen; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -162,7 +163,7 @@ public DateFormat getZDateFormat() { * @return The tooltip text (possibly {@code null}). */ @Override - public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { return generateLabelString(dataset, series, item); } @@ -176,7 +177,7 @@ public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, / * @return The label (possibly {@code null}). */ @Override - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { String result; Object[] items = createItemArray((XYZDataset) dataset, series, item); result = MessageFormat.format(getFormatString(), items); @@ -194,7 +195,7 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series * @return The items (never {@code null}). */ protected Object /*@MinLen(4)*/ [] createItemArray(XYZDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { Object[] result = new Object[4]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java index 315acacae..2a06b0fb1 100644 --- a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -82,7 +83,7 @@ public class SymbolicXYItemLabelGenerator implements XYItemLabelGenerator, * @return The tool tip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { String xStr, yStr; if (data instanceof YisSymbolic) { diff --git a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java index a17d6b294..463c620b5 100644 --- a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> @@ -64,6 +65,6 @@ public interface XYToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item); } diff --git a/src/main/java/org/jfree/chart/plot/CrosshairState.java b/src/main/java/org/jfree/chart/plot/CrosshairState.java index 7236de793..ab31c39bd 100644 --- a/src/main/java/org/jfree/chart/plot/CrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CrosshairState.java @@ -90,7 +90,7 @@ public class CrosshairState { * * @since 1.0.11 */ - private int datasetIndex; + private /*@NonNegative*/ int datasetIndex; /** * The smallest distance (so far) between the anchor point and a data diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index 1da7f3612..f580296df 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -1308,8 +1308,9 @@ public ValueAxis getAxisForDataset(/*@NonNegative*/ int index) { new Integer(index)); if (axisIndices != null) { // the first axis in the list is used for data <--> Java2D - Integer axisIndex = (Integer) axisIndices.get(0); - valueAxis = getAxis(axisIndex.intValue()); + @SuppressWarnings("index") // axesIndices[0] is always NN + /*@NonNegative*/ int axisIndex = ((Integer) axisIndices.get(0)).intValue(); + valueAxis = getAxis(axisIndex); } else { valueAxis = getAxis(0); diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index b5bd12355..6e18502e4 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -235,8 +235,6 @@ package org.jfree.chart.plot; /*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ - /*>>> import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.dataflow.qual.Pure; @@ -535,16 +533,16 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, private boolean rangeCrosshairLockedOnData = true; /** A map of lists of foreground markers (optional) for the domain axes. */ - private Map foregroundDomainMarkers; + private Map foregroundDomainMarkers; /** A map of lists of background markers (optional) for the domain axes. */ - private Map backgroundDomainMarkers; + private Map backgroundDomainMarkers; /** A map of lists of foreground markers (optional) for the range axes. */ - private Map foregroundRangeMarkers; + private Map foregroundRangeMarkers; /** A map of lists of background markers (optional) for the range axes. */ - private Map backgroundRangeMarkers; + private Map backgroundRangeMarkers; /** * A (possibly empty) list of annotations for the plot. The list should @@ -641,18 +639,18 @@ public XYPlot(XYDataset dataset, ValueAxis domainAxis, ValueAxis rangeAxis, this.axisOffset = RectangleInsets.ZERO_INSETS; // allocate storage for datasets, axes and renderers (all optional) - this.domainAxes = new HashMap(); - this.domainAxisLocations = new HashMap(); + this.domainAxes = new HashMap(); + this.domainAxisLocations = new HashMap(); this.foregroundDomainMarkers = new HashMap(); this.backgroundDomainMarkers = new HashMap(); - this.rangeAxes = new HashMap(); - this.rangeAxisLocations = new HashMap(); + this.rangeAxes = new HashMap(); + this.rangeAxisLocations = new HashMap(); this.foregroundRangeMarkers = new HashMap(); this.backgroundRangeMarkers = new HashMap(); - this.datasets = new HashMap(); - this.renderers = new HashMap(); + this.datasets = new HashMap(); + this.renderers = new HashMap(); this.datasetToDomainAxesMap = new TreeMap(); this.datasetToRangeAxesMap = new TreeMap(); @@ -1508,6 +1506,7 @@ public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List axis * * @param indices the list of indices ({@code null} permitted). */ + /*@Pure*/ private void checkAxisIndices(List indices) { // axisIndices can be: // 1. null; @@ -1535,7 +1534,7 @@ private void checkAxisIndices(List indices) { * * @since 1.0.11 */ - public int getRendererCount() { + public /*@NonNegative*/ int getRendererCount() { return this.renderers.size(); } @@ -1559,6 +1558,7 @@ public XYItemRenderer getRenderer() { * * @see #setRenderer(int, XYItemRenderer) */ + /*@Pure*/ public XYItemRenderer getRenderer(/*@NonNegative*/ int index) { return (XYItemRenderer) this.renderers.get(index); } @@ -3039,6 +3039,7 @@ else if (this.orientation == PlotOrientation.VERTICAL) { // reserve space for the domain axes... for (ValueAxis axis: this.domainAxes.values()) { if (axis != null) { + @SuppressWarnings("index") // axis is guaranteed to be a domain axis, so findDomainAxisIndex will return NN RectangleEdge edge = getDomainAxisEdge( findDomainAxisIndex(axis)); space = axis.reserveSpace(g2, this, plotArea, edge, space); @@ -3085,7 +3086,8 @@ else if (this.orientation == PlotOrientation.VERTICAL) { // reserve space for the range axes... for (ValueAxis axis: this.rangeAxes.values()) { if (axis != null) { - RectangleEdge edge = getRangeAxisEdge( + @SuppressWarnings("index") // axis is guaranteed to be a range axis, so findRangeAxisIndex will return NN + RectangleEdge edge = getRangeAxisEdge( findRangeAxisIndex(axis)); space = axis.reserveSpace(g2, this, plotArea, edge, space); } @@ -3265,7 +3267,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // now draw annotations and render data items... boolean foundData = false; DatasetRenderingOrder order = getDatasetRenderingOrder(); + @SuppressWarnings("value") // https://github.com/kelloggm/checker-framework/issues/186 List rendererIndices = getRendererIndices(order); + @SuppressWarnings("value") // https://github.com/kelloggm/checker-framework/issues/186 List datasetIndices = getDatasetIndices(order); // draw background annotations @@ -3300,6 +3304,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw domain crosshair if required... int datasetIndex = crosshairState.getDatasetIndex(); ValueAxis xAxis = getDomainAxisForDataset(datasetIndex); + @SuppressWarnings("index") // xAxis was just fetched out of the dataset, so getDomainAxisIndex will return NN RectangleEdge xAxisEdge = getDomainAxisEdge(getDomainAxisIndex(xAxis)); if (!this.domainCrosshairLockedOnData && anchor != null) { double xx; @@ -3321,6 +3326,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw range crosshair if required... ValueAxis yAxis = getRangeAxisForDataset(datasetIndex); + @SuppressWarnings("index") // yAxis was just fetched out of the dataset, so getRangeAxisIndex will return NN RectangleEdge yAxisEdge = getRangeAxisEdge(getRangeAxisIndex(yAxis)); if (!this.rangeCrosshairLockedOnData && anchor != null) { double yy; @@ -3377,7 +3383,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * @return The list of indices. */ private List< /*@NonNegative*/ Integer> getDatasetIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); + List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYDataset> entry : this.datasets.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -3391,7 +3397,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, } private List< /*@NonNegative*/ Integer> getRendererIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); + List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYItemRenderer> entry : this.renderers.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -3622,7 +3628,8 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add domain axes to lists... for (ValueAxis axis : this.domainAxes.values()) { if (axis != null) { - int axisIndex = findDomainAxisIndex(axis); + @SuppressWarnings("index") // axis is guaranteed to be a domain axis, so axisIndex is NN + /*@NonNegative*/ int axisIndex = findDomainAxisIndex(axis); axisCollection.add(axis, getDomainAxisEdge(axisIndex)); } } @@ -3630,7 +3637,8 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add range axes to lists... for (ValueAxis axis : this.rangeAxes.values()) { if (axis != null) { - int axisIndex = findRangeAxisIndex(axis); + @SuppressWarnings("index") // axis is guaranteed to be a range axis, so axisIndex is NN + /*@NonNegative*/ int axisIndex = findRangeAxisIndex(axis); axisCollection.add(axis, getRangeAxisEdge(axisIndex)); } } @@ -3802,8 +3810,9 @@ public ValueAxis getDomainAxisForDataset(/*@NonNegative*/ int index) { new Integer(index)); if (axisIndices != null) { // the first axis in the list is used for data <--> Java2D - Integer axisIndex = (Integer) axisIndices.get(0); - valueAxis = getDomainAxis(axisIndex.intValue()); + @SuppressWarnings("index") // first element of axisIndices is guaranteed NN + /*@NonNegative*/ int axisIndex = ((Integer) axisIndices.get(0)).intValue(); + valueAxis = getDomainAxis(axisIndex); } else { valueAxis = getDomainAxis(0); @@ -3825,8 +3834,9 @@ public ValueAxis getRangeAxisForDataset(/*@NonNegative*/ int index) { new Integer(index)); if (axisIndices != null) { // the first axis in the list is used for data <--> Java2D - Integer axisIndex = (Integer) axisIndices.get(0); - valueAxis = getRangeAxis(axisIndex.intValue()); + @SuppressWarnings("index") // first element of axisIndices is guaranteed NN + /*@NonNegative*/ int axisIndex = ((Integer) axisIndices.get(0)).intValue(); + valueAxis = getRangeAxis(axisIndex); } else { valueAxis = getRangeAxis(0); @@ -3994,7 +4004,7 @@ public void drawAnnotations(Graphics2D g2, Rectangle2D dataArea, * @param layer the layer (foreground or background). */ protected void drawDomainMarkers(Graphics2D g2, Rectangle2D dataArea, - int index, Layer layer) { + /*@NonNegative*/ int index, Layer layer) { XYItemRenderer r = getRenderer(index); if (r == null) { @@ -4027,7 +4037,7 @@ protected void drawDomainMarkers(Graphics2D g2, Rectangle2D dataArea, * @param layer the layer (foreground or background). */ protected void drawRangeMarkers(Graphics2D g2, Rectangle2D dataArea, - int index, Layer layer) { + /*@NonNegative*/ int index, Layer layer) { XYItemRenderer r = getRenderer(index); if (r == null) { @@ -4372,7 +4382,7 @@ private List getDatasetsMappedToRangeAxis(Integer axisIndex) { } private /*@GTENegativeOne*/ int findDomainAxisIndex(ValueAxis axis) { - for (Map.Entry entry : this.domainAxes.entrySet()) { + for (Map.Entry entry : this.domainAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); } @@ -4389,7 +4399,7 @@ private List getDatasetsMappedToRangeAxis(Integer axisIndex) { * * @see #getDomainAxisIndex(ValueAxis) */ - public int getRangeAxisIndex(ValueAxis axis) { + public /*@GTENegativeOne*/ int getRangeAxisIndex(ValueAxis axis) { int result = findRangeAxisIndex(axis); if (result < 0) { // try the parent plot @@ -4402,8 +4412,8 @@ public int getRangeAxisIndex(ValueAxis axis) { return result; } - private int findRangeAxisIndex(ValueAxis axis) { - for (Map.Entry entry : this.rangeAxes.entrySet()) { + private /*@GTENegativeOne*/ int findRangeAxisIndex(ValueAxis axis) { + for (Map.Entry entry : this.rangeAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); } @@ -5290,7 +5300,8 @@ public LegendItemCollection getLegendItems() { if (dataset == null) { continue; } - int datasetIndex = indexOf(dataset); + @SuppressWarnings("index") // dataset is came from this object, so indexOf returns NN + /*@NonNegative*/ int datasetIndex = indexOf(dataset); XYItemRenderer renderer = getRenderer(datasetIndex); if (renderer == null) { renderer = getRenderer(0); @@ -5552,13 +5563,13 @@ public Object clone() throws CloneNotSupportedException { axis.addChangeListener(clone); } } - clone.domainAxisLocations = new HashMap( + clone.domainAxisLocations = new HashMap( this.domainAxisLocations); - clone.rangeAxisLocations = new HashMap( + clone.rangeAxisLocations = new HashMap( this.rangeAxisLocations); // the datasets are not cloned, but listeners need to be added... - clone.datasets = new HashMap(this.datasets); + clone.datasets = new HashMap(this.datasets); for (XYDataset dataset : clone.datasets.values()) { if (dataset != null) { dataset.addChangeListener(clone); From ff61de00ae9649ca4beba3b24996e5f57f01ccf4 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Fri, 22 Dec 2017 12:00:20 -0500 Subject: [PATCH 17/79] additional annotations in chart packages --- .../java/org/jfree/chart/date/SerialDate.java | 2 +- .../org/jfree/chart/date/SpreadsheetDate.java | 10 ++-- .../BoxAndWhiskerXYToolTipGenerator.java | 15 ++--- .../labels/BubbleXYItemLabelGenerator.java | 5 +- .../labels/HighLowItemLabelGenerator.java | 13 +++-- .../labels/IntervalXYItemLabelGenerator.java | 22 +++---- .../labels/IntervalXYToolTipGenerator.java | 16 +++--- .../labels/StandardXYItemLabelGenerator.java | 3 +- .../labels/StandardXYToolTipGenerator.java | 3 +- .../labels/StandardXYZToolTipGenerator.java | 3 +- .../chart/labels/XYItemLabelGenerator.java | 3 +- .../org/jfree/chart/plot/CategoryPlot.java | 57 ++++++++++--------- .../org/jfree/chart/plot/CompassPlot.java | 11 +++- .../org/jfree/chart/plot/FastScatterPlot.java | 2 +- .../java/org/jfree/chart/plot/PiePlot.java | 8 ++- .../jfree/chart/plot/PlotRenderingInfo.java | 5 +- .../java/org/jfree/chart/plot/RingPlot.java | 3 +- .../org/jfree/chart/plot/SpiderWebPlot.java | 6 +- .../java/org/jfree/chart/plot/XYPlot.java | 6 +- .../org/jfree/chart/plot/dial/DialPlot.java | 5 +- .../jfree/chart/plot/dial/DialPointer.java | 2 +- .../chart/plot/dial/DialValueIndicator.java | 2 +- .../chart/plot/dial/StandardDialRange.java | 4 +- .../renderer/DefaultPolarItemRenderer.java | 7 ++- .../chart/renderer/LookupPaintScale.java | 7 ++- .../chart/renderer/WaferMapRenderer.java | 12 ++-- .../java/org/jfree/chart/util/ShapeList.java | 1 + .../jfree/data/general/WaferMapDataset.java | 4 +- 28 files changed, 138 insertions(+), 99 deletions(-) diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index 4ec24f544..3023fe101 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -129,7 +129,7 @@ public abstract class SerialDate implements Comparable, Serializable, /** * The number of days in a leap year up to the end of the preceding month. */ - static final int /*@ArrayLen(14)*/ [] + static final /*@IntRange(from = 0, to = 366)*/ int /*@ArrayLen(14)*/ [] LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH = {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; diff --git a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java index 90807207c..eebd9dbae 100644 --- a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java +++ b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java @@ -149,14 +149,16 @@ public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { @SuppressWarnings({"index", "value"}) // This code rolls the year up to one higher than the correct one. /*@IntRange(from = 1901, to = 10000)*/ int underestimatedYYYYTmp = underestimatedYYYY2 + 1; underestimatedYYYY2 = underestimatedYYYYTmp; - ss1 = calcSerial(1, 1, underestimatedYYYY2); + @SuppressWarnings({"index", "value"}) // this call to calcSerial could technically happen with a year that's 10000. The result would still be correct. + int ss1tmp = calcSerial(1, 1, underestimatedYYYY2); + ss1 = ss1tmp; } this.year = underestimatedYYYY2 - 1; } final int ss2 = calcSerial(1, 1, this.year); - /*@IntRange(from = 0, to = 365)*/ int /*@ArrayLen(14)*/ [] daysToEndOfPrecedingMonth + /*@IntRange(from = 0, to = 366)*/ int /*@ArrayLen(14)*/ [] daysToEndOfPrecedingMonth = AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH; if (isLeapYear(this.year)) { @@ -173,8 +175,8 @@ public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { mm = mm1; sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1; } - @SuppressWarnings("index") // previous loop always goes around at least once - /*@Positive*/ int newMonth = mm - 1; + @SuppressWarnings({"index", "value"}) // previous loop always goes around at least once + /*@IntRange(from = 1, to = 12)*/ int newMonth = mm - 1; this.month = newMonth; // what's left is d(+1); diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index de8c67d7b..56863b82f 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -145,13 +145,14 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, if (dataset instanceof BoxAndWhiskerXYDataset) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 - /*@SameLen("dataset")*/ BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; - result[2] = formatter.format(d.getMeanValue(series, item)); - result[3] = formatter.format(d.getMedianValue(series, item)); - result[4] = formatter.format(d.getMinRegularValue(series, item)); - result[5] = formatter.format(d.getMaxRegularValue(series, item)); - result[6] = formatter.format(d.getQ1Value(series, item)); - result[7] = formatter.format(d.getQ3Value(series, item)); + /*@IndexFor("d.getSeries(series)")*/ int itemD = item; + BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; + result[2] = formatter.format(d.getMeanValue(series, itemD)); + result[3] = formatter.format(d.getMedianValue(series, itemD)); + result[4] = formatter.format(d.getMinRegularValue(series, itemD)); + result[5] = formatter.format(d.getMaxRegularValue(series, itemD)); + result[6] = formatter.format(d.getQ1Value(series, itemD)); + result[7] = formatter.format(d.getQ3Value(series, itemD)); } return result; } diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index 9d16128bd..ee44960f0 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -186,7 +186,10 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series String result; Object[] items; if (dataset instanceof XYZDataset) { - items = createItemArray((XYZDataset) dataset, series, item); + XYZDataset xyzDataset = (XYZDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("xyzDataset.getSeries(series)")*/ int item1 = item; + items = createItemArray(xyzDataset, series, item1); } else { items = createItemArray(dataset, series, item); diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index e8e4e7f5c..fc17bf8c3 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -128,13 +128,14 @@ public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /* return null; } StringBuilder sb = new StringBuilder(); + OHLCDataset d = (OHLCDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 - /*@SameLen("dataset")*/ OHLCDataset d = (OHLCDataset) dataset; - Number high = d.getHigh(series, item); - Number low = d.getLow(series, item); - Number open = d.getOpen(series, item); - Number close = d.getClose(series, item); - Number x = d.getX(series, item); + /*@IndexFor("d.getSeries(series)")*/ int itemD = item; + Number high = d.getHigh(series, itemD); + Number low = d.getLow(series, itemD); + Number open = d.getOpen(series, itemD); + Number close = d.getClose(series, itemD); + Number x = d.getX(series, itemD); sb.append(d.getSeriesKey(series).toString()); if (x != null) { Date date = new Date(x.longValue()); diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index f026d2845..a2b60d985 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -159,11 +159,11 @@ public IntervalXYItemLabelGenerator(String formatString, protected Object /*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { - /*@SameLen("dataset")*/ IntervalXYDataset intervalDataset = null; + IntervalXYDataset intervalDataset = null; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("intervalDataset.getSeries(series)")*/ int itemIntervalDataset = item; if (dataset instanceof IntervalXYDataset) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 - /*@SameLen("dataset")*/ IntervalXYDataset intervalDataset1 = (IntervalXYDataset) dataset; - intervalDataset = intervalDataset1; + intervalDataset = (IntervalXYDataset) dataset; } Object[] result = new Object[7]; result[0] = dataset.getSeriesKey(series).toString(); @@ -175,10 +175,10 @@ public IntervalXYItemLabelGenerator(String formatString, double ys = y; double ye = y; if (intervalDataset != null) { - xs = intervalDataset.getStartXValue(series, item); - xe = intervalDataset.getEndXValue(series, item); - ys = intervalDataset.getStartYValue(series, item); - ye = intervalDataset.getEndYValue(series, item); + xs = intervalDataset.getStartXValue(series, itemIntervalDataset); + xe = intervalDataset.getEndXValue(series, itemIntervalDataset); + ys = intervalDataset.getStartYValue(series, itemIntervalDataset); + ye = intervalDataset.getEndYValue(series, itemIntervalDataset); } DateFormat xdf = getXDateFormat(); @@ -208,7 +208,7 @@ public IntervalXYItemLabelGenerator(String formatString, } } if (Double.isNaN(ys) && intervalDataset != null - && intervalDataset.getStartY(series, item) == null) { + && intervalDataset.getStartY(series, itemIntervalDataset) == null) { result[5] = getNullYString(); } else { @@ -220,7 +220,7 @@ public IntervalXYItemLabelGenerator(String formatString, } } if (Double.isNaN(ye) && intervalDataset != null - && intervalDataset.getEndY(series, item) == null) { + && intervalDataset.getEndY(series, itemIntervalDataset) == null) { result[6] = getNullYString(); } else { @@ -244,7 +244,7 @@ public IntervalXYItemLabelGenerator(String formatString, * @return The label text (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index 3b76175d8..86d5e9500 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -155,6 +155,8 @@ public IntervalXYToolTipGenerator(String formatString, protected Object/*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { IntervalXYDataset intervalDataset = null; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("intervalDataset.getSeries(series)")*/ int itemIntervalDataset = item; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; } @@ -168,10 +170,10 @@ public IntervalXYToolTipGenerator(String formatString, double ys = y; double ye = y; if (intervalDataset != null) { - xs = intervalDataset.getStartXValue(series, item); - xe = intervalDataset.getEndXValue(series, item); - ys = intervalDataset.getStartYValue(series, item); - ye = intervalDataset.getEndYValue(series, item); + xs = intervalDataset.getStartXValue(series, itemIntervalDataset); + xe = intervalDataset.getEndXValue(series, itemIntervalDataset); + ys = intervalDataset.getStartYValue(series, itemIntervalDataset); + ye = intervalDataset.getEndYValue(series, itemIntervalDataset); } DateFormat xdf = getXDateFormat(); @@ -199,7 +201,7 @@ public IntervalXYToolTipGenerator(String formatString, } } if (Double.isNaN(ys) && intervalDataset != null - && intervalDataset.getStartY(series, item) == null) { + && intervalDataset.getStartY(series, itemIntervalDataset) == null) { result[5] = getNullYString(); } else { if (ydf != null) { @@ -210,7 +212,7 @@ public IntervalXYToolTipGenerator(String formatString, } } if (Double.isNaN(ye) && intervalDataset != null - && intervalDataset.getEndY(series, item) == null) { + && intervalDataset.getEndY(series, itemIntervalDataset) == null) { result[6] = getNullYString(); } else { if (ydf != null) { @@ -233,7 +235,7 @@ public IntervalXYToolTipGenerator(String formatString, * @return The tool tip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java index a6a64ff12..f8afe7d53 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java @@ -59,6 +59,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -184,7 +185,7 @@ public StandardXYItemLabelGenerator(String formatString, * @return The label text (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java index 70c44dd3a..8c7e930f3 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -166,7 +167,7 @@ public StandardXYToolTipGenerator(String formatString, * @return The tooltip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index d35c5a74f..4c8904e89 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -41,7 +41,7 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> @@ -179,6 +179,7 @@ public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, / @Override public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { String result; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 Object[] items = createItemArray((XYZDataset) dataset, series, item); result = MessageFormat.format(getFormatString(), items); return result; diff --git a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java index 39b95235b..77ad74e6f 100644 --- a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java @@ -47,6 +47,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -70,6 +71,6 @@ public interface XYItemLabelGenerator { * * @return The label (possibly {@code null}). */ - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); + public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item); } diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 6c5b6ebda..d83395b87 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -518,16 +518,16 @@ public class CategoryPlot extends Plot implements ValueAxisPlot, Pannable, private boolean rangeCrosshairLockedOnData = true; /** A map containing lists of markers for the domain axes. */ - private Map foregroundDomainMarkers; + private Map foregroundDomainMarkers; /** A map containing lists of markers for the domain axes. */ - private Map backgroundDomainMarkers; + private Map backgroundDomainMarkers; /** A map containing lists of markers for the range axes. */ - private Map foregroundRangeMarkers; + private Map foregroundRangeMarkers; /** A map containing lists of markers for the range axes. */ - private Map backgroundRangeMarkers; + private Map backgroundRangeMarkers; /** * A (possibly empty) list of annotations for the plot. The list should @@ -864,7 +864,7 @@ public void setDomainAxes(CategoryAxis[] axes) { */ public /*@GTENegativeOne*/ int getDomainAxisIndex(CategoryAxis axis) { Args.nullNotPermitted(axis, "axis"); - for (Entry entry : this.domainAxes.entrySet()) { + for (Entry entry : this.domainAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); } @@ -1147,7 +1147,7 @@ public void setRangeAxes(ValueAxis[] axes) { } private /*@GTENegativeOne*/ int findRangeAxisIndex(ValueAxis axis) { - for (Entry entry : this.rangeAxes.entrySet()) { + for (Entry entry : this.rangeAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); } @@ -1385,7 +1385,7 @@ public void setDataset(/*@NonNegative*/ int index, CategoryDataset dataset) { * @since 1.0.11 */ public /*@GTENegativeOne*/ int indexOf(CategoryDataset dataset) { - for (Entry entry: this.datasets.entrySet()) { + for (Entry entry: this.datasets.entrySet()) { if (entry.getValue() == dataset) { return entry.getKey(); } @@ -1699,7 +1699,7 @@ public CategoryItemRenderer getRendererForDataset(CategoryDataset dataset) { * @return The renderer index. */ public /*@GTENegativeOne*/ int getIndexOf(CategoryItemRenderer renderer) { - for (Entry entry + for (Entry entry : this.renderers.entrySet()) { if (entry.getValue() == renderer) { return entry.getKey(); @@ -2427,19 +2427,19 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L */ public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - Set keys = this.backgroundDomainMarkers.keySet(); + Set keys = this.backgroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { - Integer key = (Integer) iterator.next(); + /*@NonNegative*/ Integer key = (/*@NonNegative*/ Integer) iterator.next(); clearDomainMarkers(key.intValue()); } this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { - Set keys = this.foregroundDomainMarkers.keySet(); + Set keys = this.foregroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { - Integer key = (Integer) iterator.next(); + /*@NonNegative*/ Integer key = (/*@NonNegative*/ Integer) iterator.next(); clearDomainMarkers(key.intValue()); } this.foregroundDomainMarkers.clear(); @@ -2697,19 +2697,19 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye */ public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - Set keys = this.backgroundRangeMarkers.keySet(); + Set keys = this.backgroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { - Integer key = (Integer) iterator.next(); + /*@NonNegative*/ Integer key = (/*@NonNegative*/ Integer) iterator.next(); clearRangeMarkers(key.intValue()); } this.backgroundRangeMarkers.clear(); } if (this.foregroundRangeMarkers != null) { - Set keys = this.foregroundRangeMarkers.keySet(); + Set keys = this.foregroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { - Integer key = (Integer) iterator.next(); + /*@NonNegative*/ Integer key = (/*@NonNegative*/ Integer) iterator.next(); clearRangeMarkers(key.intValue()); } this.foregroundRangeMarkers.clear(); @@ -3612,7 +3612,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw the markers... for (CategoryItemRenderer renderer : this.renderers.values()) { - int i = getIndexOf(renderer); + @SuppressWarnings("index") // renderer is one of the renderers of this object, so getIndexOf must return nonnegative + /*@NonNegative*/ int i = getIndexOf(renderer); drawDomainMarkers(g2, dataArea, i, Layer.BACKGROUND); } for (CategoryItemRenderer renderer : this.renderers.values()) { @@ -3629,14 +3630,16 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, AlphaComposite.SRC_OVER, getForegroundAlpha())); DatasetRenderingOrder order = getDatasetRenderingOrder(); - List datasetIndices = getDatasetIndices(order); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/198 + List datasetIndices = getDatasetIndices(order); for (int i : datasetIndices) { foundData = render(g2, dataArea, i, state, crosshairState) || foundData; } // draw the foreground markers... - List rendererIndices = getRendererIndices(order); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/198 + List rendererIndices = getRendererIndices(order); for (int i : rendererIndices) { drawDomainMarkers(g2, dataArea, i, Layer.FOREGROUND); } @@ -3722,8 +3725,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * @return The list of indices. */ private List getDatasetIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); - for (Map.Entry entry : + List result = new ArrayList(); + for (Map.Entry entry : this.datasets.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -3745,8 +3748,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * @return A list of indices. */ private List getRendererIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); - for (Map.Entry entry: + List result = new ArrayList(); + for (Map.Entry entry: this.renderers.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -4115,7 +4118,7 @@ protected void drawDomainMarkers(Graphics2D g2, Rectangle2D dataArea, * @see #drawDomainMarkers(Graphics2D, Rectangle2D, int, Layer) */ protected void drawRangeMarkers(Graphics2D g2, Rectangle2D dataArea, - int index, Layer layer) { + /*@NonNegative*/ int index, Layer layer) { CategoryItemRenderer r = getRenderer(index); if (r == null) { @@ -5000,12 +5003,12 @@ public Object clone() throws CloneNotSupportedException { } // AxisLocation is immutable, so we can just copy the maps - clone.domainAxisLocations = new HashMap( + clone.domainAxisLocations = new HashMap( this.domainAxisLocations); - clone.rangeAxisLocations = new HashMap( + clone.rangeAxisLocations = new HashMap( this.rangeAxisLocations); - clone.datasets = new HashMap(this.datasets); + clone.datasets = new HashMap(this.datasets); for (CategoryDataset dataset : clone.datasets.values()) { if (dataset != null) { dataset.addChangeListener(clone); diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 53f4f0fae..6a27da84a 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -558,8 +558,15 @@ public void addDataset(ValueDataset dataset, MeterNeedle needle) { ValueDataset[] a = this.datasets; MeterNeedle[] b = this.seriesNeedle; - this.datasets = t; - this.seriesNeedle = p; + + @SuppressWarnings({"index", "value"}) // these two values are being changed together, but they go out of sync as the change occurs + ValueDataset /*@MinLen(1)*/ /*@SameLen("this.seriesNeedle")*/ [] t0 = t; + + @SuppressWarnings({"index", "value"}) // these two values are being changed together, but they go out of sync as the change occurs + MeterNeedle /*@MinLen(1)*/ /*@SameLen("this.datasets")*/ [] p0 = p; + + this.datasets = t0; + this.seriesNeedle = p0; for (--i; i >= 0; --i) { a[i] = null; diff --git a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java index 942b02b7a..1b6f712f6 100644 --- a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java +++ b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java @@ -1072,7 +1072,7 @@ public boolean equals(Object obj) { * not support cloning. */ @Override - @SuppressWarnings("index") // clone always results in the same types + @SuppressWarnings({"index", "value"}) // clone always results in the same types public Object clone() throws CloneNotSupportedException { FastScatterPlot clone = (FastScatterPlot) super.clone(); diff --git a/src/main/java/org/jfree/chart/plot/PiePlot.java b/src/main/java/org/jfree/chart/plot/PiePlot.java index f8a118ddf..e9a6ffa07 100644 --- a/src/main/java/org/jfree/chart/plot/PiePlot.java +++ b/src/main/java/org/jfree/chart/plot/PiePlot.java @@ -174,7 +174,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -2539,7 +2539,7 @@ protected void drawPie(Graphics2D g2, Rectangle2D plotArea, * @param state state information for one chart. * @param currentPass the current pass index. */ - protected void drawItem(Graphics2D g2, int section, Rectangle2D dataArea, + protected void drawItem(Graphics2D g2, /*@NonNegative*/ int section, Rectangle2D dataArea, PiePlotState state, int currentPass) { Number n = this.dataset.getValue(section); @@ -2966,7 +2966,9 @@ public LegendItemCollection getLegendItems() { false, // line not visible new Line2D.Float(), new BasicStroke(), Color.BLACK); item.setDataset(getDataset()); - item.setSeriesIndex(this.dataset.getIndex(key)); + @SuppressWarnings("index") // key came from the list of keys for this dataset, so getIndex has to return non-negative + /*@NonNegative*/ int newSeriesIndex = this.dataset.getIndex(key); + item.setSeriesIndex(newSeriesIndex); item.setSeriesKey(key); result.add(item); } diff --git a/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java b/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java index 66ae62766..07f667ac2 100644 --- a/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java +++ b/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java @@ -45,7 +45,8 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -193,7 +194,7 @@ public PlotRenderingInfo getSubplotInfo(/*@NonNegative*/ int index) { * * @return The subplot index (or -1 if no subplot contains {@code source}). */ - public int getSubplotIndex(Point2D source) { + public /*@GTENegativeOne*/ int getSubplotIndex(Point2D source) { Args.nullNotPermitted(source, "source"); int subplotCount = getSubplotCount(); for (int i = 0; i < subplotCount; i++) { diff --git a/src/main/java/org/jfree/chart/plot/RingPlot.java b/src/main/java/org/jfree/chart/plot/RingPlot.java index c6aceb55b..b88c4e051 100644 --- a/src/main/java/org/jfree/chart/plot/RingPlot.java +++ b/src/main/java/org/jfree/chart/plot/RingPlot.java @@ -52,6 +52,7 @@ */ package org.jfree.chart.plot; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.BasicStroke; import java.awt.Color; @@ -499,7 +500,7 @@ public PiePlotState initialise(Graphics2D g2, Rectangle2D plotArea, * @param currentPass the current pass index. */ @Override - protected void drawItem(Graphics2D g2, int section, Rectangle2D dataArea, + protected void drawItem(Graphics2D g2, /*@NonNegative*/ int section, Rectangle2D dataArea, PiePlotState state, int currentPass) { PieDataset dataset = getDataset(); diff --git a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java index 2cb4486c7..d23762caf 100644 --- a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java +++ b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java @@ -1260,7 +1260,7 @@ protected void drawRadarPoly(Graphics2D g2, Rectangle2D plotArea, Point2D centre, PlotRenderingInfo info, - int series, int catCount, + /*@NonNegative*/ int series, int catCount, double headH, double headW) { Polygon polygon = new Polygon(); @@ -1383,7 +1383,7 @@ protected void drawRadarPoly(Graphics2D g2, * * @see #getDataExtractOrder() */ - protected Number getPlotValue(/*@NonNegative*/ int series, int cat) { + protected Number getPlotValue(/*@NonNegative*/ int series, /*@NonNegative*/ int cat) { Number value = null; if (this.dataExtractOrder == TableOrder.BY_ROW) { value = this.dataset.getValue(series, cat); @@ -1405,7 +1405,7 @@ else if (this.dataExtractOrder == TableOrder.BY_COLUMN) { * @param extent the extent of the arc. */ protected void drawLabel(Graphics2D g2, Rectangle2D plotArea, double value, - int cat, double startAngle, double extent) { + /*@NonNegative*/ int cat, double startAngle, double extent) { FontRenderContext frc = g2.getFontRenderContext(); String label; diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 6e18502e4..26f69c3ab 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -1423,7 +1423,7 @@ public int getDatasetCount() { * @return The index or -1. */ public /*@GTENegativeOne*/ int indexOf(XYDataset dataset) { - for (Map.Entry entry: this.datasets.entrySet()) { + for (Map.Entry entry: this.datasets.entrySet()) { if (dataset == entry.getValue()) { return entry.getKey(); } @@ -1459,7 +1459,7 @@ public void mapDatasetToDomainAxis(/*@NonNegative*/ int index, int axisIndex) { public void mapDatasetToDomainAxes(/*@NonNegative*/ int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); - Integer key = new Integer(index); + /*@NonNegative*/ Integer key = new Integer(index); this.datasetToDomainAxesMap.put(key, new ArrayList(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); @@ -1493,7 +1493,7 @@ public void mapDatasetToRangeAxis(/*@NonNegative*/ int index, int axisIndex) { public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); - Integer key = new Integer(index); + /*@NonNegative*/ Integer key = new Integer(index); this.datasetToRangeAxesMap.put(key, new ArrayList(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java index 4b6b567fd..08ec885e6 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java @@ -371,6 +371,7 @@ public void removeLayer(/*@NonNegative*/ int index) { * * @param layer the layer ({@code null} not permitted). */ + @SuppressWarnings("index") // This method's documentation specifically states that it is unsafe public void removeLayer(DialLayer layer) { // defer argument checking removeLayer(getLayerIndex(layer)); @@ -422,6 +423,7 @@ public void removePointer(/*@NonNegative*/ int index) { * * @param pointer the pointer ({@code null} not permitted). */ + @SuppressWarnings("index") // This method's documentation specifically states that it is unsafe public void removePointer(DialPointer pointer) { // defer argument checking removeLayer(getPointerIndex(pointer)); @@ -691,7 +693,8 @@ public void mapDatasetToScale(/*@NonNegative*/ int index, int scaleIndex) { */ public DialScale getScaleForDataset(/*@NonNegative*/ int datasetIndex) { DialScale result = (DialScale) this.scales.get(0); - Integer scaleIndex = (Integer) this.datasetToScaleMap.get(datasetIndex); + @SuppressWarnings("index") // all scale indices are nonnegative + /*@NonNEgative*/ Integer scaleIndex = (Integer) this.datasetToScaleMap.get(datasetIndex); if (scaleIndex != null) { result = getScale(scaleIndex.intValue()); } diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java index 1523759b7..5a5e1a7e1 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java @@ -81,7 +81,7 @@ public abstract class DialPointer extends AbstractDialLayer /** * The dataset index for the needle. */ - int datasetIndex; + /*@NonNegative*/ int datasetIndex; /** * Creates a new {@code DialPointer} instance. diff --git a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java index 3b2edf987..d85333343 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java @@ -87,7 +87,7 @@ public class DialValueIndicator extends AbstractDialLayer implements DialLayer, static final long serialVersionUID = 803094354130942585L; /** The dataset index. */ - private int datasetIndex; + private /*@NonNegative*/ int datasetIndex; /** The angle that defines the anchor point. */ private double angle; diff --git a/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java b/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java index b8b54219f..5db98a0a9 100644 --- a/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java +++ b/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java @@ -74,7 +74,7 @@ public class StandardDialRange extends AbstractDialLayer implements DialLayer, static final long serialVersionUID = 345515648249364904L; /** The scale index. */ - private int scaleIndex; + private /*@NonNegative*/ int scaleIndex; /** The minimum data value for the scale. */ private double lowerBound; @@ -131,7 +131,7 @@ public StandardDialRange(double lower, double upper, Paint paint) { * * @see #setScaleIndex(int) */ - public int getScaleIndex() { + public /*@NonNegative*/ int getScaleIndex() { return this.scaleIndex; } diff --git a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java index 5eb733393..d49b44712 100644 --- a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java @@ -62,6 +62,7 @@ */ package org.jfree.chart.renderer; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -459,7 +460,7 @@ public void setLegendLine(Shape line) { * used if {@code area} is {@code null}). */ protected void addEntity(EntityCollection entities, Shape area, - XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item, + XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#3.getSeries(#4)")*/ int item, double entityX, double entityY) { if (!getItemCreateEntity(series, item)) { return; @@ -502,13 +503,14 @@ protected void addEntity(EntityCollection entities, Shape area, @Override public void drawSeries(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, PolarPlot plot, XYDataset dataset, - int seriesIndex) { + /*@NonNegative*/ int seriesIndex) { final int numPoints = dataset.getItemCount(seriesIndex); if (numPoints == 0) { return; } GeneralPath poly = null; + @SuppressWarnings("index") // This would fail if the dataset passed to this function was not associated with this plot. Maybe a bug? ValueAxis axis = plot.getAxisForDataset(plot.indexOf(dataset)); for (int i = 0; i < numPoints; i++) { double theta = dataset.getXValue(seriesIndex, i); @@ -694,6 +696,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int series) { if (plot == null) { return null; } + @SuppressWarnings("index") // this renderer belongs to the plot, so plot.getIndexOf returns a non negative XYDataset dataset = plot.getDataset(plot.getIndexOf(this)); if (dataset == null) { return null; diff --git a/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java b/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java index 447484585..13eca091a 100644 --- a/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java +++ b/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java @@ -295,10 +295,11 @@ public Paint getPaint(double value) { } // for value in bounds, do the lookup... - int low = 0; - int high = this.lookupTable.size() - 1; + /*@NonNegative*/ int low = 0; + @SuppressWarnings("index") // lookupTable always has at least one element + /*@NonNegative*/ int high = this.lookupTable.size() - 1; while (high - low > 1) { - int current = (low + high) / 2; + /*@NonNegative*/ int current = (low + high) / 2; item = (PaintItem) this.lookupTable.get(current); if (value >= item.value) { low = current; diff --git a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java index df07663f4..c0bc2b95a 100644 --- a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.renderer; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Color; import java.awt.Paint; @@ -197,7 +198,8 @@ public Paint getChipColor(Number value) { * * @return The paint index. */ - private int getPaintIndex(Number value) { + @SuppressWarnings("index") // paint indices are always non negative + private /*@NonNegative*/ int getPaintIndex(Number value) { return ((Integer) this.paintIndex.get(value)).intValue(); } @@ -301,8 +303,9 @@ public LegendItemCollection getLegendCollection() { String label = entry.getKey().toString(); String description = label; Shape shape = new Rectangle2D.Double(1d, 1d, 1d, 1d); + @SuppressWarnings("index") // paint indices are always nonnegative Paint paint = lookupSeriesPaint( - ((Integer) entry.getValue()).intValue()); + ((/*@NonNegative*/ Integer) entry.getValue()).intValue()); Paint outlinePaint = Color.BLACK; Stroke outlineStroke = DEFAULT_STROKE; @@ -324,8 +327,9 @@ public LegendItemCollection getLegendCollection() { (Integer) entry.getValue()).toString(); String description = label; Shape shape = new Rectangle2D.Double(1d, 1d, 1d, 1d); - Paint paint = getSeriesPaint( - ((Integer) entry.getValue()).intValue() + @SuppressWarnings("index") // paint indices are always nonnegative + Paint paint = getSeriesPaint( + ((/*@NonNegative*/ Integer) entry.getValue()).intValue() ); Paint outlinePaint = Color.BLACK; Stroke outlineStroke = DEFAULT_STROKE; diff --git a/src/main/java/org/jfree/chart/util/ShapeList.java b/src/main/java/org/jfree/chart/util/ShapeList.java index 68ac38f2e..a9af2d641 100644 --- a/src/main/java/org/jfree/chart/util/ShapeList.java +++ b/src/main/java/org/jfree/chart/util/ShapeList.java @@ -149,6 +149,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { * @throws IOException if there is an I/O error. * @throws ClassNotFoundException if there is a classpath problem. */ + @SuppressWarnings("index") // readObject assumes that the object read is actually an object of this class private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); diff --git a/src/main/java/org/jfree/data/general/WaferMapDataset.java b/src/main/java/org/jfree/data/general/WaferMapDataset.java index f753eb0a9..df86914c5 100644 --- a/src/main/java/org/jfree/data/general/WaferMapDataset.java +++ b/src/main/java/org/jfree/data/general/WaferMapDataset.java @@ -42,7 +42,7 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.util.Set; import java.util.TreeSet; @@ -188,7 +188,7 @@ public Set getUniqueValues() { * * @return The data value. */ - public Number getChipValue(/*@NonNegative*/ int chipx, /*@NonNegative*/ int chipy) { + public Number getChipValue(int chipx, int chipy) { return getChipValue(new Integer(chipx), new Integer(chipy)); } From 4b3f6e7d3c513da2b9a6a05aa09eff473fe5cbd1 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sun, 24 Dec 2017 11:42:44 -0500 Subject: [PATCH 18/79] fix crash --- .../BoxAndWhiskerXYToolTipGenerator.java | 2 +- .../chart/labels/XYZToolTipGenerator.java | 3 +- .../org/jfree/chart/plot/CategoryPlot.java | 48 ++++++++++++------ .../chart/plot/CombinedDomainXYPlot.java | 1 + .../jfree/chart/plot/CombinedRangeXYPlot.java | 3 +- .../java/org/jfree/chart/plot/XYPlot.java | 50 +++++++++++++------ .../org/jfree/chart/plot/dial/DialPlot.java | 2 +- .../chart/renderer/PolarItemRenderer.java | 2 +- .../chart/renderer/WaferMapRenderer.java | 4 +- 9 files changed, 78 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 56863b82f..3c3510a19 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -144,9 +144,9 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, NumberFormat formatter = getYFormat(); if (dataset instanceof BoxAndWhiskerXYDataset) { + BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 /*@IndexFor("d.getSeries(series)")*/ int itemD = item; - BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; result[2] = formatter.format(d.getMeanValue(series, itemD)); result[3] = formatter.format(d.getMedianValue(series, itemD)); result[4] = formatter.format(d.getMinRegularValue(series, itemD)); diff --git a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java index b33e5da7d..5625f831f 100644 --- a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -63,6 +64,6 @@ public interface XYZToolTipGenerator extends XYToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); + public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item); } diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index d83395b87..ece5be4ca 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -187,7 +187,7 @@ package org.jfree.chart.plot; /*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -2401,7 +2401,8 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - this.foregroundDomainMarkers.put(new Integer(index), markers); + /*@NonNegative*/ Integer i = index; + this.foregroundDomainMarkers.put(i, markers); } markers.add(marker); } else if (layer == Layer.BACKGROUND) { @@ -2427,19 +2428,23 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L */ public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - Set keys = this.backgroundDomainMarkers.keySet(); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.backgroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { - /*@NonNegative*/ Integer key = (/*@NonNegative*/ Integer) iterator.next(); + @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? + /*@NonNegative*/ Integer key = (Integer) iterator.next(); clearDomainMarkers(key.intValue()); } this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 Set keys = this.foregroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { - /*@NonNegative*/ Integer key = (/*@NonNegative*/ Integer) iterator.next(); + @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? + /*@NonNegative*/ Integer key = (Integer) iterator.next(); clearDomainMarkers(key.intValue()); } this.foregroundDomainMarkers.clear(); @@ -2697,19 +2702,23 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye */ public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - Set keys = this.backgroundRangeMarkers.keySet(); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.backgroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { - /*@NonNegative*/ Integer key = (/*@NonNegative*/ Integer) iterator.next(); + @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? + /*@NonNegative*/ Integer key = (Integer) iterator.next(); clearRangeMarkers(key.intValue()); } this.backgroundRangeMarkers.clear(); } if (this.foregroundRangeMarkers != null) { - Set keys = this.foregroundRangeMarkers.keySet(); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.foregroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { - /*@NonNegative*/ Integer key = (/*@NonNegative*/ Integer) iterator.next(); + @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? + /*@NonNegative*/ Integer key = (Integer) iterator.next(); clearRangeMarkers(key.intValue()); } this.foregroundRangeMarkers.clear(); @@ -3617,7 +3626,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, drawDomainMarkers(g2, dataArea, i, Layer.BACKGROUND); } for (CategoryItemRenderer renderer : this.renderers.values()) { - int i = getIndexOf(renderer); + @SuppressWarnings("index") // renderer is one of the renderers of this object, so getIndexOf must return nonnegative + /*@NonNegative*/ int i = getIndexOf(renderer); drawRangeMarkers(g2, dataArea, i, Layer.BACKGROUND); } @@ -3724,8 +3734,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances in this method private List getDatasetIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); + List result = new ArrayList(); for (Map.Entry entry : this.datasets.entrySet()) { if (entry.getValue() != null) { @@ -3747,8 +3758,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return A list of indices. */ + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances in this method private List getRendererIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); + List result = new ArrayList(); for (Map.Entry entry: this.renderers.entrySet()) { if (entry.getValue() != null) { @@ -5003,12 +5015,18 @@ public Object clone() throws CloneNotSupportedException { } // AxisLocation is immutable, so we can just copy the maps - clone.domainAxisLocations = new HashMap( + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap clonedomainAxisLocations = new HashMap( this.domainAxisLocations); - clone.rangeAxisLocations = new HashMap( + clone.domainAxisLocations = clonedomainAxisLocations; + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap clonerangeAxisLocations = new HashMap( this.rangeAxisLocations); + clone.rangeAxisLocations = clonerangeAxisLocations; - clone.datasets = new HashMap(this.datasets); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap clonedatasets = new HashMap(this.datasets); + clone.datasets = clonedatasets; for (CategoryDataset dataset : clone.datasets.values()) { if (dataset != null) { dataset.addChangeListener(clone); diff --git a/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java b/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java index 44d3ab247..7d4a8808b 100644 --- a/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java +++ b/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java @@ -616,6 +616,7 @@ public void panRangeAxes(double panRange, PlotRenderingInfo info, if (!subplot.isRangePannable()) { return; } + @SuppressWarnings("index") // getSubplotIndex is guaranteed to return non-negative because if the subplot isn't found, then subplot would have been null above and the function would have returned. PlotRenderingInfo subplotInfo = info.getSubplotInfo( info.getSubplotIndex(source)); if (subplotInfo == null) { diff --git a/src/main/java/org/jfree/chart/plot/CombinedRangeXYPlot.java b/src/main/java/org/jfree/chart/plot/CombinedRangeXYPlot.java index 4de3dabb8..4296ff27f 100644 --- a/src/main/java/org/jfree/chart/plot/CombinedRangeXYPlot.java +++ b/src/main/java/org/jfree/chart/plot/CombinedRangeXYPlot.java @@ -564,7 +564,8 @@ public void panDomainAxes(double panRange, PlotRenderingInfo info, if (!subplot.isDomainPannable()) { return; } - PlotRenderingInfo subplotInfo = info.getSubplotInfo( + @SuppressWarnings({"value", "index"}) // this function would already have returned if the subplot was not actually a subplot of this plot + PlotRenderingInfo subplotInfo = info.getSubplotInfo( info.getSubplotIndex(source)); if (subplotInfo == null) { return; diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 26f69c3ab..9a982cdc3 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -236,7 +236,7 @@ package org.jfree.chart.plot; /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> -import org.checkerframework.common.value.qual.ArrayLen; +import org.checkerframework.common.value.qual.*; import org.checkerframework.dataflow.qual.Pure; */ @@ -639,18 +639,31 @@ public XYPlot(XYDataset dataset, ValueAxis domainAxis, ValueAxis rangeAxis, this.axisOffset = RectangleInsets.ZERO_INSETS; // allocate storage for datasets, axes and renderers (all optional) - this.domainAxes = new HashMap(); - this.domainAxisLocations = new HashMap(); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap domainAxes = new HashMap(); + this.domainAxes = domainAxes; + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap domainAxisLocations = new HashMap(); + this.domainAxisLocations = domainAxisLocations; this.foregroundDomainMarkers = new HashMap(); this.backgroundDomainMarkers = new HashMap(); - this.rangeAxes = new HashMap(); - this.rangeAxisLocations = new HashMap(); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap rangeAxes = new HashMap(); + this.rangeAxes = rangeAxes; + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap rangeAxisLocations = new HashMap(); + this.rangeAxisLocations = rangeAxisLocations; this.foregroundRangeMarkers = new HashMap(); this.backgroundRangeMarkers = new HashMap(); - this.datasets = new HashMap(); - this.renderers = new HashMap(); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap datasets = new HashMap(); + this.datasets = datasets; + + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap renderers = new HashMap(); + this.renderers = renderers; this.datasetToDomainAxesMap = new TreeMap(); this.datasetToRangeAxesMap = new TreeMap(); @@ -2434,7 +2447,7 @@ public void addDomainMarker(Marker marker, Layer layer) { */ public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - @SuppressWarnings("index") // keys in backgroundDomainMarkers are non negative? + @SuppressWarnings({"index", "value"}) // keys in backgroundDomainMarkers are non negative? also kelloggm#186 Set keys = this.backgroundDomainMarkers.keySet(); for (Integer key : keys) { clearDomainMarkers(key); @@ -2442,7 +2455,7 @@ public void clearDomainMarkers() { this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { - @SuppressWarnings("index") // keys in foregroundDomainMarkers are non negative? + @SuppressWarnings({"index", "value"}) // keys in foregroundDomainMarkers are non negative? also kelloggm#186 Set keys = this.foregroundDomainMarkers.keySet(); for (Integer key : keys) { clearDomainMarkers(key); @@ -2674,14 +2687,16 @@ public void addRangeMarker(Marker marker, Layer layer) { */ public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - Set keys = this.backgroundRangeMarkers.keySet(); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.backgroundRangeMarkers.keySet(); for (Integer key : keys) { clearRangeMarkers(key); } this.backgroundRangeMarkers.clear(); } if (this.foregroundRangeMarkers != null) { - Set keys = this.foregroundRangeMarkers.keySet(); + @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.foregroundRangeMarkers.keySet(); for (Integer key : keys) { clearRangeMarkers(key); } @@ -3256,11 +3271,13 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw the markers that are associated with a specific dataset... for (XYDataset dataset: this.datasets.values()) { - int datasetIndex = indexOf(dataset); + @SuppressWarnings("index") // dataset is definitely a valid dataset, so its index will be nonnegative + /*@NonNegative*/ int datasetIndex = indexOf(dataset); drawDomainMarkers(g2, dataArea, datasetIndex, Layer.BACKGROUND); } for (XYDataset dataset: this.datasets.values()) { - int datasetIndex = indexOf(dataset); + @SuppressWarnings("index") // dataset is definitely a valid dataset, so its index will be nonnegative + /*@NonNegative*/ int datasetIndex = indexOf(dataset); drawRangeMarkers(g2, dataArea, datasetIndex, Layer.BACKGROUND); } @@ -3383,7 +3400,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * @return The list of indices. */ private List< /*@NonNegative*/ Integer> getDatasetIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); + @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/186 + List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYDataset> entry : this.datasets.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -3397,7 +3415,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, } private List< /*@NonNegative*/ Integer> getRendererIndices(DatasetRenderingOrder order) { - List result = new ArrayList(); + @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/186 + List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYItemRenderer> entry : this.renderers.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -5547,6 +5566,7 @@ public boolean equals(Object obj) { * the plot cannot be cloned. */ @Override + @SuppressWarnings("value") // https://github.com/kelloggm/checker-framework/issues/186, 3 instances public Object clone() throws CloneNotSupportedException { XYPlot clone = (XYPlot) super.clone(); clone.domainAxes = CloneUtils.cloneMapValues(this.domainAxes); diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java index 08ec885e6..3a7664864 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java @@ -694,7 +694,7 @@ public void mapDatasetToScale(/*@NonNegative*/ int index, int scaleIndex) { public DialScale getScaleForDataset(/*@NonNegative*/ int datasetIndex) { DialScale result = (DialScale) this.scales.get(0); @SuppressWarnings("index") // all scale indices are nonnegative - /*@NonNEgative*/ Integer scaleIndex = (Integer) this.datasetToScaleMap.get(datasetIndex); + /*@NonNegative*/ Integer scaleIndex = (Integer) this.datasetToScaleMap.get(datasetIndex); if (scaleIndex != null) { result = getScale(scaleIndex.intValue()); } diff --git a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java index ecc761aab..ad5d1dc2f 100644 --- a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java @@ -77,7 +77,7 @@ public interface PolarItemRenderer { */ public void drawSeries(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, PolarPlot plot, XYDataset dataset, - int seriesIndex); + /*@NonNegative*/ int seriesIndex); /** * Draw the angular gridlines - the spokes. diff --git a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java index c0bc2b95a..6d8ed5b53 100644 --- a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java @@ -43,7 +43,7 @@ */ package org.jfree.chart.renderer; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Color; import java.awt.Paint; @@ -305,7 +305,7 @@ public LegendItemCollection getLegendCollection() { Shape shape = new Rectangle2D.Double(1d, 1d, 1d, 1d); @SuppressWarnings("index") // paint indices are always nonnegative Paint paint = lookupSeriesPaint( - ((/*@NonNegative*/ Integer) entry.getValue()).intValue()); + ((Integer) entry.getValue()).intValue()); Paint outlinePaint = Color.BLACK; Stroke outlineStroke = DEFAULT_STROKE; From 7df959f345089a2ad1e6e375b359fe3e2455f942 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sun, 24 Dec 2017 12:19:39 -0500 Subject: [PATCH 19/79] more annotations --- .../org/jfree/chart/date/SpreadsheetDate.java | 4 +++- .../org/jfree/chart/plot/CategoryPlot.java | 9 +++++--- .../java/org/jfree/chart/plot/XYPlot.java | 22 +++++++++++-------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java index eebd9dbae..63755d9a0 100644 --- a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java +++ b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java @@ -458,7 +458,9 @@ else if (include == SerialDate.INCLUDE_SECOND) { } } int dd = d; - return yy + mm + dd + 1; + @SuppressWarnings("value") // Imprecision due to presence or absence of leap days (checker thinks it may be two higher) + /*@IntRange(from = 2, to = 2958465)*/ int result = yy + mm + dd + 1; + return result; } } diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index ece5be4ca..2ef54fc86 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -2410,7 +2410,8 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - this.backgroundDomainMarkers.put(new Integer(index), markers); + /*@NonNegative*/ Integer i = index; + this.backgroundDomainMarkers.put(i, markers); } markers.add(marker); } @@ -2676,7 +2677,8 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - this.foregroundRangeMarkers.put(new Integer(index), markers); + /*@NonNegative*/ Integer i = index; + this.foregroundRangeMarkers.put(i, markers); } markers.add(marker); } else if (layer == Layer.BACKGROUND) { @@ -2684,7 +2686,8 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - this.backgroundRangeMarkers.put(new Integer(index), markers); + /*@NonNegative*/ Integer i = index; + this.backgroundRangeMarkers.put(i, markers); } markers.add(marker); } diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 9a982cdc3..ab84e8ea5 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -1472,7 +1472,7 @@ public void mapDatasetToDomainAxis(/*@NonNegative*/ int index, int axisIndex) { public void mapDatasetToDomainAxes(/*@NonNegative*/ int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); - /*@NonNegative*/ Integer key = new Integer(index); + /*@NonNegative*/ Integer key = index; this.datasetToDomainAxesMap.put(key, new ArrayList(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); @@ -1506,7 +1506,7 @@ public void mapDatasetToRangeAxis(/*@NonNegative*/ int index, int axisIndex) { public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); - /*@NonNegative*/ Integer key = new Integer(index); + /*@NonNegative*/ Integer key = index; this.datasetToRangeAxesMap.put(key, new ArrayList(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); @@ -2546,7 +2546,8 @@ public void addDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer lay new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - this.foregroundDomainMarkers.put(new Integer(index), markers); + /*@NonNegative*/ Integer i = index; + this.foregroundDomainMarkers.put(i, markers); } markers.add(marker); } @@ -2555,7 +2556,8 @@ else if (layer == Layer.BACKGROUND) { new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - this.backgroundDomainMarkers.put(new Integer(index), markers); + /*@NonNegative*/ Integer i = index; + this.backgroundDomainMarkers.put(i, markers); } markers.add(marker); } @@ -2745,7 +2747,8 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - this.foregroundRangeMarkers.put(new Integer(index), markers); + /*@NonNegative*/ Integer i = index; + this.foregroundRangeMarkers.put(i, markers); } markers.add(marker); } @@ -2754,7 +2757,8 @@ else if (layer == Layer.BACKGROUND) { new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - this.backgroundRangeMarkers.put(new Integer(index), markers); + /*@NonNegative*/ Integer i = index; + this.backgroundRangeMarkers.put(i, markers); } markers.add(marker); } @@ -3399,8 +3403,8 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ + @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances private List< /*@NonNegative*/ Integer> getDatasetIndices(DatasetRenderingOrder order) { - @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/186 List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYDataset> entry : this.datasets.entrySet()) { if (entry.getValue() != null) { @@ -3413,9 +3417,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, } return result; } - + + @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances private List< /*@NonNegative*/ Integer> getRendererIndices(DatasetRenderingOrder order) { - @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/186 List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYItemRenderer> entry : this.renderers.entrySet()) { if (entry.getValue() != null) { From 459770fa37cfc98950dd84d636b403a5acf3d51b Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sun, 24 Dec 2017 20:19:25 -0500 Subject: [PATCH 20/79] remove a few more warnings --- .../renderer/DefaultPolarItemRenderer.java | 4 ++- .../chart/renderer/LookupPaintScale.java | 2 ++ .../jfree/chart/renderer/RendererUtils.java | 31 ++++++++++++------- .../chart/renderer/WaferMapRenderer.java | 2 +- .../AbstractCategoryItemRenderer.java | 17 +++++----- 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java index d49b44712..0659d4201 100644 --- a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java @@ -589,7 +589,9 @@ public void drawSeries(Graphics2D g2, Rectangle2D dataArea, // data area... if (entities != null && ShapeUtils.isPointInRect(dataArea, x, y)) { - addEntity(entities, shape, dataset, seriesIndex, i-1, x, y); + @SuppressWarnings("index") // i - 1 is an index because the i increases once on each iteration of this while loop, and the loop condition is equivalent to the length of this series + /*@IndexFor("dataset.getSeries(seriesIndex)")*/ int i1 = i - 1; + addEntity(entities, shape, dataset, seriesIndex, i1, x, y); } } } diff --git a/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java b/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java index 13eca091a..2213a32c4 100644 --- a/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java +++ b/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java @@ -45,6 +45,8 @@ package org.jfree.chart.renderer; +/*>>> import org.checkerframework.checker.index.qual.*; */ + import java.awt.Color; import java.awt.Paint; import java.io.IOException; diff --git a/src/main/java/org/jfree/chart/renderer/RendererUtils.java b/src/main/java/org/jfree/chart/renderer/RendererUtils.java index bd5b396c8..c86bb203a 100644 --- a/src/main/java/org/jfree/chart/renderer/RendererUtils.java +++ b/src/main/java/org/jfree/chart/renderer/RendererUtils.java @@ -87,8 +87,10 @@ public static int findLiveItemsLowerBound(XYDataset dataset, /*@NonNegative*/ in if (dataset.getDomainOrder() == DomainOrder.ASCENDING) { // for data in ascending order by x-value, we are (broadly) looking // for the index of the highest x-value that is less than xLow - int low = 0; - int high = itemCount - 1; + @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue >= xLow) { // special case where the lowest x-value is >= xLow @@ -114,8 +116,10 @@ public static int findLiveItemsLowerBound(XYDataset dataset, /*@NonNegative*/ in else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // when the x-values are sorted in descending order, the lower // bound is found by calculating relative to the xHigh value - int low = 0; - int high = itemCount - 1; + @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue <= xHigh) { return low; @@ -140,7 +144,8 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // we don't know anything about the ordering of the x-values, // but we can still skip any initial values that fall outside the // range... - int index = 0; + @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int index = 0; // skip any items that don't need including... double x = dataset.getXValue(series, index); while (index < itemCount && x < xLow) { @@ -179,8 +184,10 @@ public static int findLiveItemsUpperBound(XYDataset dataset, /*@NonNegative*/ in return 0; } if (dataset.getDomainOrder() == DomainOrder.ASCENDING) { - int low = 0; - int high = itemCount - 1; + @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > xHigh) { return low; @@ -205,8 +212,10 @@ public static int findLiveItemsUpperBound(XYDataset dataset, /*@NonNegative*/ in else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // when the x-values are descending, the upper bound is found by // comparing against xLow - int low = 0; - int high = itemCount - 1; + @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; int mid = (low + high) / 2; double lowValue = dataset.getXValue(series, low); if (lowValue < xLow) { @@ -232,8 +241,8 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // we don't know anything about the ordering of the x-values, // but we can still skip any trailing values that fall outside the // range... - int index = itemCount - 1; - // skip any items that don't need including... + @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item + /*@IndexFor("dataset.getSeries(series)")*/ int index = itemCount - 1; // skip any items that don't need including... double x = dataset.getXValue(series, index); while (index >= 0 && x > xHigh) { index--; diff --git a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java index 6d8ed5b53..3dc160fab 100644 --- a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java @@ -329,7 +329,7 @@ public LegendItemCollection getLegendCollection() { Shape shape = new Rectangle2D.Double(1d, 1d, 1d, 1d); @SuppressWarnings("index") // paint indices are always nonnegative Paint paint = getSeriesPaint( - ((/*@NonNegative*/ Integer) entry.getValue()).intValue() + ((Integer) entry.getValue()).intValue() ); Paint outlinePaint = Color.BLACK; Stroke outlineStroke = DEFAULT_STROKE; diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index c14596bb7..4fc6b9134 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -217,10 +217,10 @@ public abstract class AbstractCategoryItemRenderer extends AbstractRenderer private CategorySeriesLabelGenerator legendItemURLGenerator; /** The number of rows in the dataset (temporary record). */ - private transient int rowCount; + private transient /*@NonNegative*/ int rowCount; /** The number of columns in the dataset (temporary record). */ - private transient int columnCount; + private transient /*@NonNegative*/ int columnCount; /** * Creates a new renderer with no tool tip generator and no URL generator. @@ -678,7 +678,7 @@ protected CategoryItemRendererState createState(PlotRenderingInfo info) { */ @Override public CategoryItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, CategoryPlot plot, int rendererIndex, + Rectangle2D dataArea, CategoryPlot plot, /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { setPlot(plot); @@ -692,9 +692,10 @@ public CategoryItemRendererState initialise(Graphics2D g2, } CategoryItemRendererState state = createState(info); state.setElementHinting(plot.fetchElementHintingFlag()); - int[] visibleSeriesTemp = new int[this.rowCount]; + int rowCount = this.rowCount; + int[] visibleSeriesTemp = new int[rowCount]; int visibleSeriesCount = 0; - for (int row = 0; row < this.rowCount; row++) { + for (int row = 0; row < rowCount; row++) { if (isSeriesVisible(row)) { visibleSeriesTemp[visibleSeriesCount] = row; visibleSeriesCount++; @@ -931,6 +932,7 @@ public void drawDomainMarker(Graphics2D g2, CategoryPlot plot, CategoryAxis axis, CategoryMarker marker, Rectangle2D dataArea) { Comparable category = marker.getKey(); + @SuppressWarnings("index") // this will fail if this renderer is not associated with the given plot. A bug? CategoryDataset dataset = plot.getDataset(plot.getIndexOf(this)); int columnIndex = dataset.getColumnIndex(category); if (columnIndex < 0) { @@ -1397,7 +1399,7 @@ public DrawingSupplier getDrawingSupplier() { */ protected void updateCrosshairValues(CategoryCrosshairState crosshairState, Comparable rowKey, Comparable columnKey, double value, - int datasetIndex, + /*@NonNegative*/ int datasetIndex, double transX, double transY, PlotOrientation orientation) { Args.nullNotPermitted(orientation, "orientation"); @@ -1586,7 +1588,8 @@ public LegendItemCollection getLegendItems() { if (this.plot == null) { return result; } - int index = this.plot.getIndexOf(this); + @SuppressWarnings("index") // class invariant: this.plot.getIndexOf(this) is always non negative, since this.plot is the plot associated with the renderer + /*@NonNegative*/ int index = this.plot.getIndexOf(this); CategoryDataset dataset = this.plot.getDataset(index); if (dataset == null) { return result; From cfdb626075fc7c2f6ca80e959eeb18f2c4065edb Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Wed, 27 Dec 2017 21:15:58 -0500 Subject: [PATCH 21/79] more annotations/suppressions --- .../annotations/AbstractXYAnnotation.java | 5 ++-- .../jfree/chart/annotations/XYAnnotation.java | 3 ++- .../chart/annotations/XYBoxAnnotation.java | 3 ++- .../annotations/XYDataImageAnnotation.java | 3 ++- .../annotations/XYDrawableAnnotation.java | 3 ++- .../chart/annotations/XYImageAnnotation.java | 3 ++- .../chart/annotations/XYLineAnnotation.java | 3 ++- .../annotations/XYPointerAnnotation.java | 3 ++- .../annotations/XYPolygonAnnotation.java | 3 ++- .../chart/annotations/XYShapeAnnotation.java | 3 ++- .../chart/annotations/XYTextAnnotation.java | 3 ++- .../chart/annotations/XYTitleAnnotation.java | 3 ++- .../chart/entity/XYAnnotationEntity.java | 4 ++-- .../java/org/jfree/chart/plot/XYPlot.java | 4 ++-- .../jfree/chart/renderer/RendererUtils.java | 10 ++++---- .../AbstractCategoryItemRenderer.java | 14 +++++++---- .../chart/renderer/category/AreaRenderer.java | 3 ++- .../chart/renderer/category/BarPainter.java | 6 ++--- .../chart/renderer/category/BarRenderer.java | 18 +++++++------- .../category/BoxAndWhiskerRenderer.java | 2 +- .../category/CategoryItemRenderer.java | 4 ++-- .../category/CategoryItemRendererState.java | 9 +++---- .../category/CategoryStepRenderer.java | 2 +- .../renderer/category/GanttRenderer.java | 18 +++++++------- .../renderer/category/GradientBarPainter.java | 12 ++++++---- .../category/GroupedStackedBarRenderer.java | 13 +++++----- .../category/IntervalBarRenderer.java | 4 ++-- .../renderer/category/LayeredBarRenderer.java | 2 +- .../renderer/category/LevelRenderer.java | 7 +++--- .../category/LineAndShapeRenderer.java | 5 ++-- .../category/StackedAreaRenderer.java | 15 +++++++----- .../renderer/category/StackedBarRenderer.java | 6 ++--- .../renderer/category/StandardBarPainter.java | 6 ++--- .../category/StatisticalBarRenderer.java | 14 +++++------ .../renderer/xy/AbstractXYItemRenderer.java | 16 ++++++++----- .../renderer/xy/CandlestickRenderer.java | 24 ++++++++++++------- .../renderer/xy/ClusteredXYBarRenderer.java | 14 ++++++----- .../renderer/xy/CyclicXYItemRenderer.java | 13 ++++++---- .../chart/renderer/xy/DeviationRenderer.java | 2 +- .../renderer/xy/SamplingXYLineRenderer.java | 2 +- .../renderer/xy/StackedXYAreaRenderer.java | 2 +- .../renderer/xy/StackedXYAreaRenderer2.java | 4 ++-- .../renderer/xy/StackedXYBarRenderer.java | 2 +- .../renderer/xy/StandardXYItemRenderer.java | 3 ++- .../chart/renderer/xy/XYBarRenderer.java | 24 ++++++++++++------- .../renderer/xy/XYDifferenceRenderer.java | 2 +- .../chart/renderer/xy/XYItemRenderer.java | 5 ++-- .../renderer/xy/XYLineAndShapeRenderer.java | 2 +- .../chart/renderer/xy/XYShapeRenderer.java | 2 +- 49 files changed, 195 insertions(+), 138 deletions(-) diff --git a/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java b/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java index 703960283..5b8681996 100644 --- a/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java @@ -42,6 +42,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.Shape; @@ -138,7 +139,7 @@ public void setURL(String url) { @Override public abstract void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info); /** @@ -152,7 +153,7 @@ public abstract void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, * @param urlText the URL text. */ protected void addEntity(PlotRenderingInfo info, - Shape hotspot, int rendererIndex, + Shape hotspot, /*@NonNegative*/ int rendererIndex, String toolTipText, String urlText) { if (info == null) { return; diff --git a/src/main/java/org/jfree/chart/annotations/XYAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYAnnotation.java index 44dd3659c..b7ca275a4 100644 --- a/src/main/java/org/jfree/chart/annotations/XYAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYAnnotation.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -76,6 +77,6 @@ public interface XYAnnotation extends Annotation { */ public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, PlotRenderingInfo info); + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info); } diff --git a/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java index 7fcc4788c..211b9d632 100644 --- a/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.BasicStroke; import java.awt.Color; @@ -162,7 +163,7 @@ public XYBoxAnnotation(double x0, double y0, double x1, double y1, @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, PlotRenderingInfo info) { + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); RectangleEdge domainEdge = Plot.resolveDomainAxisLocation( diff --git a/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java index efaca762e..da97c872a 100644 --- a/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.Image; @@ -243,7 +244,7 @@ public Range getYRange() { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java index 19794173b..a5787eeab 100644 --- a/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.geom.AffineTransform; @@ -145,7 +146,7 @@ public XYDrawableAnnotation(double x, double y, double displayWidth, @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java index 17ffc580e..e6de5f1e8 100644 --- a/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.Image; @@ -193,7 +194,7 @@ public RectangleAnchor getImageAnchor() { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java index 59ea96ee3..159053f88 100644 --- a/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java @@ -50,6 +50,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.BasicStroke; import java.awt.Color; @@ -161,7 +162,7 @@ public XYLineAnnotation(double x1, double y1, double x2, double y2, @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java index 12580a4fe..2a0ee465d 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.BasicStroke; import java.awt.Color; @@ -376,7 +377,7 @@ public void setArrowPaint(Paint paint) { */ @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, - ValueAxis domainAxis, ValueAxis rangeAxis, int rendererIndex, + ValueAxis domainAxis, ValueAxis rangeAxis, /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java index 808650118..fba454781 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.BasicStroke; import java.awt.Color; @@ -207,7 +208,7 @@ public Paint getOutlinePaint() { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, PlotRenderingInfo info) { + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { // if we don't have at least 2 (x, y) coordinates, just return if (this.polygon.length < 4) { diff --git a/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java index 0320bdda2..16ff77f49 100644 --- a/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.BasicStroke; import java.awt.Color; @@ -160,7 +161,7 @@ public XYShapeAnnotation(Shape shape, Stroke stroke, Paint outlinePaint, @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java index ef15c07e5..224923559 100644 --- a/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.BasicStroke; import java.awt.Color; @@ -515,7 +516,7 @@ public void setOutlineVisible(boolean visible) { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, PlotRenderingInfo info) { + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); RectangleEdge domainEdge = Plot.resolveDomainAxisLocation( diff --git a/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java index 96b2e2585..8727c247c 100644 --- a/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.annotations; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.geom.Point2D; @@ -244,7 +245,7 @@ public void setMaxHeight(double max) { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - int rendererIndex, PlotRenderingInfo info) { + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); AxisLocation domainAxisLocation = plot.getDomainAxisLocation(); diff --git a/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java b/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java index 59319e29e..f35c879fb 100644 --- a/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.entity; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Shape; import java.io.Serializable; @@ -65,7 +65,7 @@ public class XYAnnotationEntity extends ChartEntity * @param toolTipText the tool tip text. * @param urlText the URL text for HTML image maps. */ - public XYAnnotationEntity(Shape hotspot, int rendererIndex, + public XYAnnotationEntity(Shape hotspot, /*@NonNegative*/ int rendererIndex, String toolTipText, String urlText) { super(hotspot, toolTipText, urlText); this.rendererIndex = rendererIndex; diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index ab84e8ea5..1235784d8 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -1709,8 +1709,8 @@ public void setSeriesRenderingOrder(SeriesRenderingOrder order) { * * @return The renderer index. */ - public int getIndexOf(XYItemRenderer renderer) { - for (Map.Entry entry + public /*@GTENegativeOne*/ int getIndexOf(XYItemRenderer renderer) { + for (Map.Entry entry : this.renderers.entrySet()) { if (entry.getValue() == renderer) { return entry.getKey(); diff --git a/src/main/java/org/jfree/chart/renderer/RendererUtils.java b/src/main/java/org/jfree/chart/renderer/RendererUtils.java index c86bb203a..ee3bc3651 100644 --- a/src/main/java/org/jfree/chart/renderer/RendererUtils.java +++ b/src/main/java/org/jfree/chart/renderer/RendererUtils.java @@ -145,9 +145,10 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // but we can still skip any initial values that fall outside the // range... @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int index = 0; + /*@IndexFor("dataset.getSeries(series)")*/ int i = 0; // skip any items that don't need including... - double x = dataset.getXValue(series, index); + double x = dataset.getXValue(series, i); + int index = i; while (index < itemCount && x < xLow) { index++; if (index < itemCount) { @@ -241,9 +242,10 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // we don't know anything about the ordering of the x-values, // but we can still skip any trailing values that fall outside the // range... + int index = itemCount - 1; @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int index = itemCount - 1; // skip any items that don't need including... - double x = dataset.getXValue(series, index); + /*@IndexFor("dataset.getSeries(series)")*/ int indexTmp = index; // skip any items that don't need including... + double x = dataset.getXValue(series, indexTmp); while (index >= 0 && x > xHigh) { index--; if (index >= 0) { diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 4fc6b9134..54f8b507e 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -112,7 +112,7 @@ package org.jfree.chart.renderer.category; /*>>> -import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.index.qual.*; */ import java.awt.AlphaComposite; @@ -247,7 +247,7 @@ protected AbstractCategoryItemRenderer() { * @return The pass count. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 1; } @@ -697,13 +697,17 @@ public CategoryItemRendererState initialise(Graphics2D g2, int visibleSeriesCount = 0; for (int row = 0; row < rowCount; row++) { if (isSeriesVisible(row)) { - visibleSeriesTemp[visibleSeriesCount] = row; + @SuppressWarnings("index") // visibleSeriesCount is incremented at most as many times as row, which is an index + /*@IndexFor("visibleSeriesTemp")*/ int visibleSeriesCountTemp = visibleSeriesCount; + visibleSeriesTemp[visibleSeriesCountTemp] = row; visibleSeriesCount++; } } - int[] visibleSeries = new int[visibleSeriesCount]; + /*@NonNegative*/ int[] visibleSeries = new int[visibleSeriesCount]; + @SuppressWarnings("index") // visibleSeriesCount is incremented at most as many times as row, which is an index + /*@IndexOrHigh({"visibleSeriesTemp", "visibleSeries"})*/ int visibleSeriesCountTemp = visibleSeriesCount; System.arraycopy(visibleSeriesTemp, 0, visibleSeries, 0, - visibleSeriesCount); + visibleSeriesCountTemp); state.setVisibleSeriesArray(visibleSeries); return state; } diff --git a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java index a7d90975a..9542c41e4 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java @@ -324,7 +324,8 @@ else if (orientation == PlotOrientation.HORIZONTAL) { } // submit the current data point as a crosshair candidate - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), yy1, datasetIndex, x1, y1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/category/BarPainter.java b/src/main/java/org/jfree/chart/renderer/category/BarPainter.java index 43a0e9d46..48b3b77d5 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarPainter.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.RectangularShape; @@ -73,7 +73,7 @@ public interface BarPainter { * @param base the base of the bar. */ public void paintBar(Graphics2D g2, BarRenderer renderer, - int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base); + /*@NonNegative*/ int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base); /** * Paints the shadow for a single bar on behalf of a renderer. @@ -87,7 +87,7 @@ public void paintBar(Graphics2D g2, BarRenderer renderer, * @param pegShadow peg the shadow to the base of the bar? */ public void paintBarShadow(Graphics2D g2, BarRenderer renderer, - int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, + /*@NonNegative*/ int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, boolean pegShadow); } diff --git a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java index d5eefa5bb..633570c11 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java @@ -95,6 +95,7 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -747,7 +748,7 @@ public double getUpperClip() { */ @Override public CategoryItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, CategoryPlot plot, int rendererIndex, + Rectangle2D dataArea, CategoryPlot plot, /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { CategoryItemRendererState state = super.initialise(g2, dataArea, plot, @@ -775,7 +776,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, */ protected void calculateBarWidth(CategoryPlot plot, Rectangle2D dataArea, - int rendererIndex, + /*@NonNegative*/ int rendererIndex, CategoryItemRendererState state) { CategoryAxis domainAxis = getDomainAxis(plot, rendererIndex); @@ -831,7 +832,7 @@ else if (orientation == PlotOrientation.VERTICAL) { protected double calculateBarW0(CategoryPlot plot, PlotOrientation orientation, Rectangle2D dataArea, CategoryAxis domainAxis, CategoryItemRendererState state, - int row, /*@NonNegative*/ int column) { + /*@NonNegative*/ int row, /*@NonNegative*/ int column) { // calculate bar width... double space; if (orientation == PlotOrientation.HORIZONTAL) { @@ -869,7 +870,7 @@ protected double calculateBarW0(CategoryPlot plot, * @return The coordinates for each end of the bar (or {@code null} if * the bar is not visible for the current axis range). */ - protected double[] calculateBarL0L1(double value) { + protected double /*@ArrayLen(2)*/ [] calculateBarL0L1(double value) { double lclip = getLowerClip(); double uclip = getUpperClip(); double barLow = Math.min(this.base, value); @@ -989,7 +990,7 @@ urlText, true, shape, true, paint, isDrawBarOutline(), public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - int column, int pass) { + /*@NonNegative*/ int column, int pass) { // nothing is drawn if the row index is not included in the list with // the indices of the visible rows... @@ -1084,7 +1085,8 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, } // submit the current data point as a crosshair candidate - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), value, datasetIndex, barW0, barL0, orientation); @@ -1132,8 +1134,8 @@ protected double calculateSeriesWidth(double space, CategoryAxis axis, */ protected void drawItemLabel(Graphics2D g2, CategoryDataset data, - int row, - int column, + /*@NonNegative*/ int row, + /*@NonNegative*/ int column, CategoryPlot plot, CategoryItemLabelGenerator generator, Rectangle2D bar, diff --git a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java index c47bd64ca..41afd1eaf 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java @@ -527,7 +527,7 @@ public Range findRangeBounds(CategoryDataset dataset) { */ @Override public CategoryItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, CategoryPlot plot, int rendererIndex, + Rectangle2D dataArea, CategoryPlot plot, /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { CategoryItemRendererState state = super.initialise(g2, dataArea, plot, diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java index 3d2be092f..85e781d4b 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java @@ -152,7 +152,7 @@ public interface CategoryItemRenderer extends LegendItemSource { * * @return The pass count. */ - public int getPassCount(); + public /*@NonNegative*/ int getPassCount(); /** * Returns the plot that the renderer has been assigned to (where @@ -223,7 +223,7 @@ public interface CategoryItemRenderer extends LegendItemSource { public CategoryItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, CategoryPlot plot, - int rendererIndex, + /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info); /** diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java index e044b2bed..902a6088e 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java @@ -44,7 +44,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import org.jfree.chart.plot.CategoryCrosshairState; import org.jfree.chart.plot.PlotRenderingInfo; @@ -63,7 +63,7 @@ public class CategoryItemRendererState extends RendererState { private double seriesRunningTotal; /** The array with the indices of the visible series.*/ - private int[] visibleSeries; + private /*@NonNegative*/ int[] visibleSeries; /** * State information for crosshairs in the plot (this is updated by the @@ -205,7 +205,8 @@ public int getVisibleSeriesCount() { * * @since 1.0.13 */ - public int[] getVisibleSeriesArray() { + @SuppressWarnings("index") // this.visibleSeries only contains nonnegatives. The result array is a copy of this array + public /*@NonNegative*/ int[] getVisibleSeriesArray() { if (this.visibleSeries == null) { return null; } @@ -222,7 +223,7 @@ public int[] getVisibleSeriesArray() { * * @since 1.0.13 */ - public void setVisibleSeriesArray(int[] visibleSeries) { + public void setVisibleSeriesArray(/*@NonNegative*/ int[] visibleSeries) { this.visibleSeries = visibleSeries; } diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java index f7adc1523..21eb4e347 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java @@ -278,7 +278,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - int column, int pass) { + /*@NonNegative*/ int column, int pass) { // do nothing if item is not visible if (!getItemVisible(row, column)) { diff --git a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java index 81cf93ccf..0bc074df1 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java @@ -54,7 +54,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.Graphics2D; @@ -244,7 +244,7 @@ public void setEndPercent(double percent) { public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - int column, int pass) { + /*@NonNegative*/ int column, int pass) { if (dataset instanceof GanttCategoryDataset) { GanttCategoryDataset gcd = (GanttCategoryDataset) dataset; @@ -278,8 +278,8 @@ protected void drawTasks(Graphics2D g2, CategoryAxis domainAxis, ValueAxis rangeAxis, GanttCategoryDataset dataset, - int row, - int column) { + /*@NonNegative*/ int row, + /*@NonNegative*/ int column) { int count = dataset.getSubIntervalCount(row, column); if (count == 0) { @@ -384,7 +384,8 @@ else if (orientation == PlotOrientation.VERTICAL) { if (subinterval == count - 1) { // submit the current data point as a crosshair candidate - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); Comparable columnKey = dataset.getColumnKey(column); Comparable rowKey = dataset.getRowKey(row); double xx = domainAxis.getCategorySeriesMiddle(columnKey, @@ -426,8 +427,8 @@ protected void drawTask(Graphics2D g2, CategoryAxis domainAxis, ValueAxis rangeAxis, GanttCategoryDataset dataset, - int row, - int column) { + /*@NonNegative*/ int row, + /*@NonNegative*/ int column) { PlotOrientation orientation = plot.getOrientation(); RectangleEdge rangeAxisLocation = plot.getRangeAxisEdge(); @@ -534,7 +535,8 @@ else if (plot.getOrientation() == PlotOrientation.VERTICAL) { } // submit the current data point as a crosshair candidate - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); Comparable columnKey = dataset.getColumnKey(column); Comparable rowKey = dataset.getRowKey(row); double xx = domainAxis.getCategorySeriesMiddle(columnKey, rowKey, diff --git a/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java b/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java index 20a569e84..62996bc76 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java @@ -41,7 +41,9 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -105,7 +107,7 @@ public GradientBarPainter(double g1, double g2, double g3) { */ @Override public void paintBar(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, - int column, RectangularShape bar, RectangleEdge base) { + /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); @@ -207,7 +209,7 @@ else if (base == RectangleEdge.LEFT || base == RectangleEdge.RIGHT) { */ @Override public void paintBarShadow(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, - int column, RectangularShape bar, RectangleEdge base, + /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { // handle a special case - if the bar colour has alpha == 0, it is @@ -290,7 +292,7 @@ else if (base == RectangleEdge.RIGHT) { * * @return An array containing four subregions. */ - private Rectangle2D[] splitVerticalBar(RectangularShape bar, double a, + private Rectangle2D /*@ArrayLen(4)*/ [] splitVerticalBar(RectangularShape bar, double a, double b, double c) { Rectangle2D[] result = new Rectangle2D[4]; double x0 = bar.getMinX(); @@ -319,7 +321,7 @@ private Rectangle2D[] splitVerticalBar(RectangularShape bar, double a, * * @return An array containing four subregions. */ - private Rectangle2D[] splitHorizontalBar(RectangularShape bar, double a, + private Rectangle2D /*@ArrayLen(4)*/ [] splitHorizontalBar(RectangularShape bar, double a, double b, double c) { Rectangle2D[] result = new Rectangle2D[4]; double y0 = bar.getMinY(); diff --git a/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java index 53ff2a992..4ab965ce4 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java @@ -48,7 +48,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -138,7 +138,7 @@ public Range findRangeBounds(CategoryDataset dataset) { */ @Override protected void calculateBarWidth(CategoryPlot plot, Rectangle2D dataArea, - int rendererIndex, CategoryItemRendererState state) { + /*@NonNegative*/ int rendererIndex, CategoryItemRendererState state) { // calculate the bar width CategoryAxis xAxis = plot.getDomainAxisForDataset(rendererIndex); @@ -197,7 +197,7 @@ else if (orientation == PlotOrientation.VERTICAL) { protected double calculateBarW0(CategoryPlot plot, PlotOrientation orientation, Rectangle2D dataArea, CategoryAxis domainAxis, CategoryItemRendererState state, - int row, /*@NonNegative*/ int column) { + /*@NonNegative*/ int row, /*@NonNegative*/ int column) { // calculate bar width... double space; if (orientation == PlotOrientation.HORIZONTAL) { @@ -209,9 +209,10 @@ protected double calculateBarW0(CategoryPlot plot, double barW0 = domainAxis.getCategoryStart(column, getColumnCount(), dataArea, plot.getDomainAxisEdge()); int groupCount = this.seriesToGroupMap.getGroupCount(); + @SuppressWarnings("index") // this renderer is assumed to be associated with the plot passed to this function. If that isn't true, this will fail. A bug? + CategoryDataset dataset = plot.getDataset(plot.getIndexOf(this)); int groupIndex = this.seriesToGroupMap.getGroupIndex( - this.seriesToGroupMap.getGroup(plot.getDataset( - plot.getIndexOf(this)).getRowKey(row))); + this.seriesToGroupMap.getGroup(dataset.getRowKey(row))); int categoryCount = getColumnCount(); if (groupCount > 1) { double groupGap = space * getItemMargin() @@ -247,7 +248,7 @@ protected double calculateBarW0(CategoryPlot plot, public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - int column, int pass) { + /*@NonNegative*/ int column, int pass) { // nothing is drawn for null values... Number dataValue = dataset.getValue(row, column); diff --git a/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java index 4b4db503c..8889d0c32 100644 --- a/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java @@ -68,7 +68,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -168,7 +168,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, protected void drawInterval(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, IntervalCategoryDataset dataset, /*@NonNegative*/ int row, - int column) { + /*@NonNegative*/ int column) { int visibleRow = state.getVisibleSeriesIndex(row); if (visibleRow < 0) { diff --git a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java index 14193e7e3..3c662d3fd 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java @@ -139,7 +139,7 @@ public void setSeriesBarWidth(/*@NonNegative*/ int series, double width) { */ @Override protected void calculateBarWidth(CategoryPlot plot, Rectangle2D dataArea, - int rendererIndex, CategoryItemRendererState state) { + /*@NonNegative*/ int rendererIndex, CategoryItemRendererState state) { // calculate the bar width - this calculation differs from the // BarRenderer calculation because the bars are layered on top of one diff --git a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java index 7ac51c06a..123e4c48d 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java @@ -184,7 +184,7 @@ public void setMaximumItemWidth(double percent) { */ @Override public CategoryItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, CategoryPlot plot, int rendererIndex, + Rectangle2D dataArea, CategoryPlot plot, /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { CategoryItemRendererState state = super.initialise(g2, dataArea, plot, rendererIndex, info); @@ -201,7 +201,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * @param state the renderer state. */ protected void calculateItemWidth(CategoryPlot plot, - Rectangle2D dataArea, int rendererIndex, + Rectangle2D dataArea, /*@NonNegative*/ int rendererIndex, CategoryItemRendererState state) { CategoryAxis domainAxis = getDomainAxis(plot, rendererIndex); @@ -363,7 +363,8 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, } // submit the current data point as a crosshair candidate - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), value, datasetIndex, barW0, barL, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java index 14f79b144..c8ef1d843 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java @@ -692,7 +692,7 @@ urlText, shapeVisible, shape, getItemShapeFilled(series, 0), * @return The pass count ({@code 2} for this renderer). */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 2; } @@ -836,7 +836,8 @@ else if (orientation == PlotOrientation.VERTICAL) { } // submit the current data point as a crosshair candidate - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), value, datasetIndex, x1, y1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java index 85474eb39..720e66c86 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java @@ -67,6 +67,8 @@ */ package org.jfree.chart.renderer.category; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -159,7 +161,7 @@ public void setRenderAsPercentages(boolean asPercentages) { * @return The number of passes required by the renderer. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 2; } @@ -252,7 +254,8 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, double xx0 = domainAxis.getCategoryStart(column, getColumnCount(), dataArea, plot.getDomainAxisEdge()); - int itemCount = dataset.getColumnCount(); + @SuppressWarnings("index") // Possible bug. I don't see anything that implies that there is an item in the dataset, but I might I have missed it + /*@Positive*/ int itemCount = dataset.getColumnCount(); double y2 = 0.0; n = dataset.getValue(row, Math.min(column + 1, itemCount - 1)); if (n != null) { @@ -413,8 +416,8 @@ else if (pass == 1) { * for all series values up to but excluding {@code series} * for {@code index}. */ - protected double[] getStackValues(CategoryDataset dataset, - int series, /*@NonNegative*/ int index, int[] validRows) { + protected double /*@ArrayLen(2)*/ [] getStackValues(CategoryDataset dataset, + int series, /*@NonNegative*/ int index, /*@NonNegative*/ int[] validRows) { double[] result = new double[2]; double total = 0.0; if (this.renderAsPercentages) { @@ -453,7 +456,7 @@ protected double[] getStackValues(CategoryDataset dataset, * * @return A pair of average stack values. */ - private double[] averageStackValues(double[] stack1, double[] stack2) { + private double /*@ArrayLen(2)*/ [] averageStackValues(double /*@MinLen(2)*/ [] stack1, double /*@MinLen(2)*/ [] stack2) { double[] result = new double[2]; result[0] = (stack1[0] + stack2[0]) / 2.0; result[1] = (stack1[1] + stack2[1]) / 2.0; @@ -470,7 +473,7 @@ private double[] averageStackValues(double[] stack1, double[] stack2) { * * @return A pair of average stack values. */ - private double[] adjustedStackValues(double[] stack1, double[] stack2) { + private double /*@ArrayLen(2)*/ [] adjustedStackValues(double /*@MinLen(2)*/ [] stack1, double /*@MinLen(2)*/ [] stack2) { double[] result = new double[2]; if (stack1[0] == 0.0 || stack2[0] == 0.0) { result[0] = 0.0; diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java index a5399158f..075454c2c 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java @@ -201,7 +201,7 @@ public void setRenderAsPercentages(boolean asPercentages) { * @return The number of passes required by the renderer. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 3; } @@ -236,7 +236,7 @@ public Range findRangeBounds(CategoryDataset dataset) { */ @Override protected void calculateBarWidth(CategoryPlot plot, Rectangle2D dataArea, - int rendererIndex, CategoryItemRendererState state) { + /*@NonNegative*/ int rendererIndex, CategoryItemRendererState state) { // calculate the bar width CategoryAxis xAxis = plot.getDomainAxisForDataset(rendererIndex); @@ -288,7 +288,7 @@ else if (orientation == PlotOrientation.VERTICAL) { public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - int column, int pass) { + /*@NonNegative*/ int column, int pass) { if (!isSeriesVisible(row)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java b/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java index c6dd94dcf..fefb0872f 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -83,7 +83,7 @@ public StandardBarPainter() { */ @Override public void paintBar(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, - int column, RectangularShape bar, RectangleEdge base) { + /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); GradientPaintTransformer t = renderer.getGradientPaintTransformer(); @@ -121,7 +121,7 @@ public void paintBar(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int r */ @Override public void paintBarShadow(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, - int column, RectangularShape bar, RectangleEdge base, + /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { // handle a special case - if the bar colour has alpha == 0, it is diff --git a/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java index 429107b81..a8d1cda01 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java @@ -63,7 +63,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; import java.awt.Color; @@ -266,9 +266,9 @@ protected void drawHorizontalItem(Graphics2D g2, CategoryAxis domainAxis, ValueAxis rangeAxis, StatisticalCategoryDataset dataset, - int visibleRow, - int row, - int column) { + /*@NonNegative*/ int visibleRow, + /*@NonNegative*/ int row, + /*@NonNegative*/ int column) { // BAR Y double rectY = calculateBarW0(plot, PlotOrientation.HORIZONTAL, @@ -413,9 +413,9 @@ protected void drawVerticalItem(Graphics2D g2, CategoryAxis domainAxis, ValueAxis rangeAxis, StatisticalCategoryDataset dataset, - int visibleRow, - int row, - int column) { + /*@NonNegative*/ int visibleRow, + /*@NonNegative*/ int row, + /*@NonNegative*/ int column) { // BAR X double rectX = calculateBarW0(plot, PlotOrientation.VERTICAL, dataArea, diff --git a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java index d955ea778..bd9320fd3 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java @@ -128,6 +128,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -270,7 +272,7 @@ protected AbstractXYItemRenderer() { * @return The pass count. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 1; } @@ -330,7 +332,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @since 1.0.20 */ protected void beginElementGroup(Graphics2D g2, Comparable seriesKey, - int itemIndex) { + /*@NonNegative*/ int itemIndex) { beginElementGroup(g2, new XYItemKey(seriesKey, itemIndex)); } @@ -814,7 +816,8 @@ public LegendItemCollection getLegendItems() { return new LegendItemCollection(); } LegendItemCollection result = new LegendItemCollection(); - int index = this.plot.getIndexOf(this); + @SuppressWarnings("index") // this is guaranteed to be a renderer for this.plot, so indexOf will return nonnegative + /*@NonNegative*/ int index = this.plot.getIndexOf(this); XYDataset dataset = this.plot.getDataset(index); if (dataset != null) { int seriesCount = dataset.getSeriesCount(); @@ -1628,7 +1631,7 @@ protected void updateCrosshairValues(CrosshairState crosshairState, * label position). */ protected void drawItemLabel(Graphics2D g2, PlotOrientation orientation, - XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item, double x, double y, + XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#3.getSeries(#4)")*/ int item, double x, double y, boolean negative) { XYItemLabelGenerator generator = getItemLabelGenerator(series, item); @@ -1687,7 +1690,8 @@ else if (layer.equals(Layer.BACKGROUND)) { } while (iterator.hasNext()) { XYAnnotation annotation = (XYAnnotation) iterator.next(); - int index = this.plot.getIndexOf(this); + @SuppressWarnings("index") // this is a renderer of this.plot by definition, so indexOf will return nonnegative + /*@NonNegative*/ int index = this.plot.getIndexOf(this); annotation.draw(g2, this.plot, dataArea, domainAxis, rangeAxis, index, info); } @@ -1712,7 +1716,7 @@ else if (layer.equals(Layer.BACKGROUND)) { * {@code hotspot} is {@code null}). */ protected void addEntity(EntityCollection entities, Shape hotspot, - XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item, double entityX, + XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#3.getSeries(#4)")*/ int item, double entityX, double entityY) { if (!getItemCreateEntity(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java index 1104fad88..477133771 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java @@ -87,6 +87,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; @@ -647,7 +649,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { boolean horiz; PlotOrientation orientation = plot.getOrientation(); @@ -668,12 +670,14 @@ else if (orientation == PlotOrientation.VERTICAL) { } OHLCDataset highLowData = (OHLCDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("highLowData.getSeries(series)")*/ int highLowItem = item; - double x = highLowData.getXValue(series, item); - double yHigh = highLowData.getHighValue(series, item); - double yLow = highLowData.getLowValue(series, item); - double yOpen = highLowData.getOpenValue(series, item); - double yClose = highLowData.getCloseValue(series, item); + double x = highLowData.getXValue(series, highLowItem); + double yHigh = highLowData.getHighValue(series, highLowItem); + double yLow = highLowData.getLowValue(series, highLowItem); + double yOpen = highLowData.getOpenValue(series, highLowItem); + double yClose = highLowData.getCloseValue(series, highLowItem); RectangleEdge domainEdge = plot.getDomainAxisEdge(); double xx = domainAxis.valueToJava2D(x, dataArea, domainEdge); @@ -727,11 +731,13 @@ else if (orientation == PlotOrientation.VERTICAL) { case WIDTHMETHOD_INTERVALDATA: IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("intervalXYData.getSeries(series)")*/ int intervalXYItem = item; double startPos = domainAxis.valueToJava2D( - intervalXYData.getStartXValue(series, item), + intervalXYData.getStartXValue(series, intervalXYItem), dataArea, plot.getDomainAxisEdge()); double endPos = domainAxis.valueToJava2D( - intervalXYData.getEndXValue(series, item), + intervalXYData.getEndXValue(series, intervalXYItem), dataArea, plot.getDomainAxisEdge()); xxWidth = Math.abs(endPos - startPos); break; @@ -754,7 +760,7 @@ else if (orientation == PlotOrientation.VERTICAL) { g2.setStroke(s); if (this.drawVolume) { - int volume = (int) highLowData.getVolumeValue(series, item); + int volume = (int) highLowData.getVolumeValue(series, highLowItem); double volumeHeight = volume / this.maxVolume; double min, max; diff --git a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java index 989e862f4..236e4eaf1 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java @@ -137,7 +137,7 @@ public ClusteredXYBarRenderer(double margin, * @return {@code 2}. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 2; } @@ -229,16 +229,18 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; double y0; double y1; if (getUseYInterval()) { - y0 = intervalDataset.getStartYValue(series, item); - y1 = intervalDataset.getEndYValue(series, item); + y0 = intervalDataset.getStartYValue(series, intervalXYItem); + y1 = intervalDataset.getEndYValue(series, intervalXYItem); } else { y0 = getBase(); - y1 = intervalDataset.getYValue(series, item); + y1 = intervalDataset.getYValue(series, intervalXYItem); } if (Double.isNaN(y0) || Double.isNaN(y1)) { return; @@ -250,10 +252,10 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, plot.getRangeAxisEdge()); RectangleEdge xAxisLocation = plot.getDomainAxisEdge(); - double x0 = intervalDataset.getStartXValue(series, item); + double x0 = intervalDataset.getStartXValue(series, intervalXYItem); double xx0 = domainAxis.valueToJava2D(x0, dataArea, xAxisLocation); - double x1 = intervalDataset.getEndXValue(series, item); + double x1 = intervalDataset.getEndXValue(series, intervalXYItem); double xx1 = domainAxis.valueToJava2D(x1, dataArea, xAxisLocation); double intervalW = xx1 - xx0; // this may be negative diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 3f43850a8..94fa97a43 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -226,12 +226,16 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, ny[1] = ycycleBound; nx[1] = (x[1] - x[0]) * (ycycleBound - y[0]) / (y[1] - y[0]) + x[0]; + if (x.length == 3) { - nx[3] = x[2]; ny[3] = y[2]; + @SuppressWarnings("index") // x's length is exactly one less than both nx and ny; x and y's lengths are the same + double dead = (nx[3] = x[2]); + @SuppressWarnings("index") // x's length is exactly one less than both nx and ny; x and y's lengths are the same + double dead2 = (ny[3] = y[2]); } x = nx; y = ny; } - else if ((x.length == 3) && (y[1] != y[2]) && ((ycycleBound >= y[1]) + else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound >= y[1]) && (ycycleBound <= y[2]) || (ycycleBound >= y[2]) && (ycycleBound <= y[1]))) { double[] nx = new double[4]; @@ -294,7 +298,7 @@ else if ((x.length == 3) && (y[1] != y[2]) && ((ycycleBound >= y[1]) super.drawItem(g2, state, dataArea, info, plot, domainAxis, rangeAxis, newset, series, 2, crosshairState, pass); - if (x.length == 4) { + if (x.length == 4 && y.length == 4) { if (cnax != null) { if (xcycleBound == x[2]) { cnax.setBoundMappedToLastCycle(x[3] <= xcycleBound); @@ -341,7 +345,7 @@ protected static class OverwriteDataSet implements XYDataset { * @param y the y values. * @param delegateSet the dataset. */ - public OverwriteDataSet(double [] x, double[] y, + public OverwriteDataSet(double /*@SameLen("#2")*/ [] x, double /*@SameLen("#1")*/ [] y, XYDataset delegateSet) { this.delegateSet = delegateSet; this.x = new Double[x.length]; this.y = new Double[y.length]; @@ -369,6 +373,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override + @SuppressWarnings("index") // establish repr. invariant public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.x.length; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java index 616334654..053e6cb1c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java @@ -214,7 +214,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return {@code 3}. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 3; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java index 059b13c04..06969aec1 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java @@ -104,7 +104,7 @@ public SamplingXYLineRenderer() { * @return The pass count. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 1; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java index a49dc8bec..992adcdab 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java @@ -345,7 +345,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return 2. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 2; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java index a03c9f90a..f27d9be61 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java @@ -56,7 +56,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.MinLen; */ +/*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -193,7 +193,7 @@ public Range findRangeBounds(XYDataset dataset) { * @return 1. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 1; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java index 947fd0916..497e6b3ed 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java @@ -167,7 +167,7 @@ public void setRenderAsPercentages(boolean asPercentages) { * @return {@code 2}. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 3; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index b878a7e9d..855392cab 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -110,6 +110,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -739,7 +740,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { boolean itemVisible = getItemVisible(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index 83a4e6065..4703c3d68 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -105,6 +105,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -717,6 +718,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, XYPlot plot, XYDataset dataset, PlotRenderingInfo info) { XYBarRendererState state = new XYBarRendererState(info); + @SuppressWarnings("index") // dataset is assumed to be associated with plot, but isn't checked. A bug? ValueAxis rangeAxis = plot.getRangeAxisForDataset(plot.indexOf( dataset)); state.setG2Base(rangeAxis.valueToJava2D(this.base, dataArea, @@ -807,21 +809,24 @@ public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegativ public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalItem = item; + double value0; double value1; if (this.useYInterval) { - value0 = intervalDataset.getStartYValue(series, item); - value1 = intervalDataset.getEndYValue(series, item); + value0 = intervalDataset.getStartYValue(series, intervalItem); + value1 = intervalDataset.getEndYValue(series, intervalItem); } else { value0 = this.base; - value1 = intervalDataset.getYValue(series, item); + value1 = intervalDataset.getYValue(series, intervalItem); } if (Double.isNaN(value0) || Double.isNaN(value1)) { return; @@ -843,11 +848,11 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double bottom = Math.min(translatedValue0, translatedValue1); double top = Math.max(translatedValue0, translatedValue1); - double startX = intervalDataset.getStartXValue(series, item); + double startX = intervalDataset.getStartXValue(series, intervalItem); if (Double.isNaN(startX)) { return; } - double endX = intervalDataset.getEndXValue(series, item); + double endX = intervalDataset.getEndXValue(series, intervalItem); if (Double.isNaN(endX)) { return; } @@ -863,7 +868,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, // is there an alignment adjustment to be made? if (this.barAlignmentFactor >= 0.0 && this.barAlignmentFactor <= 1.0) { - double x = intervalDataset.getXValue(series, item); + double x = intervalDataset.getXValue(series, intervalItem); double interval = endX - startX; startX = x - interval * this.barAlignmentFactor; endX = startX + interval; @@ -943,7 +948,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double transX1 = domainAxis.valueToJava2D(x1, dataArea, location); double transY1 = rangeAxis.valueToJava2D(y1, dataArea, plot.getRangeAxisEdge()); - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // plot and dataset must be associated with each other. This is assumed but not checked. A bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, plot.getOrientation()); @@ -971,7 +977,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * @param negative a flag indicating a negative value. */ protected void drawItemLabel(Graphics2D g2, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, XYPlot plot, XYItemLabelGenerator generator, + /*@NonNegative*/ int series, /*@IndexFor("#2.getSeries(#3)")*/ int item, XYPlot plot, XYItemLabelGenerator generator, Rectangle2D bar, boolean negative) { if (generator == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index 25145f70b..4f3f88995 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -347,7 +347,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return The number of passes required by the renderer. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 2; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java index f8828175a..6a6ae08b3 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java @@ -85,6 +85,7 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -145,7 +146,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return The pass count. */ - public int getPassCount(); + public /*@NonNegative*/ int getPassCount(); /** * Returns the lower and upper bounds (range) of the x-values in the @@ -1297,7 +1298,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass); + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass); /** * Fills a band between two values on the axis. This can be used to color diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index 2b29f312c..c75c451ec 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -243,7 +243,7 @@ public void setDrawSeriesLineAsPath(boolean flag) { * @return The pass count. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 2; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 10ab3f4a0..1264efef5 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -407,7 +407,7 @@ public Range findZBounds(XYZDataset dataset) { * @return {@code 2}. */ @Override - public int getPassCount() { + public /*@NonNegative*/ int getPassCount() { return 2; } From 61c1649a9240cba86c1cb403d654e86ea08fb2f0 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Fri, 29 Dec 2017 17:34:01 -0800 Subject: [PATCH 22/79] work from plane --- .../renderer/xy/ClusteredXYBarRenderer.java | 2 +- .../renderer/xy/CyclicXYItemRenderer.java | 24 +++++++-- .../chart/renderer/xy/DeviationRenderer.java | 21 +++++--- .../renderer/xy/GradientXYBarPainter.java | 10 ++-- .../chart/renderer/xy/HighLowRenderer.java | 15 ++++-- .../renderer/xy/SamplingXYLineRenderer.java | 6 ++- .../renderer/xy/StackedXYAreaRenderer.java | 11 ++-- .../renderer/xy/StackedXYAreaRenderer2.java | 17 +++++-- .../renderer/xy/StackedXYBarRenderer.java | 4 +- .../renderer/xy/StandardXYBarPainter.java | 6 +-- .../renderer/xy/StandardXYItemRenderer.java | 10 ++-- .../chart/renderer/xy/VectorRenderer.java | 8 +-- .../chart/renderer/xy/WindItemRenderer.java | 4 +- .../chart/renderer/xy/XYAreaRenderer.java | 10 ++-- .../chart/renderer/xy/XYAreaRenderer2.java | 11 ++-- .../chart/renderer/xy/XYBlockRenderer.java | 7 ++- .../renderer/xy/XYBoxAndWhiskerRenderer.java | 50 +++++++++++-------- .../chart/renderer/xy/XYBubbleRenderer.java | 12 +++-- .../renderer/xy/XYDifferenceRenderer.java | 3 +- .../chart/renderer/xy/XYDotRenderer.java | 4 +- .../chart/renderer/xy/XYErrorRenderer.java | 20 +++++--- .../renderer/xy/XYItemRendererState.java | 10 ++-- .../renderer/xy/XYLineAndShapeRenderer.java | 12 +++-- .../chart/renderer/xy/XYShapeRenderer.java | 4 +- .../chart/renderer/xy/XYSplineRenderer.java | 3 +- .../chart/renderer/xy/XYStepAreaRenderer.java | 7 ++- .../chart/renderer/xy/XYStepRenderer.java | 7 ++- .../chart/renderer/xy/YIntervalRenderer.java | 14 ++++-- .../org/jfree/chart/text/G2TextMeasurer.java | 4 +- .../java/org/jfree/chart/text/TextUtils.java | 14 ++++-- .../java/org/jfree/chart/ui/LCBLayout.java | 10 ++-- .../chart/urls/CategoryURLGenerator.java | 2 +- .../chart/urls/CustomPieURLGenerator.java | 6 +-- .../org/jfree/chart/util/AttrStringUtils.java | 6 ++- .../chart/util/DefaultShadowGenerator.java | 4 +- .../java/org/jfree/chart/util/PaintAlpha.java | 8 ++- 36 files changed, 242 insertions(+), 124 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java index 236e4eaf1..0a2843f57 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java @@ -65,7 +65,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 94fa97a43..6e6240343 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -250,12 +250,13 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > } // If the line is not wrapping, then parent is OK - if (x.length == 2) { + if (x.length == 2 && y.length == 2) { super.drawItem(g2, state, dataArea, info, plot, domainAxis, rangeAxis, dataset, series, item, crosshairState, pass); return; } + @SuppressWarnings("index") // x and y always have the same length here OverwriteDataSet newset = new OverwriteDataSet(x, y, dataset); if (cnax != null) { @@ -274,9 +275,12 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > cnay.setBoundMappedToLastCycle(y[0] <= ycycleBound); } } + + @SuppressWarnings("index") // newset is created from x and y, which are both arrays with at least two elements. So one is always a valid index to either + /*@LTLengthOf("newset.getSeries(series)")*/ int one = 1; super.drawItem( g2, state, dataArea, info, plot, domainAxis, rangeAxis, - newset, series, 1, crosshairState, pass + newset, series, one, crosshairState, pass ); if (cnax != null) { @@ -295,8 +299,12 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > cnay.setBoundMappedToLastCycle(y[1] <= ycycleBound); } } + + @SuppressWarnings("index") // newset is created from x and y, which are both arrays with at least two elements. But, if x and y were of length two we already returned. So, two is a valid index into newset. + /*@LTLengthOf("newset.getSeries(series)")*/ int two = 2; + super.drawItem(g2, state, dataArea, info, plot, domainAxis, rangeAxis, - newset, series, 2, crosshairState, pass); + newset, series, two, crosshairState, pass); if (x.length == 4 && y.length == 4) { if (cnax != null) { @@ -315,8 +323,12 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > cnay.setBoundMappedToLastCycle(y[2] <= ycycleBound); } } + + @SuppressWarnings("index") // newset is created from x and y, which are both arrays with exactly four elements. + /*@LTLengthOf("newset.getSeries(series)")*/ int three = 3; + super.drawItem(g2, state, dataArea, info, plot, domainAxis, - rangeAxis, newset, series, 3, crosshairState, pass); + rangeAxis, newset, series, three, crosshairState, pass); } if (cnax != null) { @@ -387,6 +399,7 @@ public DomainOrder getDomainOrder() { * @return The x-value. */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.x[item]; } @@ -419,6 +432,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The y-value. */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.y[item]; } @@ -521,7 +535,7 @@ public void setGroup(DatasetGroup group) { * A ghost method. Do not call. */ @Override - public Series getSeries(int series) { + public Series getSeries(/*@NonNegative*/ int series) { return null; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java index 053e6cb1c..1497807bc 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java @@ -44,6 +44,10 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; @@ -89,13 +93,13 @@ public static class State extends XYLineAndShapeRenderer.State { * A list of coordinates for the upper y-values in the current series * (after translation into Java2D space). */ - public List upperCoordinates; + public List upperCoordinates; /** * A list of coordinates for the lower y-values in the current series * (after translation into Java2D space). */ - public List lowerCoordinates; + public List lowerCoordinates; /** * Creates a new state instance. @@ -270,7 +274,7 @@ protected boolean isLinePass(int pass) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -315,17 +319,18 @@ else if (orientation == PlotOrientation.VERTICAL) { GeneralPath area = new GeneralPath(GeneralPath.WIND_NON_ZERO, drState.lowerCoordinates.size() + drState.upperCoordinates.size()); - double[] coords = (double[]) drState.lowerCoordinates.get(0); + double[] coords = drState.lowerCoordinates.get(0); area.moveTo((float) coords[0], (float) coords[1]); for (int i = 1; i < drState.lowerCoordinates.size(); i++) { - coords = (double[]) drState.lowerCoordinates.get(i); + coords = drState.lowerCoordinates.get(i); area.lineTo((float) coords[0], (float) coords[1]); } - int count = drState.upperCoordinates.size(); - coords = (double[]) drState.upperCoordinates.get(count - 1); + @SuppressWarnings("index") // upperCoordinates always has at least one entry, because first pass always adds one entry + /*@Positive*/ int count = drState.upperCoordinates.size(); + coords = drState.upperCoordinates.get(count - 1); area.lineTo((float) coords[0], (float) coords[1]); for (int i = count - 2; i >= 0; i--) { - coords = (double[]) drState.upperCoordinates.get(i); + coords = drState.upperCoordinates.get(i); area.lineTo((float) coords[0], (float) coords[1]); } area.closePath(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java index 196402a41..3731498db 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java @@ -40,7 +40,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -104,7 +106,7 @@ public GradientXYBarPainter(double g1, double g2, double g3) { */ @Override public void paintBar(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, - int column, RectangularShape bar, RectangleEdge base) { + /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); @@ -205,7 +207,7 @@ else if (base == RectangleEdge.LEFT || base == RectangleEdge.RIGHT) { */ @Override public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, - int column, RectangularShape bar, RectangleEdge base, + /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { // handle a special case - if the bar colour has alpha == 0, it is @@ -288,7 +290,7 @@ else if (base == RectangleEdge.RIGHT) { * * @return An array containing four subregions. */ - private Rectangle2D[] splitVerticalBar(RectangularShape bar, double a, + private Rectangle2D /*@ArrayLen(4)*/ [] splitVerticalBar(RectangularShape bar, double a, double b, double c) { Rectangle2D[] result = new Rectangle2D[4]; double x0 = bar.getMinX(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java index cac876cd4..964749e63 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java @@ -67,6 +67,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -321,7 +323,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); if (!domainAxis.getRange().contains(x)) { @@ -348,8 +350,11 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (dataset instanceof OHLCDataset) { OHLCDataset hld = (OHLCDataset) dataset; - double yHigh = hld.getHighValue(series, item); - double yLow = hld.getLowValue(series, item); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 + /*@IndexFor("hld.getSeries(series)")*/ int hldItem = item; + + double yHigh = hld.getHighValue(series, hldItem); + double yLow = hld.getLowValue(series, hldItem); if (!Double.isNaN(yHigh) && !Double.isNaN(yLow)) { double yyHigh = rangeAxis.valueToJava2D(yHigh, dataArea, location); @@ -373,7 +378,7 @@ else if (orientation == PlotOrientation.VERTICAL) { delta = -delta; } if (getDrawOpenTicks()) { - double yOpen = hld.getOpenValue(series, item); + double yOpen = hld.getOpenValue(series, hldItem); if (!Double.isNaN(yOpen)) { double yyOpen = rangeAxis.valueToJava2D(yOpen, dataArea, location); @@ -395,7 +400,7 @@ else if (orientation == PlotOrientation.VERTICAL) { } if (getDrawCloseTicks()) { - double yClose = hld.getCloseValue(series, item); + double yClose = hld.getCloseValue(series, hldItem); if (!Double.isNaN(yClose)) { double yyClose = rangeAxis.valueToJava2D( yClose, dataArea, location); diff --git a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java index 06969aec1..5b752e93b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java @@ -44,6 +44,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -173,7 +175,7 @@ public State(PlotRenderingInfo info) { */ @Override public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, - int firstItem, int lastItem, int pass, int passCount) { + /*@IndexFor("#1.getSeries(#2)")*/ int firstItem, /*@IndexFor("#1.getSeries(#2)")*/ int lastItem, int pass, int passCount) { this.seriesPath.reset(); this.intervalPath.reset(); this.lastPointGood = false; @@ -238,7 +240,7 @@ public XYItemRendererState initialise(Graphics2D g2, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java index 992adcdab..d1544614f 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java @@ -70,6 +70,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -397,7 +399,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); StackedXYAreaRendererState areaState @@ -535,7 +537,8 @@ else if (orientation == PlotOrientation.HORIZONTAL) { } } - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, ph1 + y1, datasetIndex, transX1, transY1, orientation); @@ -628,7 +631,9 @@ protected double getPreviousHeight(TableXYDataset dataset, int series, /*@NonNegative*/ int index) { double result = 0.0; for (int i = 0; i < series; i++) { - double value = dataset.getYValue(i, index); + @SuppressWarnings("index") // precondition of this function is that index is an index into every series up to series + /*@IndexFor("dataset.getSeries(i)")*/ int iIndex = index; + double value = dataset.getYValue(i, iIndex); if (!Double.isNaN(value)) { result += value; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java index f27d9be61..1fae50efb 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java @@ -56,6 +56,10 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -218,7 +222,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; @@ -247,7 +251,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double[] stack0 = getStackValues(tdataset, series, Math.max(item - 1, 0)); - int itemCount = dataset.getItemCount(series); + @SuppressWarnings("index") // itemCount must be positive if we have an index, which we do (item) + /*@Positive*/ int itemCount = dataset.getItemCount(series); double x2 = dataset.getXValue(series, Math.min(item + 1, itemCount - 1)); double y2 = dataset.getYValue(series, Math.min(item + 1, @@ -465,7 +470,9 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, /*@NonNegative*/ int series, /*@NonNegative*/ int index) { double[] result = new double[2]; for (int i = 0; i < series; i++) { - double v = dataset.getYValue(i, index); + @SuppressWarnings("index") // index must be an index into all series < series is a precondition of this function + /*@IndexFor("dataset.getSeries(i)")*/ int iIndex = index; + double v = dataset.getYValue(i, iIndex); if (!Double.isNaN(v)) { if (v >= 0.0) { result[1] += v; @@ -487,7 +494,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * * @return A pair of average stack values. */ - private double[] averageStackValues(double[] stack1, double[] stack2) { + private double /*@ArrayLen(2)*/ [] averageStackValues(double /*@MinLen(2)*/ [] stack1, double /*@MinLen(2)*/ [] stack2) { double[] result = new double[2]; result[0] = (stack1[0] + stack2[0]) / 2.0; result[1] = (stack1[1] + stack2[1]) / 2.0; @@ -504,7 +511,7 @@ private double[] averageStackValues(double[] stack1, double[] stack2) { * * @return A pair of average stack values. */ - private double[] adjustedStackValues(double[] stack1, double[] stack2) { + private double /*@ArrayLen(2)*/ [] adjustedStackValues(double /*@MinLen(2)*/ [] stack1, double /*@MinLen(2)*/ [] stack2) { double[] result = new double[2]; if (stack1[0] == 0.0 || stack2[0] == 0.0) { result[0] = 0.0; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java index 497e6b3ed..fef7cae09 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java @@ -54,6 +54,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -238,7 +240,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java index 7149df8a0..8cac43bc9 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; import java.awt.GradientPaint; @@ -82,7 +82,7 @@ public StandardXYBarPainter() { */ @Override public void paintBar(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, - int column, RectangularShape bar, RectangleEdge base) { + /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); GradientPaintTransformer t = renderer.getGradientPaintTransformer(); @@ -120,7 +120,7 @@ public void paintBar(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int */ @Override public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, - int column, RectangularShape bar, RectangleEdge base, + /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { // handle a special case - if the bar colour has alpha == 0, it is diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index 855392cab..40456b709 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -110,7 +110,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -635,7 +635,7 @@ public static class State extends XYItemRendererState { public GeneralPath seriesPath; /** The series index. */ - private int seriesIndex; + private /*@NonNegative*/ int seriesIndex; /** * A flag that indicates if the last (x, y) point was 'good' @@ -819,7 +819,8 @@ else if (item != 0 && itemVisible) { if (getPlotDiscontinuous()) { // only draw a line if the gap between the current and // previous data point is within the threshold - int numX = dataset.getItemCount(series); + @SuppressWarnings("index") // item is an index, but it's not equal to zero. This implies that there must be at least two items. + /*@Positive*/ int numX = dataset.getItemCount(series); double minX = dataset.getXValue(series, 0); double maxX = dataset.getXValue(series, numX - 1); if (this.gapThresholdType == UnitType.ABSOLUTE) { @@ -916,7 +917,8 @@ else if (orientation == PlotOrientation.VERTICAL) { (y1 < 0.0)); } - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java index d887e06df..424adf5ab 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java @@ -46,6 +46,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -113,7 +115,7 @@ public Range findDomainBounds(XYDataset dataset) { if (dataset instanceof VectorXYDataset) { VectorXYDataset vdataset = (VectorXYDataset) dataset; for (int series = 0; series < seriesCount; series++) { - int itemCount = dataset.getItemCount(series); + int itemCount = vdataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { double delta = vdataset.getVectorXValue(series, item); if (delta < 0.0) { @@ -168,7 +170,7 @@ public Range findRangeBounds(XYDataset dataset) { if (dataset instanceof VectorXYDataset) { VectorXYDataset vdataset = (VectorXYDataset) dataset; for (int series = 0; series < seriesCount; series++) { - int itemCount = dataset.getItemCount(series); + int itemCount = vdataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { double delta = vdataset.getVectorYValue(series, item); if (delta < 0.0) { @@ -223,7 +225,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java index 15b533936..d01d74fd0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java @@ -56,6 +56,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; @@ -119,7 +121,7 @@ public WindItemRenderer() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D plotArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { WindDataset windData = (WindDataset) dataset; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index 5616078b0..d42d91b66 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -87,6 +87,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -497,7 +499,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegativ public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; @@ -517,7 +519,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, // get the previous point and the next point so we can calculate a // "hot spot" for the area (used by the chart entity)... - int itemCount = dataset.getItemCount(series); + @SuppressWarnings("index") // itemCount needs to be at least 1 if we have an index (which we do - item). + /*@Positive*/ int itemCount = dataset.getItemCount(series); double x0 = dataset.getXValue(series, Math.max(item - 1, 0)); double y0 = dataset.getYValue(series, Math.max(item - 1, 0)); if (Double.isNaN(y0)) { @@ -649,7 +652,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } } - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java index a8dc33f8f..a78346118 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java @@ -85,6 +85,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -291,7 +293,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegativ public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; @@ -320,7 +322,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double transY0 = rangeAxis.valueToJava2D(y0, dataArea, plot.getRangeAxisEdge()); - int itemCount = dataset.getItemCount(series); + @SuppressWarnings("index") // itemCount must be positive, since we have an index (item) + /*@Positive*/ int itemCount = dataset.getItemCount(series); double x2 = dataset.getXValue(series, Math.min(item + 1, itemCount - 1)); double y2 = dataset.getYValue(series, Math.min(item + 1, @@ -372,7 +375,9 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, g2.setPaint(lookupSeriesOutlinePaint(series)); g2.draw(hotspot); } - int datasetIndex = plot.indexOf(dataset); + + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 8569f051c..3de5f5d59 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -46,6 +46,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; @@ -350,7 +352,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); @@ -390,7 +392,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, block.getCenterX(), block.getCenterY(), y < 0.0); } - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); double transX = domainAxis.valueToJava2D(x, dataArea, plot.getDomainAxisEdge()); double transY = rangeAxis.valueToJava2D(y, dataArea, diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index 7e50e3b91..a97f7e061 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -77,6 +77,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -378,7 +380,7 @@ else if (orientation == PlotOrientation.VERTICAL) { public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, /*@NonNegative*/ int series, - int item, CrosshairState crosshairState, int pass) { + /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; @@ -389,13 +391,16 @@ public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset; - Number x = boxAndWhiskerData.getX(series, item); - Number yMax = boxAndWhiskerData.getMaxRegularValue(series, item); - Number yMin = boxAndWhiskerData.getMinRegularValue(series, item); - Number yMedian = boxAndWhiskerData.getMedianValue(series, item); - Number yAverage = boxAndWhiskerData.getMeanValue(series, item); - Number yQ1Median = boxAndWhiskerData.getQ1Value(series, item); - Number yQ3Median = boxAndWhiskerData.getQ3Value(series, item); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + /*@IndexFor("boxAndWhiskerData.getSeries(series)")*/ int boxAndWhiskerItem = item; + + Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); + Number yMax = boxAndWhiskerData.getMaxRegularValue(series, boxAndWhiskerItem); + Number yMin = boxAndWhiskerData.getMinRegularValue(series, boxAndWhiskerItem); + Number yMedian = boxAndWhiskerData.getMedianValue(series, boxAndWhiskerItem); + Number yAverage = boxAndWhiskerData.getMeanValue(series, boxAndWhiskerItem); + Number yQ1Median = boxAndWhiskerData.getQ1Value(series, boxAndWhiskerItem); + Number yQ3Median = boxAndWhiskerData.getQ3Value(series, boxAndWhiskerItem); double xx = domainAxis.valueToJava2D(x.doubleValue(), dataArea, plot.getDomainAxisEdge()); @@ -518,7 +523,7 @@ else if (exactBoxWidth > maxBoxWidth) { public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, /*@NonNegative*/ int series, - int item, CrosshairState crosshairState, int pass) { + /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; @@ -529,14 +534,17 @@ public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset; - Number x = boxAndWhiskerData.getX(series, item); - Number yMax = boxAndWhiskerData.getMaxRegularValue(series, item); - Number yMin = boxAndWhiskerData.getMinRegularValue(series, item); - Number yMedian = boxAndWhiskerData.getMedianValue(series, item); - Number yAverage = boxAndWhiskerData.getMeanValue(series, item); - Number yQ1Median = boxAndWhiskerData.getQ1Value(series, item); - Number yQ3Median = boxAndWhiskerData.getQ3Value(series, item); - List yOutliers = boxAndWhiskerData.getOutliers(series, item); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + /*@IndexFor("boxAndWhiskerData.getSeries(series)")*/ int boxAndWhiskerItem = item; + + Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); + Number yMax = boxAndWhiskerData.getMaxRegularValue(series, boxAndWhiskerItem); + Number yMin = boxAndWhiskerData.getMinRegularValue(series, boxAndWhiskerItem); + Number yMedian = boxAndWhiskerData.getMedianValue(series, boxAndWhiskerItem); + Number yAverage = boxAndWhiskerData.getMeanValue(series, boxAndWhiskerItem); + Number yQ1Median = boxAndWhiskerData.getQ1Value(series, boxAndWhiskerItem); + Number yQ3Median = boxAndWhiskerData.getQ3Value(series, boxAndWhiskerItem); + List yOutliers = boxAndWhiskerData.getOutliers(series, boxAndWhiskerItem); // yOutliers can be null, but we'd prefer it to be an empty list in // that case... if (yOutliers == null) { @@ -648,21 +656,21 @@ else if (exactBoxWidth > maxBoxWidth) { for (int i = 0; i < yOutliers.size(); i++) { double outlier = ((Number) yOutliers.get(i)).doubleValue(); if (outlier > boxAndWhiskerData.getMaxOutlier(series, - item).doubleValue()) { + boxAndWhiskerItem).doubleValue()) { outlierListCollection.setHighFarOut(true); } else if (outlier < boxAndWhiskerData.getMinOutlier(series, - item).doubleValue()) { + boxAndWhiskerItem).doubleValue()) { outlierListCollection.setLowFarOut(true); } else if (outlier > boxAndWhiskerData.getMaxRegularValue(series, - item).doubleValue()) { + boxAndWhiskerItem).doubleValue()) { yyOutlier = rangeAxis.valueToJava2D(outlier, dataArea, location); outliers.add(new Outlier(xx, yyOutlier, oRadius)); } else if (outlier < boxAndWhiskerData.getMinRegularValue(series, - item).doubleValue()) { + boxAndWhiskerItem).doubleValue()) { yyOutlier = rangeAxis.valueToJava2D(outlier, dataArea, location); outliers.add(new Outlier(xx, yyOutlier, oRadius)); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index ad1091f07..74338b9f6 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -63,6 +63,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -179,7 +181,7 @@ public int getScaleType() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // return straight away if the item is not visible if (!getItemVisible(series, item)) { @@ -194,7 +196,10 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double z = Double.NaN; if (dataset instanceof XYZDataset) { XYZDataset xyzData = (XYZDataset) dataset; - z = xyzData.getZValue(series, item); + + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + /*@IndexFor("xyzData.getSeries(series)")*/ int xyzItem = item; + z = xyzData.getZValue(series, xyzItem); } if (!Double.isNaN(z)) { RectangleEdge domainAxisLocation = plot.getDomainAxisEdge(); @@ -273,7 +278,8 @@ else if (orientation == PlotOrientation.HORIZONTAL) { } } - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index 4f3f88995..d39c90791 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -84,7 +84,8 @@ package org.jfree.chart.renderer.xy; /*>>> -import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; */ import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java index 604574461..57c8d81ab 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java @@ -54,6 +54,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -232,7 +234,7 @@ public void setLegendShape(Shape shape) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java index 52bbb8235..0db25aff9 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java @@ -42,6 +42,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -305,17 +307,21 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { if (pass == 0 && dataset instanceof IntervalXYDataset && getItemVisible(series, item)) { IntervalXYDataset ixyd = (IntervalXYDataset) dataset; + + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + /*@IndexFor("ixyd.getSeries(series)")*/ int ixydItem = item; + PlotOrientation orientation = plot.getOrientation(); if (this.drawXError) { // draw the error bar for the x-interval - double x0 = ixyd.getStartXValue(series, item); - double x1 = ixyd.getEndXValue(series, item); - double y = ixyd.getYValue(series, item); + double x0 = ixyd.getStartXValue(series, ixydItem); + double x1 = ixyd.getEndXValue(series, ixydItem); + double y = ixyd.getYValue(series, ixydItem); RectangleEdge edge = plot.getDomainAxisEdge(); double xx0 = domainAxis.valueToJava2D(x0, dataArea, edge); double xx1 = domainAxis.valueToJava2D(x1, dataArea, edge); @@ -353,9 +359,9 @@ && getItemVisible(series, item)) { } if (this.drawYError) { // draw the error bar for the y-interval - double y0 = ixyd.getStartYValue(series, item); - double y1 = ixyd.getEndYValue(series, item); - double x = ixyd.getXValue(series, item); + double y0 = ixyd.getStartYValue(series, ixydItem); + double y1 = ixyd.getEndYValue(series, ixydItem); + double x = ixyd.getXValue(series, ixydItem); RectangleEdge edge = plot.getRangeAxisEdge(); double yy0 = rangeAxis.valueToJava2D(y0, dataArea, edge); double yy1 = rangeAxis.valueToJava2D(y1, dataArea, edge); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java index 891fee1dc..a60e11347 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java @@ -47,6 +47,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -69,14 +71,14 @@ public class XYItemRendererState extends RendererState { * * @since 1.0.11 */ - private int firstItemIndex; + private /*@NonNegative*/ int firstItemIndex; /** * The last item in the current series that will be displayed. * * @since 1.0.11 */ - private int lastItemIndex; + private /*@NonNegative*/ int lastItemIndex; /** * A line object that the renderer can reuse to save instantiating a lot @@ -171,8 +173,8 @@ public int getLastItemIndex() { * * @since 1.0.11 */ - public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, int firstItem, - int lastItem, int pass, int passCount) { + public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int firstItem, + /*@IndexFor("#1.getSeries(#2)")*/ int lastItem, int pass, int passCount) { this.firstItemIndex = firstItem; this.lastItemIndex = lastItem; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index c75c451ec..63bb17ff5 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -72,6 +72,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -815,8 +817,8 @@ protected void drawPrimaryLine(XYItemRendererState state, XYPlot plot, XYDataset dataset, int pass, - int series, - int item, + /*@NonNegative*/ int series, + /*@IndexFor("#4.getSeries(#6)")*/ int item, ValueAxis domainAxis, ValueAxis rangeAxis, Rectangle2D dataArea) { @@ -876,7 +878,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @param shape the shape. */ protected void drawFirstPassShape(Graphics2D g2, int pass, /*@NonNegative*/ int series, - int item, Shape shape) { + /*@NonNegative*/ int item, Shape shape) { g2.setStroke(getItemStroke(series, item)); g2.setPaint(getItemPaint(series, item)); g2.draw(shape); @@ -903,7 +905,7 @@ protected void drawFirstPassShape(Graphics2D g2, int pass, /*@NonNegative*/ int */ protected void drawPrimaryLineAsPath(XYItemRendererState state, Graphics2D g2, XYPlot plot, XYDataset dataset, int pass, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, ValueAxis domainAxis, ValueAxis rangeAxis, + /*@NonNegative*/ int series, /*@IndexFor("#4.getSeries(#6)")*/ int item, ValueAxis domainAxis, ValueAxis rangeAxis, Rectangle2D dataArea) { RectangleEdge xAxisLocation = plot.getDomainAxisEdge(); @@ -962,7 +964,7 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, * @param entities the entity collection. */ protected void drawSecondaryPass(Graphics2D g2, XYPlot plot, - XYDataset dataset, int pass, /*@NonNegative*/ int series, /*@NonNegative*/ int item, + XYDataset dataset, int pass, /*@NonNegative*/ int series, /*@IndexFor("#3.getSeries(#5)")*/ int item, ValueAxis domainAxis, Rectangle2D dataArea, ValueAxis rangeAxis, CrosshairState crosshairState, EntityCollection entities) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 1264efef5..1d0eba0e8 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -46,6 +46,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -431,7 +433,7 @@ public Range findZBounds(XYZDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { Shape hotspot; EntityCollection entities = null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java index 0e1668bda..3a2d2ad9f 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java @@ -48,7 +48,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.awt.GradientPaint; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java index f6bfea381..9b378802a 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java @@ -57,6 +57,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -395,7 +397,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); @@ -558,7 +560,8 @@ else if (orientation == PlotOrientation.HORIZONTAL) { // do we need to update the crosshair values? if (!Double.isNaN(y1)) { - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java index 14244ead0..82e4d8d09 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java @@ -72,6 +72,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -201,7 +203,7 @@ public void setStepPoint(double stepPoint) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -274,7 +276,8 @@ else if (orientation == PlotOrientation.VERTICAL) { } // submit this data item as a candidate for the crosshair point - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index 47085709e..45bcd9d8b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -49,6 +49,8 @@ */ package org.jfree.chart.renderer.xy; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -181,7 +183,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -195,10 +197,12 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalItem = item; - double x = intervalDataset.getXValue(series, item); - double yLow = intervalDataset.getStartYValue(series, item); - double yHigh = intervalDataset.getEndYValue(series, item); + double x = intervalDataset.getXValue(series, intervalItem); + double yLow = intervalDataset.getStartYValue(series, intervalItem); + double yHigh = intervalDataset.getEndYValue(series, intervalItem); RectangleEdge xAxisLocation = plot.getDomainAxisEdge(); RectangleEdge yAxisLocation = plot.getRangeAxisEdge(); @@ -266,7 +270,7 @@ else if (orientation == PlotOrientation.VERTICAL) { */ private void drawAdditionalItemLabel(Graphics2D g2, PlotOrientation orientation, XYDataset dataset, /*@NonNegative*/ int series, - int item, double x, double y) { + /*@IndexFor("#3.getSeries(#4)")*/ int item, double x, double y) { if (this.additionalItemLabelGenerator == null) { return; diff --git a/src/main/java/org/jfree/chart/text/G2TextMeasurer.java b/src/main/java/org/jfree/chart/text/G2TextMeasurer.java index 7e4c78a52..7c0b0c435 100644 --- a/src/main/java/org/jfree/chart/text/G2TextMeasurer.java +++ b/src/main/java/org/jfree/chart/text/G2TextMeasurer.java @@ -27,6 +27,8 @@ */ package org.jfree.chart.text; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.FontMetrics; import java.awt.Graphics2D; @@ -59,7 +61,7 @@ public G2TextMeasurer(Graphics2D g2) { * @return The string width. */ @Override - public float getStringWidth(String text, int start, int end) { + public float getStringWidth(String text, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int end) { FontMetrics fm = this.g2.getFontMetrics(); Rectangle2D bounds = TextUtils.getTextBounds(text.substring(start, end), this.g2, fm); diff --git a/src/main/java/org/jfree/chart/text/TextUtils.java b/src/main/java/org/jfree/chart/text/TextUtils.java index eaaf0e905..9f54e2e88 100644 --- a/src/main/java/org/jfree/chart/text/TextUtils.java +++ b/src/main/java/org/jfree/chart/text/TextUtils.java @@ -27,6 +27,10 @@ */ package org.jfree.chart.text; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Font; import java.awt.FontMetrics; @@ -161,7 +165,7 @@ public static TextBlock createTextBlock(String text, Font font, TextBlock result = new TextBlock(); BreakIterator iterator = BreakIterator.getLineInstance(); iterator.setText(text); - int current = 0; + /*@NonNegative*/ int current = 0; int lines = 0; int length = text.length(); while (current < length && lines < maxLines) { @@ -210,7 +214,7 @@ public static TextBlock createTextBlock(String text, Font font, * * @return The index of the next line break. */ - private static int nextLineBreak(String text, int start, float width, + private static /*@NonNegative*/ int nextLineBreak(String text, /*@IndexOrHigh("#1")*/ int start, float width, BreakIterator iterator, TextMeasurer measurer) { // this method is (loosely) based on code in JFreeReport's @@ -359,7 +363,7 @@ public static Rectangle2D drawAlignedString(String text, Graphics2D g2, * * @return The offsets. */ - private static float[] deriveTextBoundsAnchorOffsets(Graphics2D g2, + private static float /*@ArrayLen(3)*/ [] deriveTextBoundsAnchorOffsets(Graphics2D g2, String text, TextAnchor anchor, Rectangle2D textBounds) { float[] result = new float[3]; @@ -580,7 +584,7 @@ public static Shape calculateRotatedStringBounds(String text, Graphics2D g2, * * @return The offsets. */ - private static float[] deriveTextBoundsAnchorOffsets(Graphics2D g2, + private static float /*@ArrayLen(2)*/ [] deriveTextBoundsAnchorOffsets(Graphics2D g2, String text, TextAnchor anchor) { float[] result = new float[2]; @@ -635,7 +639,7 @@ else if (anchor.isBottom()) { * * @return The offsets. */ - private static float[] deriveRotationAnchorOffsets(Graphics2D g2, + private static float /*@ArrayLen(2)*/ [] deriveRotationAnchorOffsets(Graphics2D g2, String text, TextAnchor anchor) { float[] result = new float[2]; diff --git a/src/main/java/org/jfree/chart/ui/LCBLayout.java b/src/main/java/org/jfree/chart/ui/LCBLayout.java index 9871beb3d..b36f549bf 100644 --- a/src/main/java/org/jfree/chart/ui/LCBLayout.java +++ b/src/main/java/org/jfree/chart/ui/LCBLayout.java @@ -27,6 +27,10 @@ */ package org.jfree.chart.ui; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Component; import java.awt.Container; @@ -44,10 +48,10 @@ public class LCBLayout implements LayoutManager, Serializable { private static final long serialVersionUID = -2531780832406163833L; /** A constant for the number of columns in the layout. */ - private static final int COLUMNS = 3; + private static final /*@IntVal(3)*/ int COLUMNS = 3; /** Tracks the column widths. */ - private int[] colWidth; + private int /*@ArrayLen(3)*/ [] colWidth; /** Tracks the row heights. */ private int[] rowHeight; @@ -66,7 +70,7 @@ public class LCBLayout implements LayoutManager, Serializable { * * @param maxrows the maximum number of rows. */ - public LCBLayout(int maxrows) { + public LCBLayout(/*@NonNegative*/ int maxrows) { this.labelGap = 10; this.buttonGap = 6; this.vGap = 2; diff --git a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java index 799d279f2..ac8eae126 100644 --- a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java @@ -77,6 +77,6 @@ public interface CategoryURLGenerator { * @return A string containing the URL. */ public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, - int category); + /*@NonNegative*/ int category); } diff --git a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java index c5f0d0b20..00d8219d1 100644 --- a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java @@ -41,8 +41,8 @@ */ package org.jfree.chart.urls; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -135,7 +135,7 @@ public int getURLCount(/*@NonNegative*/ int list) { * * @return The URL. */ - public String getURL(Comparable key, int mapIndex) { + public String getURL(Comparable key, /*@NonNegative*/ int mapIndex) { String result = null; if (mapIndex < getListCount()) { Map urlMap = (Map) this.urls.get(mapIndex); diff --git a/src/main/java/org/jfree/chart/util/AttrStringUtils.java b/src/main/java/org/jfree/chart/util/AttrStringUtils.java index 699db6c70..e5607d73c 100644 --- a/src/main/java/org/jfree/chart/util/AttrStringUtils.java +++ b/src/main/java/org/jfree/chart/util/AttrStringUtils.java @@ -40,6 +40,8 @@ */ package org.jfree.chart.util; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.font.TextLayout; @@ -174,7 +176,7 @@ public static void drawRotatedString(AttributedString text, Graphics2D g2, y + textAdj[1] + rotateAdj[1]); } - private static float[] deriveTextBoundsAnchorOffsets(Graphics2D g2, + private static float /*@ArrayLen(3)*/ [] deriveTextBoundsAnchorOffsets(Graphics2D g2, AttributedString text, TextAnchor anchor, Rectangle2D textBounds) { TextLayout layout = new TextLayout(text.getIterator(), g2.getFontRenderContext()); @@ -231,7 +233,7 @@ else if (isBottom(anchor)) { * * @return The offsets. */ - private static float[] deriveRotationAnchorOffsets(Graphics2D g2, + private static float /*@ArrayLen(2)*/ [] deriveRotationAnchorOffsets(Graphics2D g2, AttributedString text, TextAnchor anchor) { float[] result = new float[2]; diff --git a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java index 23a4495a7..20fce6b2e 100644 --- a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java +++ b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java @@ -41,6 +41,8 @@ */ package org.jfree.chart.util; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Color; import java.awt.Graphics2D; @@ -62,7 +64,7 @@ public class DefaultShadowGenerator implements ShadowGenerator, Serializable { private static final long serialVersionUID = 2732993885591386064L; /** The shadow size. */ - private int shadowSize; + private /*@NonNegative*/ int shadowSize; /** The shadow color. */ private Color shadowColor; diff --git a/src/main/java/org/jfree/chart/util/PaintAlpha.java b/src/main/java/org/jfree/chart/util/PaintAlpha.java index 2348aa118..785d02710 100644 --- a/src/main/java/org/jfree/chart/util/PaintAlpha.java +++ b/src/main/java/org/jfree/chart/util/PaintAlpha.java @@ -250,7 +250,10 @@ private static TexturePaint darkerTexturePaint(TexturePaint paint) { final int wid = ras.getWidth(); - /**/ int[] pix = new int[wid * img.getSampleModel().getNumBands()]; + @SuppressWarnings("index") // wid is NN, as is img.getSampleModel().getNumBands(). Both require JDK annotations on classes in java.awt.image + /*@NonNegative*/ int pixLength = wid * img.getSampleModel().getNumBands(); + + /**/ int[] pix = new int[pixLength]; /* (pix-buffer is large enough for all pixels of one row) */ /** @@ -281,7 +284,8 @@ private static TexturePaint darkerTexturePaint(TexturePaint paint) { pix = ras.getPixels(miX, y, wid, 1, pix); for (int p = 0; p < pix.length; p++) { - nco = img.getColorModel().getComponents(pix[p], nco, 0); + @SuppressWarnings({"index", "value"}) // needs annotations on java.awt.image.ColorModel - getComponents returns same length as the array passed in + int /*@ArrayLen(4)*/ [] nco2 = img.getColorModel().getComponents(pix[p], nco, 0); nco[0] *= FACTOR; // Red nco[1] *= FACTOR; // Green nco[2] *= FACTOR; // Blue. Now map computed colour to From a04f724cfc88dcad2a1fba77caac650bdd4ef4e7 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Fri, 29 Dec 2017 21:53:07 -0800 Subject: [PATCH 23/79] afternoon work --- .../renderer/xy/ClusteredXYBarRenderer.java | 2 +- .../renderer/xy/CyclicXYItemRenderer.java | 5 +++++ .../chart/renderer/xy/DeviationRenderer.java | 18 +++++++++++------- .../renderer/xy/GradientXYBarPainter.java | 6 +++--- .../renderer/xy/StackedXYAreaRenderer2.java | 16 ++++++++++------ .../renderer/xy/StackedXYBarRenderer.java | 9 ++++++--- .../renderer/xy/StandardXYItemRenderer.java | 6 ++++-- .../chart/renderer/xy/VectorRenderer.java | 11 +++++++---- .../chart/renderer/xy/WindItemRenderer.java | 12 +++++++----- .../chart/renderer/xy/XYAreaRenderer.java | 6 ++++-- .../chart/renderer/xy/XYAreaRenderer2.java | 7 +++++-- .../jfree/chart/renderer/xy/XYBarPainter.java | 6 +++--- .../chart/renderer/xy/XYBlockRenderer.java | 9 ++++++--- .../renderer/xy/XYBoxAndWhiskerRenderer.java | 6 +++--- .../renderer/xy/XYDifferenceRenderer.java | 4 +++- .../renderer/xy/XYLineAndShapeRenderer.java | 11 ++++++----- 16 files changed, 84 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java index 0a2843f57..8a65f511d 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java @@ -226,7 +226,7 @@ protected Range findDomainBoundsWithOffset(IntervalXYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 6e6240343..1faf13b3e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -283,6 +283,11 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > newset, series, one, crosshairState, pass ); + if (x.length < 3 || y.length < 3) { + // dead code, necessary for typechecking. x and y have correlated lengths + assert false; + } + if (cnax != null) { if (xcycleBound == x[1]) { cnax.setBoundMappedToLastCycle(x[2] <= xcycleBound); diff --git a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java index 1497807bc..1b27709fb 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java @@ -44,10 +44,10 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.AlphaComposite; @@ -284,11 +284,15 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, // first pass draws the shading if (pass == 0) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; + + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; + State drState = (State) state; - double x = intervalDataset.getXValue(series, item); - double yLow = intervalDataset.getStartYValue(series, item); - double yHigh = intervalDataset.getEndYValue(series, item); + double x = intervalDataset.getXValue(series, intervalXYItem); + double yLow = intervalDataset.getStartYValue(series, intervalXYItem); + double yHigh = intervalDataset.getEndYValue(series, intervalXYItem); RectangleEdge xAxisLocation = plot.getDomainAxisEdge(); RectangleEdge yAxisLocation = plot.getRangeAxisEdge(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java index 3731498db..ce1978291 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java @@ -40,8 +40,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; @@ -319,7 +319,7 @@ else if (base == RectangleEdge.RIGHT) { * * @return An array containing four subregions. */ - private Rectangle2D[] splitHorizontalBar(RectangularShape bar, double a, + private Rectangle2D /*@ArrayLen(4)*/ [] splitHorizontalBar(RectangularShape bar, double a, double b, double c) { Rectangle2D[] result = new Rectangle2D[4]; double y0 = bar.getMinY(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java index 1fae50efb..1c8d1ed42 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java @@ -56,10 +56,10 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.common.value.qual.MinLen; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -243,8 +243,12 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, // get the previous point and the next point so we can calculate a // "hot spot" for the area (used by the chart entity)... - double x0 = dataset.getXValue(series, Math.max(item - 1, 0)); - double y0 = dataset.getYValue(series, Math.max(item - 1, 0)); + + @SuppressWarnings("index") // itemCount is at least one, so zero is an index + /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + + double x0 = dataset.getXValue(series, Math.max(item - 1, zero)); + double y0 = dataset.getYValue(series, Math.max(item - 1, zero)); if (Double.isNaN(y0)) { y0 = 0.0; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java index fef7cae09..e0b022b88 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java @@ -266,7 +266,9 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - double value = intervalDataset.getYValue(series, item); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; + double value = intervalDataset.getYValue(series, intervalXYItem); if (Double.isNaN(value)) { return; } @@ -289,6 +291,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double negativeBase = 0.0; for (int i = 0; i < series; i++) { + @SuppressWarnings("index") // this code assumes that item is an index into every series in the dataset preceding the series, not just the series. This isn't an intrinsic property of xydatasets, so I think this may be a bug? double v = dataset.getYValue(i, item); if (!Double.isNaN(v) && isSeriesVisible(i)) { if (this.renderAsPercentages) { @@ -320,14 +323,14 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } RectangleEdge edgeD = plot.getDomainAxisEdge(); - double startX = intervalDataset.getStartXValue(series, item); + double startX = intervalDataset.getStartXValue(series, intervalXYItem); if (Double.isNaN(startX)) { return; } double translatedStartX = domainAxis.valueToJava2D(startX, dataArea, edgeD); - double endX = intervalDataset.getEndXValue(series, item); + double endX = intervalDataset.getEndXValue(series, intervalXYItem); if (Double.isNaN(endX)) { return; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index 40456b709..8c1b4523c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -635,7 +635,7 @@ public static class State extends XYItemRendererState { public GeneralPath seriesPath; /** The series index. */ - private /*@NonNegative*/ int seriesIndex; + private /*@GTENegativeOne*/ int seriesIndex; /** * A flag that indicates if the last (x, y) point was 'good' @@ -821,7 +821,9 @@ else if (item != 0 && itemVisible) { // previous data point is within the threshold @SuppressWarnings("index") // item is an index, but it's not equal to zero. This implies that there must be at least two items. /*@Positive*/ int numX = dataset.getItemCount(series); - double minX = dataset.getXValue(series, 0); + @SuppressWarnings("index") // zero is an index, because itemCount >= 2 + /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + double minX = dataset.getXValue(series, zero); double maxX = dataset.getXValue(series, numX - 1); if (this.gapThresholdType == UnitType.ABSOLUTE) { drawLine = Math.abs(x1 - x0) <= this.gapThreshold; diff --git a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java index 424adf5ab..297220a68 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java @@ -46,8 +46,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -232,8 +232,11 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double dx = 0.0; double dy = 0.0; if (dataset instanceof VectorXYDataset) { - dx = ((VectorXYDataset) dataset).getVectorXValue(series, item); - dy = ((VectorXYDataset) dataset).getVectorYValue(series, item); + VectorXYDataset vectorXYDataset = (VectorXYDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("vectorXYDataset.getSeries(series)")*/ int vectorXYItem = item; + dx = vectorXYDataset.getVectorXValue(series, vectorXYItem); + dy = vectorXYDataset.getVectorYValue(series, vectorXYItem); } double xx0 = domainAxis.valueToJava2D(x, dataArea, plot.getDomainAxisEdge()); diff --git a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java index d01d74fd0..d9414f71b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java @@ -56,8 +56,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Color; @@ -124,6 +124,8 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { WindDataset windData = (WindDataset) dataset; + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("windData.getSeries(series)")*/ int windItem = item; Paint seriesPaint = getItemPaint(series, item); Stroke seriesStroke = getItemStroke(series, item); @@ -132,9 +134,9 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, // get the data point... - Number x = windData.getX(series, item); - Number windDir = windData.getWindDirection(series, item); - Number wforce = windData.getWindForce(series, item); + Number x = windData.getX(series, windItem); + Number windDir = windData.getWindDirection(series, windItem); + Number wforce = windData.getWindForce(series, windItem); double windForce = wforce.doubleValue(); double wdirt = Math.toRadians(windDir.doubleValue() * (-30.0) - 90.0); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index d42d91b66..18017bc05 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -521,8 +521,10 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, // "hot spot" for the area (used by the chart entity)... @SuppressWarnings("index") // itemCount needs to be at least 1 if we have an index (which we do - item). /*@Positive*/ int itemCount = dataset.getItemCount(series); - double x0 = dataset.getXValue(series, Math.max(item - 1, 0)); - double y0 = dataset.getYValue(series, Math.max(item - 1, 0)); + @SuppressWarnings("index") // itemCount is at least one, so zero is an index + /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + double x0 = dataset.getXValue(series, Math.max(item - 1, zero)); + double y0 = dataset.getYValue(series, Math.max(item - 1, zero)); if (Double.isNaN(y0)) { y0 = 0.0; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java index a78346118..328a0e190 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java @@ -310,10 +310,13 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double transY1 = rangeAxis.valueToJava2D(y1, dataArea, plot.getRangeAxisEdge()); + @SuppressWarnings("index") // itemCount is at least one, so zero is an index + /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + // get the previous point and the next point so we can calculate a // "hot spot" for the area (used by the chart entity)... - double x0 = dataset.getXValue(series, Math.max(item - 1, 0)); - double y0 = dataset.getYValue(series, Math.max(item - 1, 0)); + double x0 = dataset.getXValue(series, Math.max(item - 1, zero)); + double y0 = dataset.getYValue(series, Math.max(item - 1, zero)); if (Double.isNaN(y0)) { y0 = 0.0; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java index 286f4a92b..58cc104f6 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; import java.awt.geom.RectangularShape; @@ -73,7 +73,7 @@ public interface XYBarPainter { * @param base the base of the bar. */ public void paintBar(Graphics2D g2, XYBarRenderer renderer, - int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base); + /*@NonNegative*/ int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base); /** * Paints the shadow for a single bar on behalf of a renderer. @@ -87,7 +87,7 @@ public void paintBar(Graphics2D g2, XYBarRenderer renderer, * @param pegShadow peg the shadow to the base of the bar? */ public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, - int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, + /*@NonNegative*/ int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, boolean pegShadow); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 3de5f5d59..0e0074a34 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -46,8 +46,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.BasicStroke; @@ -358,7 +358,10 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double y = dataset.getYValue(series, item); double z = 0.0; if (dataset instanceof XYZDataset) { - z = ((XYZDataset) dataset).getZValue(series, item); + XYZDataset xyzDataset = ((XYZDataset) dataset); + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + /*@IndexFor("xyzDataset.getSeries(series)")*/ int xyzItem = item; + z = xyzDataset.getZValue(series, xyzItem); } Paint p = this.paintScale.getPaint(z); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index a97f7e061..eb312f9d4 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -77,8 +77,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -380,7 +380,7 @@ else if (orientation == PlotOrientation.VERTICAL) { public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + /*@IndexFor("#7.getSeries(#8)")*/ int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index d39c90791..e2c66716f 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -462,7 +462,9 @@ protected void drawItemPass0(Graphics2D x_graphics, if (b_impliedZeroSubtrahend) { l_subtrahendItem = 0; l_subtrahendItemCount = 2; - l_subtrahendCurX = new Double(x_dataset.getXValue(0, 0)); + @SuppressWarnings("index") // itemCount is positive for series zero, so zero is an index into that series + /*@IndexFor("x_dataset.getSeries(0)")*/ int zero = 0; + l_subtrahendCurX = new Double(x_dataset.getXValue(0, zero)); l_subtrahendNextX = new Double(x_dataset.getXValue(0, (l_minuendItemCount - 1))); l_subtrahendCurY = new Double(0.0); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index 63bb17ff5..d8588aa39 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -72,8 +72,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -685,7 +685,7 @@ public void setLastPointGood(boolean good) { */ @Override public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, - int firstItem, int lastItem, int pass, int passCount) { + /*@IndexFor("#1.getSeries(#2)")*/ int firstItem, /*@IndexFor("#1.getSeries(#2)")*/ int lastItem, int pass, int passCount) { this.seriesPath.reset(); this.lastPointGood = false; super.startSeriesPass(dataset, series, firstItem, lastItem, pass, @@ -738,7 +738,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -1030,7 +1030,8 @@ else if (orientation == PlotOrientation.VERTICAL) { (y1 < 0.0)); } - int datasetIndex = plot.indexOf(dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); From bba45717f901ffc60b180567de3f97339359512e Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sat, 30 Dec 2017 13:13:13 -0800 Subject: [PATCH 24/79] 2 warnings! The only remaining type checking warnings are super weird and need to be investigated further; everything else has either been removed or suppressed --- .../renderer/xy/CandlestickRenderer.java | 8 +-- .../renderer/xy/CyclicXYItemRenderer.java | 2 +- .../renderer/xy/StandardXYItemRenderer.java | 2 +- .../chart/renderer/xy/XYAreaRenderer.java | 6 +- .../renderer/xy/XYBoxAndWhiskerRenderer.java | 4 +- .../renderer/xy/XYDifferenceRenderer.java | 71 ++++++++++++------- .../chart/renderer/xy/XYShapeRenderer.java | 7 +- .../chart/renderer/xy/XYSplineRenderer.java | 11 +-- .../org/jfree/chart/text/TextMeasurer.java | 3 +- .../java/org/jfree/chart/text/TextUtils.java | 9 ++- .../java/org/jfree/chart/ui/LCBLayout.java | 9 ++- .../jfree/chart/ui/NumberCellRenderer.java | 1 + .../chart/urls/CustomPieURLGenerator.java | 2 +- .../org/jfree/chart/urls/PieURLGenerator.java | 3 +- .../chart/urls/TimeSeriesURLGenerator.java | 3 +- .../org/jfree/chart/urls/XYURLGenerator.java | 3 +- .../chart/util/DefaultShadowGenerator.java | 38 ++++++---- .../java/org/jfree/chart/util/PaintAlpha.java | 18 +++-- .../org/jfree/chart/util/StringUtils.java | 7 +- .../jfree/data/time/TimeSeriesTableModel.java | 5 ++ .../jfree/data/xy/XYDatasetTableModel.java | 5 +- 21 files changed, 143 insertions(+), 74 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java index 477133771..f1370889c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java @@ -729,15 +729,15 @@ else if (orientation == PlotOrientation.VERTICAL) { break; case WIDTHMETHOD_INTERVALDATA: - IntervalXYDataset intervalXYData + IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 - /*@IndexFor("intervalXYData.getSeries(series)")*/ int intervalXYItem = item; + /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; double startPos = domainAxis.valueToJava2D( - intervalXYData.getStartXValue(series, intervalXYItem), + intervalDataset.getStartXValue(series, intervalXYItem), dataArea, plot.getDomainAxisEdge()); double endPos = domainAxis.valueToJava2D( - intervalXYData.getEndXValue(series, intervalXYItem), + intervalDataset.getEndXValue(series, intervalXYItem), dataArea, plot.getDomainAxisEdge()); xxWidth = Math.abs(endPos - startPos); break; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 1faf13b3e..8ee1ba6d8 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -285,7 +285,7 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > if (x.length < 3 || y.length < 3) { // dead code, necessary for typechecking. x and y have correlated lengths - assert false; + return; } if (cnax != null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index 8c1b4523c..28d14d0e4 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -677,7 +677,7 @@ public void setLastPointGood(boolean good) { * * @return The series index for the current path. */ - public /*@NonNegative*/ int getSeriesIndex() { + public /*@GTENegativeOne*/ int getSeriesIndex() { return this.seriesIndex; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index 18017bc05..d22128335 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -522,9 +522,9 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, @SuppressWarnings("index") // itemCount needs to be at least 1 if we have an index (which we do - item). /*@Positive*/ int itemCount = dataset.getItemCount(series); @SuppressWarnings("index") // itemCount is at least one, so zero is an index - /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; - double x0 = dataset.getXValue(series, Math.max(item - 1, zero)); - double y0 = dataset.getYValue(series, Math.max(item - 1, zero)); + /*@IndexFor("dataset.getSeries(series)")*/ int zero_const = 0; + double x0 = dataset.getXValue(series, Math.max(item - 1, zero_const)); + double y0 = dataset.getYValue(series, Math.max(item - 1, zero_const)); if (Double.isNaN(y0)) { y0 = 0.0; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index eb312f9d4..6ae5e10cf 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -344,7 +344,7 @@ protected Paint lookupBoxPaint(/*@NonNegative*/ int series, /*@NonNegative*/ int public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); @@ -523,7 +523,7 @@ else if (exactBoxWidth > maxBoxWidth) { public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + /*@IndexFor("#7.getSeries(#8)")*/ int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index e2c66716f..cbc48577a 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -374,7 +374,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, CrosshairState crosshairState, int pass) { + /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { if (pass == 0) { drawItemPass0(g2, dataArea, info, plot, domainAxis, rangeAxis, @@ -410,8 +410,8 @@ protected void drawItemPass0(Graphics2D x_graphics, ValueAxis x_domainAxis, ValueAxis x_rangeAxis, XYDataset x_dataset, - int x_series, - /*@NonNegative*/ int x_item, + /*@NonNegative*/ int x_series, + /*@IndexFor("#7.getSeries(#8)")*/ int x_item, CrosshairState x_crosshairState) { if (!((0 == x_series) && (0 == x_item))) { @@ -439,7 +439,8 @@ protected void drawItemPass0(Graphics2D x_graphics, LinkedList l_polygonYs = new LinkedList(); // state - int l_minuendItem = 0; + @SuppressWarnings("index") // one of the guarantees of a non-degenerate series is that it has at least one item + /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItem = 0; @SuppressWarnings("index") // the call to isEitherSeriesDegenerate above guarantees this is true /*@Positive*/ int l_minuendItemCount = x_dataset.getItemCount(0); Double l_minuendCurX = null; @@ -449,7 +450,8 @@ protected void drawItemPass0(Graphics2D x_graphics, double l_minuendMaxY = Double.NEGATIVE_INFINITY; double l_minuendMinY = Double.POSITIVE_INFINITY; - int l_subtrahendItem = 0; + @SuppressWarnings("index") // one of the guarantees of a non-degenerate series is that it has at least one item + /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItem = 0; int l_subtrahendItemCount = 0; // actual value set below Double l_subtrahendCurX = null; Double l_subtrahendNextX = null; @@ -460,7 +462,7 @@ protected void drawItemPass0(Graphics2D x_graphics, // if a subtrahend is not specified, assume it is zero if (b_impliedZeroSubtrahend) { - l_subtrahendItem = 0; + //l_subtrahendItem = 0; l_subtrahendItemCount = 2; @SuppressWarnings("index") // itemCount is positive for series zero, so zero is an index into that series /*@IndexFor("x_dataset.getSeries(0)")*/ int zero = 0; @@ -503,8 +505,10 @@ protected void drawItemPass0(Graphics2D x_graphics, // get the x and y coordinates l_x1 = x_dataset.getXValue(0, l_minuendItem); l_y1 = x_dataset.getYValue(0, l_minuendItem); - l_x2 = x_dataset.getXValue(0, l_minuendItem + 1); - l_y2 = x_dataset.getYValue(0, l_minuendItem + 1); + @SuppressWarnings("index") // non-degenerate series always have both x and y coordinates + /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItemPlusOne = l_minuendItem + 1; + l_x2 = x_dataset.getXValue(0, l_minuendItemPlusOne); + l_y2 = x_dataset.getYValue(0, l_minuendItemPlusOne); l_minuendCurX = new Double(l_x1); l_minuendCurY = new Double(l_y1); @@ -520,8 +524,10 @@ protected void drawItemPass0(Graphics2D x_graphics, else { l_x3 = x_dataset.getXValue(1, l_subtrahendItem); l_y3 = x_dataset.getYValue(1, l_subtrahendItem); - l_x4 = x_dataset.getXValue(1, l_subtrahendItem + 1); - l_y4 = x_dataset.getYValue(1, l_subtrahendItem + 1); + @SuppressWarnings("index") // non-degenerate series always have both x and y coordinates + /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItemPlusOne = l_subtrahendItem + 1; + l_x4 = x_dataset.getXValue(1, l_subtrahendItemPlusOne); + l_y4 = x_dataset.getYValue(1, l_subtrahendItemPlusOne); l_subtrahendCurX = new Double(l_x3); l_subtrahendCurY = new Double(l_y3); @@ -530,15 +536,17 @@ protected void drawItemPass0(Graphics2D x_graphics, } if (l_x2 <= l_x3) { - // minuend needs to be fast forwarded - l_minuendItem++; + @SuppressWarnings("index") // minuend needs to be fast forwarded + /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItemTmp = l_minuendItem + 1; + l_minuendItem = l_minuendItemTmp; b_minuendFastForward = true; continue; } if (l_x4 <= l_x1) { - // subtrahend needs to be fast forwarded - l_subtrahendItem++; + @SuppressWarnings("index") // subtrahend needs to be fast forwarded + /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItemTmp = l_subtrahendItem + 1; + l_subtrahendItem = l_subtrahendItemTmp; b_subtrahendFastForward = true; continue; } @@ -590,8 +598,11 @@ protected void drawItemPass0(Graphics2D x_graphics, l_minuendMaxY = Math.max(l_minuendMaxY, l_y1); l_minuendMinY = Math.min(l_minuendMinY, l_y1); - l_x2 = x_dataset.getXValue(0, l_minuendItem + 1); - l_y2 = x_dataset.getYValue(0, l_minuendItem + 1); + @SuppressWarnings("index") // non-degenerate series always have both x and y coordinates + /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItemPlusOne = l_minuendItem + 1; + + l_x2 = x_dataset.getXValue(0, l_minuendItemPlusOne); + l_y2 = x_dataset.getYValue(0, l_minuendItemPlusOne); l_minuendNextX = new Double(l_x2); l_minuendNextY = new Double(l_y2); } @@ -612,8 +623,11 @@ protected void drawItemPass0(Graphics2D x_graphics, l_subtrahendMaxY = Math.max(l_subtrahendMaxY, l_y3); l_subtrahendMinY = Math.min(l_subtrahendMinY, l_y3); - l_x4 = x_dataset.getXValue(1, l_subtrahendItem + 1); - l_y4 = x_dataset.getYValue(1, l_subtrahendItem + 1); + @SuppressWarnings("index") // non-degenerate series always have both x and y coordinates + /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItemPlusOne = l_subtrahendItem + 1; + + l_x4 = x_dataset.getXValue(1, l_subtrahendItemPlusOne); + l_y4 = x_dataset.getYValue(1, l_subtrahendItemPlusOne); l_subtrahendNextX = new Double(l_x4); l_subtrahendNextY = new Double(l_y4); } @@ -771,18 +785,20 @@ protected void drawItemPass0(Graphics2D x_graphics, l_polygonYs.add(l_intersectY); } - // advance the minuend if needed if (l_x2 <= l_x4) { - l_minuendItem++; + @SuppressWarnings("index") // advance the minuend if needed + /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItemTmp = l_minuendItem + 1; + l_minuendItem = l_minuendItemTmp; b_minuendAdvanced = true; } else { b_minuendAdvanced = false; } - // advance the subtrahend if needed if (l_x4 <= l_x2) { - l_subtrahendItem++; + @SuppressWarnings("index") // advance the subtrahend if needed + /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItemTmp = l_subtrahendItem + 1; + l_subtrahendItem = l_subtrahendItemTmp; b_subtrahendAdvanced = true; } else { @@ -872,7 +888,7 @@ protected void drawItemPass1(Graphics2D x_graphics, ValueAxis x_rangeAxis, XYDataset x_dataset, /*@NonNegative*/ int x_series, - /*@NonNegative*/ int x_item, + /*@IndexFor("#7.getSeries(#8)")*/ int x_item, CrosshairState x_crosshairState) { Shape l_entityArea = null; @@ -944,7 +960,8 @@ protected void drawItemPass1(Graphics2D x_graphics, x_item, l_x1, l_y1, (l_y1 < 0.0)); } - int datasetIndex = x_plot.indexOf(x_dataset); + @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + /*@NonNegative*/ int datasetIndex = x_plot.indexOf(x_dataset); updateCrosshairValues(x_crosshairState, l_x0, l_y0, datasetIndex, l_x1, l_y1, l_orientation); @@ -1004,11 +1021,13 @@ private boolean areSeriesDisjoint(XYDataset x_dataset) { @SuppressWarnings("index") // This method can only called on XYDataset_s with at least one item. See drawItemPass0 /*@Positive*/ int l_minuendItemCount = x_dataset.getItemCount(0); - double l_minuendFirst = x_dataset.getXValue(0, 0); + @SuppressWarnings("index") // This method can only called on XYDataset_s with at least one item. See drawItemPass0 + /*@IndexFor({"x_dataset.getSeries(0)", "x_dataset.getSeries(1)"})*/ int zero = 0; + double l_minuendFirst = x_dataset.getXValue(0, zero); double l_minuendLast = x_dataset.getXValue(0, l_minuendItemCount - 1); int l_subtrahendItemCount = x_dataset.getItemCount(1); - double l_subtrahendFirst = x_dataset.getXValue(1, 0); + double l_subtrahendFirst = x_dataset.getXValue(1, zero); @SuppressWarnings("index") // This method can only called on XYDataset_s with at least one item. See drawItemPass0 double l_subtrahendLast = x_dataset.getXValue(1, l_subtrahendItemCount - 1); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 1d0eba0e8..a3d369608 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -46,8 +46,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -516,9 +516,10 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * * @return The paint. */ - protected Paint getPaint(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + protected Paint getPaint(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { Paint p; if (dataset instanceof XYZDataset) { + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 double z = ((XYZDataset) dataset).getZValue(series, item); p = this.paintScale.getPaint(z); } else { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java index 3a2d2ad9f..85682217e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java @@ -301,7 +301,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, @Override protected void drawPrimaryLineAsPath(XYItemRendererState state, Graphics2D g2, XYPlot plot, XYDataset dataset, int pass, - /*@NonNegative*/ int series, /*@NonNegative*/ int item, ValueAxis xAxis, ValueAxis yAxis, + /*@NonNegative*/ int series, /*@IndexFor("#4.getSeries(#6)")*/ int item, ValueAxis xAxis, ValueAxis yAxis, Rectangle2D dataArea) { XYSplineState s = (XYSplineState) state; @@ -324,7 +324,8 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, } if (item == dataset.getItemCount(series) - 1) { // construct path - if (s.points.size() > 1) { + int spointsSize = s.points.size(); + if (spointsSize > 1) { Point2D origin; if (this.fillType == FillType.TO_ZERO) { float xz = (float) xAxis.valueToJava2D(0, dataArea, @@ -432,10 +433,10 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, if (this.fillType != FillType.NONE) { if (plot.getOrientation() == PlotOrientation.HORIZONTAL) { s.fillArea.lineTo(origin.getX(), s.points.get( - s.points.size() - 1).getY()); + spointsSize - 1).getY()); } else { s.fillArea.lineTo(s.points.get( - s.points.size() - 1).getX(), origin.getY()); + spointsSize - 1).getX(), origin.getY()); } s.fillArea.closePath(); } @@ -463,7 +464,7 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, } private void solveTridiag(float[] sub, float[] diag, float[] sup, - float[] b, int n) { + float[] b, /*@IndexFor({"#1", "#2", "#3", "#4"})*/ int n) { /* solve linear system with tridiagonal n by n matrix a using Gaussian elimination *without* pivoting where a(i,i-1) = sub[i] for 2<=i<=n diff --git a/src/main/java/org/jfree/chart/text/TextMeasurer.java b/src/main/java/org/jfree/chart/text/TextMeasurer.java index 2ed5211e3..99089fa09 100644 --- a/src/main/java/org/jfree/chart/text/TextMeasurer.java +++ b/src/main/java/org/jfree/chart/text/TextMeasurer.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.text; +/*>>> import org.checkerframework.checker.index.qual.*; */ /** * An object that can measure text. @@ -43,7 +44,7 @@ public interface TextMeasurer { * * @return The width of the string in Java2D units. */ - public float getStringWidth(String text, int start, int end); + public float getStringWidth(String text, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int end); } diff --git a/src/main/java/org/jfree/chart/text/TextUtils.java b/src/main/java/org/jfree/chart/text/TextUtils.java index 9f54e2e88..1158c3600 100644 --- a/src/main/java/org/jfree/chart/text/TextUtils.java +++ b/src/main/java/org/jfree/chart/text/TextUtils.java @@ -177,7 +177,11 @@ public static TextBlock createTextBlock(String text, Font font, } else if (next == current) { next++; // we must take one more character or we'll loop forever } - result.addLine(text.substring(current, next), font, paint); + + @SuppressWarnings("index") // next is either < current < text.length, or next = current + 1 <= text.length + /*@IndexOrHigh("text")*/ int next1 = next; + + result.addLine(text.substring(current, next1), font, paint); lines++; current = next; while (current < text.length()&& text.charAt(current) == '\n') { @@ -214,7 +218,8 @@ public static TextBlock createTextBlock(String text, Font font, * * @return The index of the next line break. */ - private static /*@NonNegative*/ int nextLineBreak(String text, /*@IndexOrHigh("#1")*/ int start, float width, + @SuppressWarnings("index") // java.text.BreakIterator needs annotations + private static /*@GTENegativeOne*/ int nextLineBreak(String text, /*@IndexOrHigh("#1")*/ int start, float width, BreakIterator iterator, TextMeasurer measurer) { // this method is (loosely) based on code in JFreeReport's diff --git a/src/main/java/org/jfree/chart/ui/LCBLayout.java b/src/main/java/org/jfree/chart/ui/LCBLayout.java index b36f549bf..18454ed0f 100644 --- a/src/main/java/org/jfree/chart/ui/LCBLayout.java +++ b/src/main/java/org/jfree/chart/ui/LCBLayout.java @@ -91,7 +91,8 @@ public Dimension preferredLayoutSize(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); - int nrows = ncomponents / COLUMNS; + @SuppressWarnings("index") // (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash. I believe this is by design, but it's not good code. + /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { Component component = parent.getComponent(r * COLUMNS + c); @@ -132,7 +133,8 @@ public Dimension minimumLayoutSize(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); - int nrows = ncomponents / COLUMNS; + @SuppressWarnings("index") // (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash. I believe this is by design, but it's not good code. + /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { Component component = parent.getComponent(r * COLUMNS + c); @@ -171,7 +173,8 @@ public void layoutContainer(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); - int nrows = ncomponents / COLUMNS; + @SuppressWarnings("index") // (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash. I believe this is by design, but it's not good code. + /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { Component component = parent.getComponent(r * COLUMNS + c); diff --git a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java index dca5bc4ef..6658017e7 100644 --- a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java +++ b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java @@ -64,6 +64,7 @@ public NumberCellRenderer() { * @return the component that can render the contents of the cell. */ @Override + @SuppressWarnings("index") // DefaultTableCellRenderer needs index annotations public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { diff --git a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java index 00d8219d1..03231f3ce 100644 --- a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java @@ -93,7 +93,7 @@ public CustomPieURLGenerator() { */ @Override public String generateURL(PieDataset dataset, Comparable key, - int pieIndex) { + /*@NonNegative*/ int pieIndex) { return getURL(key, pieIndex); } diff --git a/src/main/java/org/jfree/chart/urls/PieURLGenerator.java b/src/main/java/org/jfree/chart/urls/PieURLGenerator.java index 067ffe467..45a09f108 100644 --- a/src/main/java/org/jfree/chart/urls/PieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/PieURLGenerator.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.urls; +/*>>> import org.checkerframework.checker.index.qual.*; */ import org.jfree.data.general.PieDataset; @@ -75,6 +76,6 @@ public interface PieURLGenerator { * * @return A string containing the URL. */ - public String generateURL(PieDataset dataset, Comparable key, int pieIndex); + public String generateURL(PieDataset dataset, Comparable key, /*@NonNegative*/ int pieIndex); } diff --git a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java index 9fcee6ae9..50921f99d 100644 --- a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java @@ -50,6 +50,7 @@ */ package org.jfree.chart.urls; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -169,7 +170,7 @@ public String getItemParameterName() { * @return The generated URL. */ @Override - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { String result = this.prefix; boolean firstParameter = !result.contains("?"); Comparable seriesKey = dataset.getSeriesKey(series); diff --git a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java index f830a4957..65fb9f3f7 100644 --- a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java @@ -44,6 +44,7 @@ */ package org.jfree.chart.urls; +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -70,6 +71,6 @@ public interface XYURLGenerator { * @return A string containing the generated URL (possibly * {@code null}). */ - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); + public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item); } diff --git a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java index 20fce6b2e..c292fd6ac 100644 --- a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java +++ b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java @@ -94,7 +94,7 @@ public DefaultShadowGenerator() { * @param distance the shadow offset distance. * @param angle the shadow offset angle (in radians). */ - public DefaultShadowGenerator(int size, Color color, float opacity, + public DefaultShadowGenerator(/*@NonNegative*/ int size, Color color, float opacity, int distance, double angle) { Args.nullNotPermitted(color, "color"); this.shadowSize = size; @@ -225,7 +225,8 @@ protected void applyShadow(BufferedImage image) { for (int y = 0, bufferOffset = 0; y < dstHeight; y++, bufferOffset = y * dstWidth) { aSum = 0; historyIdx = 0; - for (int x = 0; x < this.shadowSize; x++, bufferOffset++) { + for (int x = 0; x < aHistory.length; x++, bufferOffset++) { + @SuppressWarnings("index") // dataBuffer has an internal structure: it's divided into dstHeight sections of dstWidth. We iterate through dstHeight with y, and bufferOffset moves through the width int a = dataBuffer[bufferOffset] >>> 24; aHistory[x] = a; aSum += a; @@ -235,14 +236,20 @@ protected void applyShadow(BufferedImage image) { for (int x = xStart; x < xStop; x++, bufferOffset++) { int a = (int) (aSum * sumDivider); - dataBuffer[bufferOffset] = a << 24 | shadowRgb; + @SuppressWarnings("index") // dataBuffer has an internal structure: it's divided into dstHeight sections of dstWidth. We iterate through dstHeight with y, and bufferOffset moves through the width + int dead = (dataBuffer[bufferOffset] = a << 24 | shadowRgb); + + @SuppressWarnings("index") // historyIdx is always less than this.shadowSize, which is the length of aHistory + /*@IndexFor("aHistory")*/ int historyIdx1 = historyIdx; // substract the oldest pixel from the sum - aSum -= aHistory[historyIdx]; + aSum -= aHistory[historyIdx1]; // get the lastest pixel - a = dataBuffer[bufferOffset + right] >>> 24; - aHistory[historyIdx] = a; + @SuppressWarnings("index") // dataBuffer has an internal structure: it's divided into dstHeight sections of dstWidth. We iterate through dstHeight with y, and bufferOffset moves through the width + int aTmp = dataBuffer[bufferOffset + right] >>> 24; + a = aTmp; + aHistory[historyIdx1] = a; aSum += a; if (++historyIdx >= this.shadowSize) { @@ -255,9 +262,10 @@ protected void applyShadow(BufferedImage image) { for (int x = 0, bufferOffset = 0; x < dstWidth; x++, bufferOffset = x) { aSum = 0; historyIdx = 0; - for (int y = 0; y < this.shadowSize; y++, + for (int y = 0; y < aHistory.length; y++, bufferOffset += dstWidth) { - int a = dataBuffer[bufferOffset] >>> 24; + @SuppressWarnings("index") // dataBuffer has an internal structure: it's divided into dstHeight sections of dstWidth. We iterate through dstWidth with x, and bufferOffset moves through the height + int a = dataBuffer[bufferOffset] >>> 24; aHistory[y] = a; aSum += a; } @@ -266,14 +274,20 @@ protected void applyShadow(BufferedImage image) { for (int y = yStart; y < yStop; y++, bufferOffset += dstWidth) { int a = (int) (aSum * sumDivider); - dataBuffer[bufferOffset] = a << 24 | shadowRgb; + @SuppressWarnings("index") // dataBuffer has an internal structure: it's divided into dstHeight sections of dstWidth. We iterate through dstWidth with x, and bufferOffset moves through the height + int dead = (dataBuffer[bufferOffset] = a << 24 | shadowRgb); + + @SuppressWarnings("index") // historyIdx is always less than this.shadowSize, which is the length of aHistory + /*@IndexFor("aHistory")*/ int historyIdx1 = historyIdx; // substract the oldest pixel from the sum - aSum -= aHistory[historyIdx]; + aSum -= aHistory[historyIdx1]; // get the lastest pixel - a = dataBuffer[bufferOffset + lastPixelOffset] >>> 24; - aHistory[historyIdx] = a; + @SuppressWarnings("index") // dataBuffer has an internal structure: it's divided into dstHeight sections of dstWidth. We iterate through dstWidth with x, and bufferOffset moves through the height + int aTmp = dataBuffer[bufferOffset + lastPixelOffset] >>> 24; + a = aTmp; + aHistory[historyIdx1] = a; aSum += a; if (++historyIdx >= this.shadowSize) { diff --git a/src/main/java/org/jfree/chart/util/PaintAlpha.java b/src/main/java/org/jfree/chart/util/PaintAlpha.java index 785d02710..3df3a629f 100644 --- a/src/main/java/org/jfree/chart/util/PaintAlpha.java +++ b/src/main/java/org/jfree/chart/util/PaintAlpha.java @@ -43,6 +43,9 @@ package org.jfree.chart.util; +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ + import java.awt.Color; import java.awt.GradientPaint; import java.awt.LinearGradientPaint; @@ -316,11 +319,16 @@ private static TexturePaint darkerTexturePaint(TexturePaint paint) { pix = ras.getPixels(miX, y, wid, 1, pix); - for (int p = 0; p < pix.length;) { - pix[p] = (int)(pix[p++] * FACTOR); // Red - pix[p] = (int)(pix[p++] * FACTOR); // Green - pix[p] = (int)(pix[p++] * FACTOR); // Blue - /* Ignore alpha-channel -> */p++; + for (int p = 0; p < pix.length; p++) { + switch(p % 4) { + case 0: // Red + case 1: // Green + case 2: // Blue + pix[p] = (int)(pix[p] * FACTOR); + break; + case 3: + /* Ignore alpha-channel -> */continue; + } } /**/ ras.setPixels(miX, y, wid, 1, pix); } diff --git a/src/main/java/org/jfree/chart/util/StringUtils.java b/src/main/java/org/jfree/chart/util/StringUtils.java index 9299ed405..a9fa132a9 100644 --- a/src/main/java/org/jfree/chart/util/StringUtils.java +++ b/src/main/java/org/jfree/chart/util/StringUtils.java @@ -28,6 +28,8 @@ package org.jfree.chart.util; +/*>>> import org.checkerframework.checker.index.qual.*; */ + /** * String utilities. */ @@ -66,7 +68,10 @@ public static boolean endsWithIgnoreCase(String base, String end) { if (base.length() < end.length()) { return false; } - return base.regionMatches(true, base.length() - end.length(), end, 0, end.length()); + + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/154 + /*@NonNegative*/ int toffset = base.length() - end.length(); + return base.regionMatches(true, toffset, end, 0, end.length()); } /** diff --git a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java index ea7e1f5ae..4fb8b511b 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java @@ -115,6 +115,7 @@ public TimeSeriesTableModel(TimeSeries series, boolean editable) { * @return The column class in the table model. */ @Override + @SuppressWarnings("index") // AbstractTableModel needs index annotations public Class getColumnClass(/*@NonNegative*/ int column) { if (column == 0) { return String.class; @@ -137,6 +138,7 @@ public Class getColumnClass(/*@NonNegative*/ int column) { * @return The name of a column. */ @Override + @SuppressWarnings("index") // AbstractTableModel needs index annotations public String getColumnName(/*@NonNegative*/ int column) { if (column == 0) { @@ -172,6 +174,7 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The data value for a cell in the table model. */ @Override + @SuppressWarnings("index") // AbstractTableModel needs index annotations public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (row < this.series.getItemCount()) { @@ -212,6 +215,7 @@ public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) * @return {@code true} if the specified cell is editable. */ @Override + @SuppressWarnings("index") // AbstractTableModel needs index annotations public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (this.editable) { if ((column == 0) || (column == 1)) { @@ -234,6 +238,7 @@ public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int col * @param column the column. */ @Override + @SuppressWarnings("index") // AbstractTableModel needs index annotations public void setValueAt(Object value, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (row < this.series.getItemCount()) { diff --git a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java index 9b0755148..35d0c569d 100644 --- a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java +++ b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java @@ -132,6 +132,7 @@ public void setModel(TableXYDataset dataset) { * @return The column name. */ @Override + @SuppressWarnings("index") // AbstractTableModel needs index annotations public String getColumnName(/*@NonNegative*/ int column) { if (this.model == null) { return super.getColumnName(column); @@ -154,7 +155,7 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The value of the specified cell. */ @Override - @SuppressWarnings("upperbound") // row's relation to the model is dependent on the value of column + @SuppressWarnings("index") // AbstractTableModel needs index annotations public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (this.model == null) { return null; @@ -188,6 +189,7 @@ public void datasetChanged(DatasetChangeEvent event) { * @return {@code true} if the specified cell is editable. */ @Override + @SuppressWarnings("index") // AbstractTableModel needs index annotations public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return false; } @@ -200,6 +202,7 @@ public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int col * @param column the column. */ @Override + @SuppressWarnings("index") // AbstractTableModel needs index annotations public void setValueAt(Object value, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (isCellEditable(row, column)) { // XYDataset only provides methods for reading a dataset... From 8c5de6702b0e457fd31fb8d0dcb95d00a47495e5 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Wed, 3 Jan 2018 07:32:42 -0800 Subject: [PATCH 25/79] Ignore output files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 368a06635..b5ddcde64 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ jfreechart-*.zip lib/jfreechart-*-src.jar lib/jfreechart-*.jar +ant/check-index-output*.txt + # Eclipse files # /.classpath /.project From 8ae62089481d44fc9b9664362b602b7d45fc0b8f Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Fri, 5 Jan 2018 11:07:48 -0800 Subject: [PATCH 26/79] updates based on jdk changes --- ant/build.xml | 12 +++++++----- .../java/org/jfree/chart/axis/MonthDateFormat.java | 5 ++--- .../org/jfree/chart/axis/QuarterDateFormat.java | 2 +- src/main/java/org/jfree/chart/date/SerialDate.java | 13 +++++-------- src/main/java/org/jfree/chart/text/TextUtils.java | 10 +++++++--- .../java/org/jfree/chart/ui/NumberCellRenderer.java | 2 +- src/main/java/org/jfree/chart/util/PaintAlpha.java | 3 +-- src/main/java/org/jfree/data/time/Day.java | 2 +- src/main/java/org/jfree/data/time/Hour.java | 2 +- src/main/java/org/jfree/data/time/Millisecond.java | 2 +- src/main/java/org/jfree/data/time/Minute.java | 2 +- src/main/java/org/jfree/data/time/Month.java | 2 +- src/main/java/org/jfree/data/time/Quarter.java | 2 +- src/main/java/org/jfree/data/time/Second.java | 2 +- .../org/jfree/data/time/TimeSeriesTableModel.java | 5 ----- src/main/java/org/jfree/data/time/Week.java | 8 ++++---- src/main/java/org/jfree/data/time/Year.java | 2 +- .../java/org/jfree/data/xy/XYDatasetTableModel.java | 5 +---- 18 files changed, 37 insertions(+), 44 deletions(-) diff --git a/ant/build.xml b/ant/build.xml index e221094cd..c991ed76f 100644 --- a/ant/build.xml +++ b/ant/build.xml @@ -30,8 +30,8 @@ - - + + @@ -105,7 +105,7 @@ - + @@ -117,6 +117,8 @@ + + - - + diff --git a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java index 85ed41ed0..24b62aaa6 100644 --- a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java @@ -171,8 +171,7 @@ public MonthDateFormat(TimeZone zone, Locale locale, int chars, boolean /*@ArrayLen(13)*/ [] showYear, DateFormat yearFormatter) { Args.nullNotPermitted(locale, "locale"); DateFormatSymbols dfs = new DateFormatSymbols(locale); - @SuppressWarnings({"value", "index"}) // DateFormatSymbols needs annotations - String /*@ArrayLen(12)*/ [] monthsFromLocale = dfs.getMonths(); + String[] monthsFromLocale = dfs.getMonths(); this.months = new String[12]; for (int i = 0; i < 12; i++) { @SuppressWarnings({"index", "value"}) // https://github.com/typetools/checker-framework/issues/1669 @@ -208,7 +207,7 @@ public MonthDateFormat(TimeZone zone, Locale locale, int chars, public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { this.calendar.setTime(date); - @SuppressWarnings({"index", "value"}) // Calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation /*@IntRange(from=0, to=11)*/ int month = this.calendar.get(Calendar.MONTH); toAppendTo.append(this.months[month]); if (this.showYear[month]) { diff --git a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java index 79c34fcce..8b0958b59 100644 --- a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java @@ -159,7 +159,7 @@ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { this.calendar.setTime(date); int year = this.calendar.get(Calendar.YEAR); - @SuppressWarnings({"index", "value"}) // Calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation /*@IntRange(from=0, to=11)*/ int month = this.calendar.get(Calendar.MONTH); int quarter = month / 3; if (this.quarterFirst) { diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index 3023fe101..575fd52f4 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -225,7 +225,7 @@ public static int stringToWeekdayCode(String s) { final String[] shortWeekdayNames = DATE_FORMAT_SYMBOLS.getShortWeekdays(); - @SuppressWarnings("index") // java.text.DateFormatSymbols needs index annotations + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/179 final String /*@SameLen("shortWeekdayNames")*/ [] weekDayNames = DATE_FORMAT_SYMBOLS.getWeekdays(); int result = -1; @@ -254,7 +254,6 @@ public static int stringToWeekdayCode(String s) { * @return a string representing the supplied day-of-the-week. */ public static String weekdayCodeToString(/*@IntRange(from=0, to=7)*/ int weekday) { - @SuppressWarnings({"index", "value"}) // java.text.DateFormatSymbols needs index annotations final String /*@ArrayLen(8)*/ [] weekdays = DATE_FORMAT_SYMBOLS.getWeekdays(); return weekdays[weekday]; } @@ -382,13 +381,11 @@ public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month, b final String /*@ArrayLen(13)*/ [] months; if (shortened) { - @SuppressWarnings({"index", "value"}) // java.text.DateFormatSymbols needs index annotations - final String /*@ArrayLen(13)*/ [] monthsTmp = DATE_FORMAT_SYMBOLS.getShortMonths(); + final String[] monthsTmp = DATE_FORMAT_SYMBOLS.getShortMonths(); months = monthsTmp; } else { - @SuppressWarnings({"index", "value"}) // java.text.DateFormatSymbols needs index annotations - final String /*@ArrayLen(13)*/ [] monthsTmp = DATE_FORMAT_SYMBOLS.getMonths(); + final String[] monthsTmp = DATE_FORMAT_SYMBOLS.getMonths(); months = monthsTmp; } @@ -558,7 +555,7 @@ public static SerialDate addDays(int days, SerialDate base) { * * @return a new date. */ - @SuppressWarnings({"index", "value"}) // I believe there is an error in this function. TODO: Update this note to explain the error + @SuppressWarnings({"index", "value"}) // True positive, fixed upstream public static SerialDate addMonths(int months, SerialDate base) { int yy = (12 * base.getYYYY() + base.getMonth() + months - 1) / 12; int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1; @@ -771,7 +768,7 @@ public static SerialDate createInstance(/*@IntRange(from = 2, to = 2958465)*/ in * * @return a instance of SerialDate. */ - @SuppressWarnings({"index", "value"}) // Gregorian Calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public static SerialDate createInstance(java.util.Date date) { GregorianCalendar calendar = new GregorianCalendar(); diff --git a/src/main/java/org/jfree/chart/text/TextUtils.java b/src/main/java/org/jfree/chart/text/TextUtils.java index 1158c3600..440ad5816 100644 --- a/src/main/java/org/jfree/chart/text/TextUtils.java +++ b/src/main/java/org/jfree/chart/text/TextUtils.java @@ -218,7 +218,6 @@ public static TextBlock createTextBlock(String text, Font font, * * @return The index of the next line break. */ - @SuppressWarnings("index") // java.text.BreakIterator needs annotations private static /*@GTENegativeOne*/ int nextLineBreak(String text, /*@IndexOrHigh("#1")*/ int start, float width, BreakIterator iterator, TextMeasurer measurer) { @@ -233,14 +232,19 @@ public static TextBlock createTextBlock(String text, Font font, newline = Integer.MAX_VALUE; } while (((end = iterator.following(current)) != BreakIterator.DONE)) { - x += measurer.getStringWidth(text, current, end); + @SuppressWarnings("index") // an assumption of this method is that the BreakIterator is associated with text + float dx = measurer.getStringWidth(text, current, end); + x += dx; if (x > width) { if (firstWord) { - while (measurer.getStringWidth(text, start, end) > width) { + while (dx > width) { end--; if (end <= start) { return end; } + @SuppressWarnings("index") // an assumption of this method is that the BreakIterator is associated with text + float dxNew = measurer.getStringWidth(text, start, end); + dx = dxNew; } return end; } diff --git a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java index 6658017e7..9f129a842 100644 --- a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java +++ b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java @@ -64,7 +64,7 @@ public NumberCellRenderer() { * @return the component that can render the contents of the cell. */ @Override - @SuppressWarnings("index") // DefaultTableCellRenderer needs index annotations + // @SuppressWarnings("index") // DefaultTableCellRenderer needs index annotations public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { diff --git a/src/main/java/org/jfree/chart/util/PaintAlpha.java b/src/main/java/org/jfree/chart/util/PaintAlpha.java index 3df3a629f..918043fe7 100644 --- a/src/main/java/org/jfree/chart/util/PaintAlpha.java +++ b/src/main/java/org/jfree/chart/util/PaintAlpha.java @@ -287,8 +287,7 @@ private static TexturePaint darkerTexturePaint(TexturePaint paint) { pix = ras.getPixels(miX, y, wid, 1, pix); for (int p = 0; p < pix.length; p++) { - @SuppressWarnings({"index", "value"}) // needs annotations on java.awt.image.ColorModel - getComponents returns same length as the array passed in - int /*@ArrayLen(4)*/ [] nco2 = img.getColorModel().getComponents(pix[p], nco, 0); + nco = img.getColorModel().getComponents(pix[p], nco, 0); nco[0] *= FACTOR; // Red nco[1] *= FACTOR; // Green nco[2] *= FACTOR; // Blue. Now map computed colour to diff --git a/src/main/java/org/jfree/data/time/Day.java b/src/main/java/org/jfree/data/time/Day.java index c285e2147..86981967c 100644 --- a/src/main/java/org/jfree/data/time/Day.java +++ b/src/main/java/org/jfree/data/time/Day.java @@ -164,6 +164,7 @@ public Day(Date time) { * @param zone the time zone ({@code null} not permitted). * @param locale the locale ({@code null} not permitted). */ + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Day(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); @@ -173,7 +174,6 @@ public Day(Date time, TimeZone zone, Locale locale) { int d = calendar.get(Calendar.DAY_OF_MONTH); int m = calendar.get(Calendar.MONTH) + 1; int y = calendar.get(Calendar.YEAR); - @SuppressWarnings({"index", "value"}) // Calendar needs index annotations SerialDate tmpDate = SerialDate.createInstance(d, m, y); this.serialDate = tmpDate; peg(calendar); diff --git a/src/main/java/org/jfree/data/time/Hour.java b/src/main/java/org/jfree/data/time/Hour.java index 1ab4aa691..c8b63609f 100644 --- a/src/main/java/org/jfree/data/time/Hour.java +++ b/src/main/java/org/jfree/data/time/Hour.java @@ -156,7 +156,7 @@ public Hour(Date time) { * * @since 1.0.13 */ - @SuppressWarnings({"value", "index"}) // calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Hour(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); diff --git a/src/main/java/org/jfree/data/time/Millisecond.java b/src/main/java/org/jfree/data/time/Millisecond.java index d951b0f77..a1f7d8b33 100644 --- a/src/main/java/org/jfree/data/time/Millisecond.java +++ b/src/main/java/org/jfree/data/time/Millisecond.java @@ -162,7 +162,7 @@ public Millisecond(Date time) { * * @since 1.0.13 */ - @SuppressWarnings({"value", "index"}) // calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Millisecond(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/Minute.java b/src/main/java/org/jfree/data/time/Minute.java index c10e0ebab..cd024d260 100644 --- a/src/main/java/org/jfree/data/time/Minute.java +++ b/src/main/java/org/jfree/data/time/Minute.java @@ -148,7 +148,7 @@ public Minute(Date time) { * * @since 1.0.13 */ - @SuppressWarnings({"index", "value"}) // calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Minute(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); diff --git a/src/main/java/org/jfree/data/time/Month.java b/src/main/java/org/jfree/data/time/Month.java index 77d1e0f4a..a29a80d38 100644 --- a/src/main/java/org/jfree/data/time/Month.java +++ b/src/main/java/org/jfree/data/time/Month.java @@ -155,7 +155,7 @@ public Month(Date time) { * * @since 1.0.12 */ - @SuppressWarnings({"index", "value"}) // Calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Month(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index 3b04be401..72a1f8642 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -172,7 +172,7 @@ public Quarter(Date time) { * * @since 1.0.12 */ - @SuppressWarnings({"index", "value"}) // Calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Quarter(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/Second.java b/src/main/java/org/jfree/data/time/Second.java index 1ce299cd8..d435489e1 100644 --- a/src/main/java/org/jfree/data/time/Second.java +++ b/src/main/java/org/jfree/data/time/Second.java @@ -163,7 +163,7 @@ public Second(Date time) { * * @since 1.0.13 */ - @SuppressWarnings({"value", "index"}) // calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Second(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java index 4fb8b511b..ea7e1f5ae 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java @@ -115,7 +115,6 @@ public TimeSeriesTableModel(TimeSeries series, boolean editable) { * @return The column class in the table model. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations public Class getColumnClass(/*@NonNegative*/ int column) { if (column == 0) { return String.class; @@ -138,7 +137,6 @@ public Class getColumnClass(/*@NonNegative*/ int column) { * @return The name of a column. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations public String getColumnName(/*@NonNegative*/ int column) { if (column == 0) { @@ -174,7 +172,6 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The data value for a cell in the table model. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (row < this.series.getItemCount()) { @@ -215,7 +212,6 @@ public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) * @return {@code true} if the specified cell is editable. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (this.editable) { if ((column == 0) || (column == 1)) { @@ -238,7 +234,6 @@ public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int col * @param column the column. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations public void setValueAt(Object value, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (row < this.series.getItemCount()) { diff --git a/src/main/java/org/jfree/data/time/Week.java b/src/main/java/org/jfree/data/time/Week.java index dfeae8597..793912032 100644 --- a/src/main/java/org/jfree/data/time/Week.java +++ b/src/main/java/org/jfree/data/time/Week.java @@ -180,7 +180,7 @@ public Week(Date time) { * * @since 1.0.7 */ - @SuppressWarnings({"index", "value"}) // Calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Week(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); @@ -303,8 +303,8 @@ public RegularTimePeriod previous() { int yy = this.year - 1; Calendar prevYearCalendar = Calendar.getInstance(); prevYearCalendar.set(yy, Calendar.DECEMBER, 31); - @SuppressWarnings({"index", "value"}) // Calendar.WEEKOFYEAR needs an annotation - Week resultTmp = new Week(prevYearCalendar.getActualMaximum( + @SuppressWarnings({"index", "value"}) // calendar.getActualMaximum is a combined getter for various calendar fields, and therefore has no sensical annotation + Week resultTmp = new Week(prevYearCalendar.getActualMaximum( Calendar.WEEK_OF_YEAR), yy); result = resultTmp; } @@ -335,7 +335,7 @@ public RegularTimePeriod next() { else { Calendar calendar = Calendar.getInstance(); calendar.set(this.year, Calendar.DECEMBER, 31); - @SuppressWarnings({"index", "value"}) // Calendar.WEEKOFYEAR needs an annotation + @SuppressWarnings({"index", "value"}) // calendar.getActualMaximum is a combined getter for various calendar fields, and therefore has no sensical annotation /*@IntRange(from = 52, to = 53)*/ int actualMaxWeek = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); if (this.week < actualMaxWeek) { diff --git a/src/main/java/org/jfree/data/time/Year.java b/src/main/java/org/jfree/data/time/Year.java index a255ef0d8..8ec35dfcc 100644 --- a/src/main/java/org/jfree/data/time/Year.java +++ b/src/main/java/org/jfree/data/time/Year.java @@ -144,7 +144,7 @@ public Year(Date time) { * * @since 1.0.12 */ - @SuppressWarnings({"index", "value"}) // Calendar needs index annotations + @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Year(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java index 35d0c569d..dc76410df 100644 --- a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java +++ b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java @@ -132,7 +132,6 @@ public void setModel(TableXYDataset dataset) { * @return The column name. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations public String getColumnName(/*@NonNegative*/ int column) { if (this.model == null) { return super.getColumnName(column); @@ -155,7 +154,7 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The value of the specified cell. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations + @SuppressWarnings("index") // this method relies on row being an index into a particular data series in the underlying dataset. The annotations can't neatly express that fact (not all implementations of this interface would even have an underlying dataset...), so I'm not sure how I'd verify this. public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (this.model == null) { return null; @@ -189,7 +188,6 @@ public void datasetChanged(DatasetChangeEvent event) { * @return {@code true} if the specified cell is editable. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { return false; } @@ -202,7 +200,6 @@ public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int col * @param column the column. */ @Override - @SuppressWarnings("index") // AbstractTableModel needs index annotations public void setValueAt(Object value, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (isCellEditable(row, column)) { // XYDataset only provides methods for reading a dataset... From b5947d390a9f028a62278c0c29972636ade00632 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Thu, 11 Jan 2018 16:50:17 -0800 Subject: [PATCH 27/79] change comments --- src/main/java/org/jfree/chart/date/SerialDate.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index 575fd52f4..20612dd12 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -555,7 +555,7 @@ public static SerialDate addDays(int days, SerialDate base) { * * @return a new date. */ - @SuppressWarnings({"index", "value"}) // True positive, fixed upstream + @SuppressWarnings({"index", "value"}) // True positive, fixed upstream BUG public static SerialDate addMonths(int months, SerialDate base) { int yy = (12 * base.getYYYY() + base.getMonth() + months - 1) / 12; int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1; @@ -575,7 +575,7 @@ public static SerialDate addMonths(int months, SerialDate base) { * * @return A new date. */ - @SuppressWarnings({"index", "value"}) // I believe there is an error in this function. TODO: Update this note to explain the error + @SuppressWarnings({"index", "value"}) // True positive, fixed upstream BUG public static SerialDate addYears(int years, SerialDate base) { int baseY = base.getYYYY(); int baseM = base.getMonth(); From 47c9284b25f770624455538b02758117bd9f98bd Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Fri, 12 Jan 2018 11:16:12 -0800 Subject: [PATCH 28/79] update messages to clarify what is and is not a bug --- src/main/java/org/jfree/chart/date/SerialDate.java | 4 ++-- src/main/java/org/jfree/chart/plot/CompassPlot.java | 2 +- .../jfree/chart/renderer/category/AreaRenderer.java | 2 +- .../jfree/chart/renderer/category/BarRenderer.java | 2 +- .../jfree/chart/renderer/category/GanttRenderer.java | 4 ++-- .../jfree/chart/renderer/category/LevelRenderer.java | 2 +- .../renderer/category/LineAndShapeRenderer.java | 2 +- .../chart/renderer/xy/StackedXYAreaRenderer.java | 6 +++--- .../chart/renderer/xy/StandardXYItemRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/XYAreaRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/XYAreaRenderer2.java | 2 +- .../org/jfree/chart/renderer/xy/XYBlockRenderer.java | 2 +- .../chart/renderer/xy/XYBoxAndWhiskerRenderer.java | 4 ++-- .../jfree/chart/renderer/xy/XYBubbleRenderer.java | 8 ++++---- .../chart/renderer/xy/XYDifferenceRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/XYDotRenderer.java | 8 +++----- .../org/jfree/chart/renderer/xy/XYErrorRenderer.java | 6 +++--- .../chart/renderer/xy/XYLineAndShapeRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/XYShapeRenderer.java | 2 +- .../jfree/chart/renderer/xy/XYStepAreaRenderer.java | 6 +++--- .../org/jfree/chart/renderer/xy/XYStepRenderer.java | 2 +- .../jfree/chart/renderer/xy/YIntervalRenderer.java | 6 +++--- src/main/java/org/jfree/chart/ui/LCBLayout.java | 6 +++--- .../java/org/jfree/data/general/DatasetUtils.java | 12 ++++++------ src/main/java/org/jfree/data/time/TimeSeries.java | 2 +- src/main/java/org/jfree/data/xy/TableXYDataset.java | 2 +- src/main/java/org/jfree/data/xy/XYSeries.java | 2 +- 27 files changed, 50 insertions(+), 52 deletions(-) diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index 20612dd12..30322aa93 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -555,7 +555,7 @@ public static SerialDate addDays(int days, SerialDate base) { * * @return a new date. */ - @SuppressWarnings({"index", "value"}) // True positive, fixed upstream BUG + @SuppressWarnings({"index", "value"}) // True positive, fixed upstream bug public static SerialDate addMonths(int months, SerialDate base) { int yy = (12 * base.getYYYY() + base.getMonth() + months - 1) / 12; int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1; @@ -575,7 +575,7 @@ public static SerialDate addMonths(int months, SerialDate base) { * * @return A new date. */ - @SuppressWarnings({"index", "value"}) // True positive, fixed upstream BUG + @SuppressWarnings({"index", "value"}) // True positive, fixed upstream bug public static SerialDate addYears(int years, SerialDate base) { int baseY = base.getYYYY(); int baseM = base.getMonth(); diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 6a27da84a..95472662a 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -453,7 +453,7 @@ public void setSeriesNeedle(/*@NonNegative*/ int index, int type) { case 0: setSeriesNeedle(index, new ArrowNeedle(true)); setSeriesPaint(index, Color.RED); - @SuppressWarnings("index") // I believe this is a bug TODO: explain why and/or verify this + @SuppressWarnings("index") // documentation says this is okay MeterNeedle seriesNeedOfIndex = this.seriesNeedle[index]; seriesNeedOfIndex.setHighlightPaint(Color.WHITE); break; diff --git a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java index 9542c41e4..fd402cd08 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java @@ -324,7 +324,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { } // submit the current data point as a crosshair candidate - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), yy1, diff --git a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java index 633570c11..ac36ef620 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java @@ -1085,7 +1085,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, } // submit the current data point as a crosshair candidate - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), value, diff --git a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java index 0bc074df1..ad8c24892 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java @@ -384,7 +384,7 @@ else if (orientation == PlotOrientation.VERTICAL) { if (subinterval == count - 1) { // submit the current data point as a crosshair candidate - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); Comparable columnKey = dataset.getColumnKey(column); Comparable rowKey = dataset.getRowKey(row); @@ -535,7 +535,7 @@ else if (plot.getOrientation() == PlotOrientation.VERTICAL) { } // submit the current data point as a crosshair candidate - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); Comparable columnKey = dataset.getColumnKey(column); Comparable rowKey = dataset.getRowKey(row); diff --git a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java index 123e4c48d..827070161 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java @@ -363,7 +363,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, } // submit the current data point as a crosshair candidate - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), value, diff --git a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java index c8ef1d843..caaacad47 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java @@ -836,7 +836,7 @@ else if (orientation == PlotOrientation.VERTICAL) { } // submit the current data point as a crosshair candidate - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java index d1544614f..6b3b4f969 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java @@ -70,8 +70,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -537,7 +537,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { } } - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, ph1 + y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index 28d14d0e4..50f1b4a78 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -919,7 +919,7 @@ else if (orientation == PlotOrientation.VERTICAL) { (y1 < 0.0)); } - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index d22128335..6690a5562 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -654,7 +654,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } } - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java index 328a0e190..f261c92bc 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java @@ -379,7 +379,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, g2.draw(hotspot); } - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 0e0074a34..9ce35a5b1 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -395,7 +395,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, block.getCenterX(), block.getCenterY(), y < 0.0); } - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); double transX = domainAxis.valueToJava2D(x, dataArea, plot.getDomainAxisEdge()); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index 6ae5e10cf..97c6c84a8 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -391,7 +391,7 @@ public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 /*@IndexFor("boxAndWhiskerData.getSeries(series)")*/ int boxAndWhiskerItem = item; Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); @@ -534,7 +534,7 @@ public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 /*@IndexFor("boxAndWhiskerData.getSeries(series)")*/ int boxAndWhiskerItem = item; Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index 74338b9f6..875acff9f 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -63,8 +63,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -197,7 +197,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (dataset instanceof XYZDataset) { XYZDataset xyzData = (XYZDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 /*@IndexFor("xyzData.getSeries(series)")*/ int xyzItem = item; z = xyzData.getZValue(series, xyzItem); } @@ -278,7 +278,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { } } - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index cbc48577a..2c454fa1e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -960,7 +960,7 @@ protected void drawItemPass1(Graphics2D x_graphics, x_item, l_x1, l_y1, (l_y1 < 0.0)); } - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = x_plot.indexOf(x_dataset); updateCrosshairValues(x_crosshairState, l_x0, l_y0, datasetIndex, l_x1, l_y1, l_orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java index 57c8d81ab..8d6436392 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java @@ -54,8 +54,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -265,9 +265,7 @@ else if (orientation == PlotOrientation.VERTICAL) { this.dotHeight); } - @SuppressWarnings("index") // TODO: I think this is a bug. This can flow to CategoryPlot#draw, where it would - // fail an assert. There is nothing in this method relating the plot to the dataset, and the method - // is public. + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java index 0db25aff9..5c17eda28 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java @@ -42,8 +42,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -313,7 +313,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, && getItemVisible(series, item)) { IntervalXYDataset ixyd = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 /*@IndexFor("ixyd.getSeries(series)")*/ int ixydItem = item; PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index d8588aa39..e8618dcb0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -1030,7 +1030,7 @@ else if (orientation == PlotOrientation.VERTICAL) { (y1 < 0.0)); } - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index a3d369608..45395430d 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -495,7 +495,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, g2.draw(shape); } } - @SuppressWarnings("index") // TODO: I think this is a bug. See XYDotRenderer#drawItem - this is the same problem + @SuppressWarnings("index") documentation bug: dataset is assumed to be associated with plot See XYDotRenderer#drawItem - this is the same problem /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java index 9b378802a..b71d12876 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java @@ -57,8 +57,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.awt.Graphics2D; @@ -560,7 +560,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { // do we need to update the crosshair values? if (!Double.isNaN(y1)) { - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java index 82e4d8d09..fab5e634b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java @@ -276,7 +276,7 @@ else if (orientation == PlotOrientation.VERTICAL) { } // submit this data item as a candidate for the crosshair point - @SuppressWarnings("index") // dataset is assumed to be associated with plot. Is there any guarantee that they are associated? I'm not sure. Maybe a bug? + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index 45bcd9d8b..60fe1ee58 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -49,8 +49,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -197,7 +197,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/? FIXME + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalItem = item; double x = intervalDataset.getXValue(series, intervalItem); diff --git a/src/main/java/org/jfree/chart/ui/LCBLayout.java b/src/main/java/org/jfree/chart/ui/LCBLayout.java index 18454ed0f..3eaea8237 100644 --- a/src/main/java/org/jfree/chart/ui/LCBLayout.java +++ b/src/main/java/org/jfree/chart/ui/LCBLayout.java @@ -91,7 +91,7 @@ public Dimension preferredLayoutSize(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); - @SuppressWarnings("index") // (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash. I believe this is by design, but it's not good code. + @SuppressWarnings("index") // documentation bug: (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash, and that should be documented, or this will crash. I believe this is by design, but it's not good code. /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { @@ -133,7 +133,7 @@ public Dimension minimumLayoutSize(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); - @SuppressWarnings("index") // (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash. I believe this is by design, but it's not good code. + @SuppressWarnings("index") // documentation bug: (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash, and that should be documented, or this will crash. I believe this is by design, but it's not good code. /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { @@ -173,7 +173,7 @@ public void layoutContainer(Container parent) { synchronized (parent.getTreeLock()) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); - @SuppressWarnings("index") // (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash. I believe this is by design, but it's not good code. + @SuppressWarnings("index") // documentation bug: (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash, and that should be documented, or this will crash. I believe this is by design, but it's not good code. /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 133684e2d..88dc4d8be 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -1640,7 +1640,7 @@ public static Number findMinimumDomainValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // intervalXyData and dataset are the same object + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 double valueTmp = intervalXYData.getStartXValue(series, item); value = valueTmp; } @@ -1697,7 +1697,7 @@ public static Number findMaximumDomainValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // intervalXyData and dataset are the same object + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 double valueTmp = intervalXYData.getEndXValue(series, item); value = valueTmp; } @@ -1806,13 +1806,13 @@ public static Number findMinimumRangeValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // intervalXyData and dataset are the same object + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 double valueTmp = intervalXYData.getStartYValue(series, item); value = valueTmp; } else if (dataset instanceof OHLCDataset) { OHLCDataset highLowData = (OHLCDataset) dataset; - @SuppressWarnings("index") // highlowdata and dataset are the same object + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 double valueTmp = highLowData.getLowValue(series, item); value = valueTmp; } @@ -1923,13 +1923,13 @@ public static Number findMaximumRangeValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // intervalXyData and dataset are the same object + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 double valueTmp = intervalXYData.getEndYValue(series, item); value = valueTmp; } else if (dataset instanceof OHLCDataset) { OHLCDataset highLowData = (OHLCDataset) dataset; - @SuppressWarnings("index") // highlowdata and dataset are the same object + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 double valueTmp = highLowData.getHighValue(series, item); value = valueTmp; } diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index c7d13fde3..9cde4e149 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -561,7 +561,7 @@ public RegularTimePeriod getTimePeriod(/*@NonNegative*/ int index) { * @return The next time period. */ public RegularTimePeriod getNextTimePeriod() { - @SuppressWarnings("index") // I believe this is a bug TODO: patch + @SuppressWarnings("index") // bug: requires there to be at least one time period, but documentation doesn't state it RegularTimePeriod last = getTimePeriod(getItemCount() - 1); return last.next(); } diff --git a/src/main/java/org/jfree/data/xy/TableXYDataset.java b/src/main/java/org/jfree/data/xy/TableXYDataset.java index d6998b954..644820658 100644 --- a/src/main/java/org/jfree/data/xy/TableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/TableXYDataset.java @@ -51,7 +51,7 @@ * x-values between series). This is used primarily by the * {@link org.jfree.chart.renderer.xy.StackedXYAreaRenderer}. */ -@SuppressWarnings("index") // TODO: I think this may be a documentation bug. The annotation on getItemCount below is correct, I believe, but it's inconsistent with the documentation on this interface. +@SuppressWarnings("index") // I think this is a documentation bug. The annotation on getItemCount below is correct, I believe, but it's inconsistent with the documentation on this interface. public interface TableXYDataset extends XYDataset { /** diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index 19ebed0df..91cda9202 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -267,7 +267,7 @@ private void updateBoundsForAddedItem(XYDataItem item) { * * @since 1.0.13 */ - @SuppressWarnings("index") // this method is clearly assuming that item is not the last item in the series. TODO: I believe this is a bug + @SuppressWarnings("index") // documentation bug: this method cannot be called unless there is at least one more item beyond the parameter in this dataset: I believe this is a bug private void updateBoundsForRemovedItem(XYDataItem item) { boolean itemContributesToXBounds = false; boolean itemContributesToYBounds = false; From 8045aa5f4fab9d978f4b9e5953334590b32dfa4b Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sat, 13 Jan 2018 15:15:55 -0800 Subject: [PATCH 29/79] fix changes introduced b/c of jdk changes --- .../java/org/jfree/chart/axis/DateAxis.java | 6 +++++- .../org/jfree/chart/axis/DateTickUnit.java | 19 ++++++++++--------- .../jfree/chart/axis/DateTickUnitType.java | 7 ++++--- .../java/org/jfree/chart/axis/SymbolAxis.java | 1 + .../java/org/jfree/chart/axis/TickUnits.java | 5 ++++- .../jfree/chart/block/GridArrangement.java | 7 ++++--- .../java/org/jfree/chart/plot/PiePlot.java | 4 ++-- .../java/org/jfree/chart/plot/XYPlot.java | 18 +++++++++++++----- .../jfree/chart/renderer/RendererUtils.java | 12 ++++++------ .../chart/renderer/xy/XYShapeRenderer.java | 2 +- src/main/java/org/jfree/data/time/Month.java | 4 ++-- .../java/org/jfree/data/time/Quarter.java | 8 +++++--- src/main/java/org/jfree/data/time/Week.java | 4 ++-- src/main/java/org/jfree/data/time/Year.java | 5 ++++- 14 files changed, 63 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/jfree/chart/axis/DateAxis.java b/src/main/java/org/jfree/chart/axis/DateAxis.java index eeafdd4d6..778a31fd7 100644 --- a/src/main/java/org/jfree/chart/axis/DateAxis.java +++ b/src/main/java/org/jfree/chart/axis/DateAxis.java @@ -138,6 +138,8 @@ package org.jfree.chart.axis; +/*>>> import org.checkerframework.checker.index.qual.*; */ + import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; @@ -1005,7 +1007,9 @@ else if (this.tickMarkPosition == DateTickMarkPosition.MIDDLE) { return d2; } else if (DateTickUnitType.MONTH.equals(unit.getUnitType())) { - value = count * ((current + 1) / count) - 1; + @SuppressWarnings("index") // if this is a month, then current >= 1, so the below is safe + /*@NonNegative*/ int valueTmp = count * ((current + 1) / count) - 1; + value = valueTmp; years = calendar.get(Calendar.YEAR); calendar.clear(Calendar.MILLISECOND); calendar.set(years, value, 1, 0, 0, 0); diff --git a/src/main/java/org/jfree/chart/axis/DateTickUnit.java b/src/main/java/org/jfree/chart/axis/DateTickUnit.java index 3c9e671c3..be13d8984 100644 --- a/src/main/java/org/jfree/chart/axis/DateTickUnit.java +++ b/src/main/java/org/jfree/chart/axis/DateTickUnit.java @@ -55,6 +55,7 @@ */ package org.jfree.chart.axis; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.text.DateFormat; @@ -81,7 +82,7 @@ public class DateTickUnit extends TickUnit implements Serializable { private DateTickUnitType unitType; /** The unit count. */ - private int count; + private /*@Positive*/ int count; /** * The roll unit type. @@ -91,7 +92,7 @@ public class DateTickUnit extends TickUnit implements Serializable { private DateTickUnitType rollUnitType; /** The roll count. */ - private int rollCount; + private /*@Positive*/ int rollCount; /** The date formatter. */ private DateFormat formatter; @@ -104,7 +105,7 @@ public class DateTickUnit extends TickUnit implements Serializable { * * @since 1.0.13 */ - public DateTickUnit(DateTickUnitType unitType, int multiple) { + public DateTickUnit(DateTickUnitType unitType, /*@Positive*/ int multiple) { this(unitType, multiple, DateFormat.getDateInstance(DateFormat.SHORT)); } @@ -117,7 +118,7 @@ public DateTickUnit(DateTickUnitType unitType, int multiple) { * * @since 1.0.13 */ - public DateTickUnit(DateTickUnitType unitType, int multiple, + public DateTickUnit(DateTickUnitType unitType, /*@Positive*/ int multiple, DateFormat formatter) { this(unitType, multiple, unitType, multiple, formatter); } @@ -133,8 +134,8 @@ public DateTickUnit(DateTickUnitType unitType, int multiple, * * @since 1.0.13 */ - public DateTickUnit(DateTickUnitType unitType, int multiple, - DateTickUnitType rollUnitType, int rollMultiple, + public DateTickUnit(DateTickUnitType unitType, /*@Positive*/ int multiple, + DateTickUnitType rollUnitType, /*@Positive*/ int rollMultiple, DateFormat formatter) { super(DateTickUnit.getMillisecondCount(unitType, multiple)); Args.nullNotPermitted(formatter, "formatter"); @@ -167,7 +168,7 @@ public DateTickUnitType getUnitType() { * * @return The unit multiple (always > 0). */ - public int getMultiple() { + public /*@Positive*/ int getMultiple() { return this.count; } @@ -189,7 +190,7 @@ public DateTickUnitType getRollUnitType() { * * @since 1.0.13 */ - public int getRollMultiple() { + public /*@Positive*/ int getRollMultiple() { return this.rollCount; } @@ -279,7 +280,7 @@ public Date rollDate(Date base, TimeZone zone) { * * @return The field code. */ - public int getCalendarField() { + public /*@NonNegative*/ int getCalendarField() { return this.unitType.getCalendarField(); } diff --git a/src/main/java/org/jfree/chart/axis/DateTickUnitType.java b/src/main/java/org/jfree/chart/axis/DateTickUnitType.java index 794055f2d..deaef5f59 100644 --- a/src/main/java/org/jfree/chart/axis/DateTickUnitType.java +++ b/src/main/java/org/jfree/chart/axis/DateTickUnitType.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.axis; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.ObjectStreamException; import java.io.Serializable; @@ -86,7 +87,7 @@ public class DateTickUnitType implements Serializable { private String name; /** The corresponding field value in Java's Calendar class. */ - private int calendarField; + private /*@NonNegative*/ int calendarField; /** * Private constructor. @@ -94,7 +95,7 @@ public class DateTickUnitType implements Serializable { * @param name the name. * @param calendarField the calendar field. */ - private DateTickUnitType(String name, int calendarField) { + private DateTickUnitType(String name, /*@NonNegative*/ int calendarField) { this.name = name; this.calendarField = calendarField; } @@ -104,7 +105,7 @@ private DateTickUnitType(String name, int calendarField) { * * @return The calendar field. */ - public int getCalendarField() { + public /*@NonNegative*/ int getCalendarField() { return this.calendarField; } diff --git a/src/main/java/org/jfree/chart/axis/SymbolAxis.java b/src/main/java/org/jfree/chart/axis/SymbolAxis.java index d2a4d3b52..b2ac04d29 100644 --- a/src/main/java/org/jfree/chart/axis/SymbolAxis.java +++ b/src/main/java/org/jfree/chart/axis/SymbolAxis.java @@ -724,6 +724,7 @@ protected List refreshTicksVertical(Graphics2D g2, Rectangle2D dataArea, * * @return The symbol. */ + @SuppressWarnings("index") // this method intentionally throws and catches an indexoutofboundsexception public String valueToString(double value) { String strToReturn; try { diff --git a/src/main/java/org/jfree/chart/axis/TickUnits.java b/src/main/java/org/jfree/chart/axis/TickUnits.java index 727705ee3..f23e91518 100644 --- a/src/main/java/org/jfree/chart/axis/TickUnits.java +++ b/src/main/java/org/jfree/chart/axis/TickUnits.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.axis; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.text.NumberFormat; @@ -114,7 +115,7 @@ public int size() { * * @return The tickunit. */ - public TickUnit get(int pos) { + public TickUnit get(/*@NonNegative*/ int pos) { return (TickUnit) this.tickUnits.get(pos); } @@ -126,6 +127,7 @@ public TickUnit get(int pos) { * @return A tick unit that is larger than the supplied unit. */ @Override + @SuppressWarnings("index") // binarySearch on list public TickUnit getLargerTickUnit(TickUnit unit) { int index = Collections.binarySearch(this.tickUnits, unit); if (index >= 0) { @@ -148,6 +150,7 @@ public TickUnit getLargerTickUnit(TickUnit unit) { * @return A unit from the collection. */ @Override + @SuppressWarnings("index") // binarySearch on list public TickUnit getCeilingTickUnit(TickUnit unit) { int index = Collections.binarySearch(this.tickUnits, unit); if (index >= 0) { diff --git a/src/main/java/org/jfree/chart/block/GridArrangement.java b/src/main/java/org/jfree/chart/block/GridArrangement.java index 64e5279f5..e488fc38d 100644 --- a/src/main/java/org/jfree/chart/block/GridArrangement.java +++ b/src/main/java/org/jfree/chart/block/GridArrangement.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.block; +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -58,10 +59,10 @@ public class GridArrangement implements Arrangement, Serializable { private static final long serialVersionUID = -2563758090144655938L; /** The rows. */ - private int rows; + private /*@NonNegative*/ int rows; /** The columns. */ - private int columns; + private /*@NonNegative*/ int columns; /** * Creates a new grid arrangement. @@ -69,7 +70,7 @@ public class GridArrangement implements Arrangement, Serializable { * @param rows the row count. * @param columns the column count. */ - public GridArrangement(int rows, int columns) { + public GridArrangement(/*@NonNegative*/ int rows, /*@NonNegative*/ int columns) { this.rows = rows; this.columns = columns; } diff --git a/src/main/java/org/jfree/chart/plot/PiePlot.java b/src/main/java/org/jfree/chart/plot/PiePlot.java index e9a6ffa07..136907ae4 100644 --- a/src/main/java/org/jfree/chart/plot/PiePlot.java +++ b/src/main/java/org/jfree/chart/plot/PiePlot.java @@ -303,7 +303,7 @@ public class PiePlot extends Plot implements Cloneable, Serializable { private PieDataset dataset; /** The pie index (used by the {@link MultiplePiePlot} class). */ - private int pieIndex; + private /*@NonNegative*/ int pieIndex; /** * The amount of space left around the outside of the pie plot, expressed @@ -662,7 +662,7 @@ public void setDataset(PieDataset dataset) { * * @see #setPieIndex(int) */ - public int getPieIndex() { + public /*@NonNegative*/ int getPieIndex() { return this.pieIndex; } diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 1235784d8..af49d5d9b 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -3771,13 +3771,15 @@ public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int continue; } if (state.getProcessVisibleItemsOnly()) { - int[] itemBounds = RendererUtils.findLiveItems( + /*@NonNegative*/ int[] itemBounds = RendererUtils.findLiveItems( dataset, series, xAxis.getLowerBound(), xAxis.getUpperBound()); firstItem = Math.max(itemBounds[0] - 1, 0); lastItem = Math.min(itemBounds[1] + 1, lastItem); } - state.startSeriesPass(dataset, series, firstItem, + @SuppressWarnings("index") // if 0 weren't a valid index, then this loop iteration is skipped above + /*@IndexFor("dataset.getSeries(series)")*/ int firstItemTmp = firstItem; + state.startSeriesPass(dataset, series, firstItemTmp, lastItem, pass, passCount); for (int item = firstItem; item <= lastItem; item++) { renderer.drawItem(g2, state, dataArea, info, @@ -3797,14 +3799,20 @@ public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int int firstItem = 0; int lastItem = dataset.getItemCount(series) - 1; if (state.getProcessVisibleItemsOnly()) { - int[] itemBounds = RendererUtils.findLiveItems( + /*@NonNegative*/ int[] itemBounds = RendererUtils.findLiveItems( dataset, series, xAxis.getLowerBound(), xAxis.getUpperBound()); firstItem = Math.max(itemBounds[0] - 1, 0); lastItem = Math.min(itemBounds[1] + 1, lastItem); } - state.startSeriesPass(dataset, series, firstItem, - lastItem, pass, passCount); + @SuppressWarnings("index") // if 0 weren't a valid index, then this loop iteration is skipped above + /*@IndexFor("dataset.getSeries(series)")*/ int firstItemTmp = firstItem; + + @SuppressWarnings("index") // I think this is a bug, as lastItem is checked in the parallel code above to not be -1, but that check is elided here. + /*@NonNegative*/ int lastItemTmp = lastItem; + + state.startSeriesPass(dataset, series, firstItemTmp, + lastItemTmp, pass, passCount); for (int item = firstItem; item <= lastItem; item++) { renderer.drawItem(g2, state, dataArea, info, this, xAxis, yAxis, dataset, series, item, diff --git a/src/main/java/org/jfree/chart/renderer/RendererUtils.java b/src/main/java/org/jfree/chart/renderer/RendererUtils.java index ee3bc3651..999147126 100644 --- a/src/main/java/org/jfree/chart/renderer/RendererUtils.java +++ b/src/main/java/org/jfree/chart/renderer/RendererUtils.java @@ -74,7 +74,7 @@ public class RendererUtils { * * @see #findLiveItemsUpperBound(XYDataset, int, double, double) */ - public static int findLiveItemsLowerBound(XYDataset dataset, /*@NonNegative*/ int series, + public static /*@NonNegative*/ int findLiveItemsLowerBound(XYDataset dataset, /*@NonNegative*/ int series, double xLow, double xHigh) { Args.nullNotPermitted(dataset, "dataset"); if (xLow >= xHigh) { @@ -174,7 +174,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { * * @see #findLiveItemsLowerBound(XYDataset, int, double, double) */ - public static int findLiveItemsUpperBound(XYDataset dataset, /*@NonNegative*/ int series, + public static /*@NonNegative*/ int findLiveItemsUpperBound(XYDataset dataset, /*@NonNegative*/ int series, double xLow, double xHigh) { Args.nullNotPermitted(dataset, "dataset"); if (xLow >= xHigh) { @@ -267,17 +267,17 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { * * @return The indices of the boundary items. */ - public static int /*@ArrayLen(2)*/ [] findLiveItems(XYDataset dataset, /*@NonNegative*/ int series, + public static /*@NonNegative*/ int /*@ArrayLen(2)*/ [] findLiveItems(XYDataset dataset, /*@NonNegative*/ int series, double xLow, double xHigh) { // here we could probably be a little faster by searching for both // indices simultaneously, but I'll look at that later if it seems // like it matters... - int i0 = findLiveItemsLowerBound(dataset, series, xLow, xHigh); - int i1 = findLiveItemsUpperBound(dataset, series, xLow, xHigh); + /*@NonNegative*/ int i0 = findLiveItemsLowerBound(dataset, series, xLow, xHigh); + /*@NonNegative*/ int i1 = findLiveItemsUpperBound(dataset, series, xLow, xHigh); if (i0 > i1) { i0 = i1; } - return new int[] {i0, i1}; + return new /*@NonNegative*/ int[] {i0, i1}; } } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 45395430d..2a241cb37 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -495,7 +495,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, g2.draw(shape); } } - @SuppressWarnings("index") documentation bug: dataset is assumed to be associated with plot See XYDotRenderer#drawItem - this is the same problem + @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot See XYDotRenderer#drawItem - this is the same problem /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); diff --git a/src/main/java/org/jfree/data/time/Month.java b/src/main/java/org/jfree/data/time/Month.java index a29a80d38..5c64f8a1b 100644 --- a/src/main/java/org/jfree/data/time/Month.java +++ b/src/main/java/org/jfree/data/time/Month.java @@ -88,7 +88,7 @@ public class Month extends RegularTimePeriod implements Serializable { private /*@IntRange(from = 1, to = 12)*/ int month; /** The year in which the month falls. */ - private /*@IntRange(from = -9999, to = 9999)*/ int year; + private /*@IntRange(from = 0, to = 9999)*/ int year; /** The first millisecond. */ private long firstMillisecond; @@ -109,7 +109,7 @@ public Month() { * @param month the month (in the range 1 to 12). * @param year the year. */ - public Month(/*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = -9999, to = 9999)*/ int year) { + public Month(/*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 0, to = 9999)*/ int year) { if ((month < 1) || (month > 12)) { throw new IllegalArgumentException("Month outside valid range."); } diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index 72a1f8642..97b444ab5 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -63,6 +63,7 @@ /*>>> import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; @@ -102,7 +103,7 @@ public class Quarter extends RegularTimePeriod implements Serializable { }; /** The year in which the quarter falls. */ - /*@IntRange(from = -9999, to = 9999)*/ private short year; + /*@IntRange(from = 0, to = 9999)*/ private short year; /** The quarter (1-4). */ private /*@IntVal({1,2,3,4})*/ byte quarter; @@ -126,7 +127,7 @@ public Quarter() { * @param year the year (1900 to 9999). * @param quarter the quarter (1 to 4). */ - public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, /*@IntRange(from=-9999, to = 9999)*/int year) { + public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, /*@IntRange(from=0, to = 9999)*/int year) { if ((quarter < FIRST_QUARTER) || (quarter > LAST_QUARTER)) { throw new IllegalArgumentException("Quarter outside valid range."); } @@ -423,7 +424,8 @@ public String toString() { */ @Override public long getFirstMillisecond(Calendar calendar) { - int month = Quarter.FIRST_MONTH_IN_QUARTER[this.quarter]; + @SuppressWarnings("index") // month >= 1, since months are 1 to 12. this.quarter is 1 to 4, so it can't access the 0th value in FIRST_MONTH_IN_QUARTER, which is the only non positive value + /*@Positive*/ int month = Quarter.FIRST_MONTH_IN_QUARTER[this.quarter]; calendar.set(this.year, month - 1, 1, 0, 0, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTimeInMillis(); diff --git a/src/main/java/org/jfree/data/time/Week.java b/src/main/java/org/jfree/data/time/Week.java index 793912032..92f95d941 100644 --- a/src/main/java/org/jfree/data/time/Week.java +++ b/src/main/java/org/jfree/data/time/Week.java @@ -104,7 +104,7 @@ public class Week extends RegularTimePeriod implements Serializable { public static final int LAST_WEEK_IN_YEAR = 53; /** The year in which the week falls. */ - private /*@IntRange(from = -9999, to = 9999)*/ short year; + private /*@IntRange(from = 0, to = 9999)*/ short year; /** The week (1-53). */ private /*@IntRange(from = 1, to = 53)*/ byte week; @@ -129,7 +129,7 @@ public Week() { * @param week the week (1 to 53). * @param year the year (1900 to 9999). */ - public Week(/*@IntRange(from = 1, to = 53)*/ int week, /*@IntRange(from = -9999, to = 9999)*/ int year) { + public Week(/*@IntRange(from = 1, to = 53)*/ int week, /*@IntRange(from = 0, to = 9999)*/ int year) { if ((week < FIRST_WEEK_IN_YEAR) && (week > LAST_WEEK_IN_YEAR)) { throw new IllegalArgumentException( "The 'week' argument must be in the range 1 - 53."); diff --git a/src/main/java/org/jfree/data/time/Year.java b/src/main/java/org/jfree/data/time/Year.java index 8ec35dfcc..3aa79fa84 100644 --- a/src/main/java/org/jfree/data/time/Year.java +++ b/src/main/java/org/jfree/data/time/Year.java @@ -157,7 +157,8 @@ public Year(Date time, TimeZone zone, Locale locale) { * * @return The year. */ - public /*@IntRange(from = -9999, to = 9999)*/ int getYear() { + @SuppressWarnings({"index", "value"}) // this is a bug. The calendar API which this interacts with expects years to be nonnegative (it uses an era field to represent AD/BC) + public /*@IntRange(from = 0, to = 9999)*/ int getYear() { return this.year; } @@ -261,6 +262,7 @@ public long getSerialIndex() { * {@code null}. */ @Override + @SuppressWarnings({"index", "value"}) // this is a bug in this class. Years cannot be negative from a Calendar's perspective public long getFirstMillisecond(Calendar calendar) { calendar.set(this.year, Calendar.JANUARY, 1, 0, 0, 0); calendar.set(Calendar.MILLISECOND, 0); @@ -279,6 +281,7 @@ public long getFirstMillisecond(Calendar calendar) { * {@code null}. */ @Override + @SuppressWarnings({"index", "value"}) // this is a bug in this class. Years cannot be negative from a Calendar's perspective public long getLastMillisecond(Calendar calendar) { calendar.set(this.year, Calendar.DECEMBER, 31, 23, 59, 59); calendar.set(Calendar.MILLISECOND, 999); From 1cf2d12bd7324ec63a9e37e04cb51846ea7fe20d Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Mon, 22 Jan 2018 13:43:19 -0800 Subject: [PATCH 30/79] remove unneeded suppress warnings --- ant/build.xml | 2 +- .../org/jfree/chart/plot/CategoryPlot.java | 18 +++++++++--------- src/main/java/org/jfree/chart/plot/XYPlot.java | 16 ++++++++-------- .../jfree/chart/renderer/xy/XYBarRenderer.java | 2 +- .../org/jfree/data/statistics/Statistics.java | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/ant/build.xml b/ant/build.xml index c991ed76f..bf817ff73 100644 --- a/ant/build.xml +++ b/ant/build.xml @@ -127,7 +127,7 @@ source="${src.version}" target="${target.version}" includeantruntime="false"> - + diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 2ef54fc86..77290d185 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -2429,7 +2429,7 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L */ public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 Set keys = this.backgroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @@ -2440,7 +2440,7 @@ public void clearDomainMarkers() { this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 Set keys = this.foregroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @@ -2705,7 +2705,7 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye */ public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 Set keys = this.backgroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @@ -2716,7 +2716,7 @@ public void clearRangeMarkers() { this.backgroundRangeMarkers.clear(); } if (this.foregroundRangeMarkers != null) { - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 Set keys = this.foregroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @@ -3737,7 +3737,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances in this method + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances in this method private List getDatasetIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Map.Entry entry : @@ -3761,7 +3761,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return A list of indices. */ - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances in this method + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances in this method private List getRendererIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Map.Entry entry: @@ -5018,16 +5018,16 @@ public Object clone() throws CloneNotSupportedException { } // AxisLocation is immutable, so we can just copy the maps - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap clonedomainAxisLocations = new HashMap( this.domainAxisLocations); clone.domainAxisLocations = clonedomainAxisLocations; - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap clonerangeAxisLocations = new HashMap( this.rangeAxisLocations); clone.rangeAxisLocations = clonerangeAxisLocations; - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap clonedatasets = new HashMap(this.datasets); clone.datasets = clonedatasets; for (CategoryDataset dataset : clone.datasets.values()) { diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index af49d5d9b..6e8633cf4 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -639,29 +639,29 @@ public XYPlot(XYDataset dataset, ValueAxis domainAxis, ValueAxis rangeAxis, this.axisOffset = RectangleInsets.ZERO_INSETS; // allocate storage for datasets, axes and renderers (all optional) - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap domainAxes = new HashMap(); this.domainAxes = domainAxes; - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap domainAxisLocations = new HashMap(); this.domainAxisLocations = domainAxisLocations; this.foregroundDomainMarkers = new HashMap(); this.backgroundDomainMarkers = new HashMap(); - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap rangeAxes = new HashMap(); this.rangeAxes = rangeAxes; - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap rangeAxisLocations = new HashMap(); this.rangeAxisLocations = rangeAxisLocations; this.foregroundRangeMarkers = new HashMap(); this.backgroundRangeMarkers = new HashMap(); - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap datasets = new HashMap(); this.datasets = datasets; - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 HashMap renderers = new HashMap(); this.renderers = renderers; @@ -2689,7 +2689,7 @@ public void addRangeMarker(Marker marker, Layer layer) { */ public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 Set keys = this.backgroundRangeMarkers.keySet(); for (Integer key : keys) { clearRangeMarkers(key); @@ -2697,7 +2697,7 @@ public void clearRangeMarkers() { this.backgroundRangeMarkers.clear(); } if (this.foregroundRangeMarkers != null) { - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 Set keys = this.foregroundRangeMarkers.keySet(); for (Integer key : keys) { clearRangeMarkers(key); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index 4703c3d68..60a923c3a 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -105,7 +105,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index 2f42ddbcb..6a15071bc 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -382,7 +382,7 @@ public static double getSlope(Number /*@SameLen("#2")*/ [] xData, Number /*@Same sx = sx + xData[counter].doubleValue(); sxx = sxx + Math.pow(xData[counter].doubleValue(), 2); sxy = sxy + yData[counter].doubleValue() - * xData[counter].doubleValue(); + * xData[counter].doubleValue(); sy = sy + yData[counter].doubleValue(); } return (sxy - (sx * sy) / counter) / (sxx - (sx * sx) / counter); From 055a8b120d24f07b61627018bd10a7cc896f6995 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Mon, 22 Jan 2018 13:44:31 -0800 Subject: [PATCH 31/79] actually remove them --- .../org/jfree/chart/plot/CategoryPlot.java | 18 +++++++++--------- src/main/java/org/jfree/chart/plot/XYPlot.java | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 77290d185..3fbc80177 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -2429,7 +2429,7 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L */ public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.backgroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @@ -2440,7 +2440,7 @@ public void clearDomainMarkers() { this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.foregroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @@ -2705,7 +2705,7 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye */ public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.backgroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @@ -2716,7 +2716,7 @@ public void clearRangeMarkers() { this.backgroundRangeMarkers.clear(); } if (this.foregroundRangeMarkers != null) { - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.foregroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @@ -3737,7 +3737,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances in this method + , 3 instances in this method private List getDatasetIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Map.Entry entry : @@ -3761,7 +3761,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return A list of indices. */ - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances in this method + , 3 instances in this method private List getRendererIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Map.Entry entry: @@ -5018,16 +5018,16 @@ public Object clone() throws CloneNotSupportedException { } // AxisLocation is immutable, so we can just copy the maps - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap clonedomainAxisLocations = new HashMap( this.domainAxisLocations); clone.domainAxisLocations = clonedomainAxisLocations; - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap clonerangeAxisLocations = new HashMap( this.rangeAxisLocations); clone.rangeAxisLocations = clonerangeAxisLocations; - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap clonedatasets = new HashMap(this.datasets); clone.datasets = clonedatasets; for (CategoryDataset dataset : clone.datasets.values()) { diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 6e8633cf4..4801810e8 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -639,29 +639,29 @@ public XYPlot(XYDataset dataset, ValueAxis domainAxis, ValueAxis rangeAxis, this.axisOffset = RectangleInsets.ZERO_INSETS; // allocate storage for datasets, axes and renderers (all optional) - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap domainAxes = new HashMap(); this.domainAxes = domainAxes; - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap domainAxisLocations = new HashMap(); this.domainAxisLocations = domainAxisLocations; this.foregroundDomainMarkers = new HashMap(); this.backgroundDomainMarkers = new HashMap(); - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap rangeAxes = new HashMap(); this.rangeAxes = rangeAxes; - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap rangeAxisLocations = new HashMap(); this.rangeAxisLocations = rangeAxisLocations; this.foregroundRangeMarkers = new HashMap(); this.backgroundRangeMarkers = new HashMap(); - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap datasets = new HashMap(); this.datasets = datasets; - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + HashMap renderers = new HashMap(); this.renderers = renderers; @@ -2689,7 +2689,7 @@ public void addRangeMarker(Marker marker, Layer layer) { */ public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.backgroundRangeMarkers.keySet(); for (Integer key : keys) { clearRangeMarkers(key); @@ -2697,7 +2697,7 @@ public void clearRangeMarkers() { this.backgroundRangeMarkers.clear(); } if (this.foregroundRangeMarkers != null) { - // @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/186 + Set keys = this.foregroundRangeMarkers.keySet(); for (Integer key : keys) { clearRangeMarkers(key); From dc8ae7fd817a6904aaa84c6bbc46ab81e177667b Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Tue, 23 Jan 2018 10:03:36 -0800 Subject: [PATCH 32/79] minor changes --- src/main/java/org/jfree/chart/plot/CategoryPlot.java | 12 +----------- src/main/java/org/jfree/chart/plot/XYPlot.java | 7 ------- .../jfree/data/time/DynamicTimeSeriesCollection.java | 10 +++++----- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 3fbc80177..e74a934e5 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -593,27 +593,21 @@ public CategoryPlot(CategoryDataset dataset, CategoryAxis domainAxis, this.orientation = PlotOrientation.VERTICAL; // allocate storage for dataset, axes and renderers - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 HashMap domainAxesTmp = new HashMap(); this.domainAxes = domainAxesTmp; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 HashMap domainAxisLocationsTmp = new HashMap(); this.domainAxisLocations = domainAxisLocationsTmp; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 HashMap rangeAxesTmp = new HashMap(); this.rangeAxes = rangeAxesTmp; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 HashMap rangeAxisLocationsTmp = new HashMap(); this.rangeAxisLocations = rangeAxisLocationsTmp; this.datasetToDomainAxesMap = new TreeMap(); this.datasetToRangeAxesMap = new TreeMap(); - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 HashMap renderersTmp = new HashMap(); this.renderers = renderersTmp; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/198 HashMap datasetsTmp = new HashMap(); this.datasets = datasetsTmp; this.datasets.put(0, dataset); @@ -3643,7 +3637,6 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, AlphaComposite.SRC_OVER, getForegroundAlpha())); DatasetRenderingOrder order = getDatasetRenderingOrder(); - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/198 List datasetIndices = getDatasetIndices(order); for (int i : datasetIndices) { foundData = render(g2, dataArea, i, state, crosshairState) @@ -3651,8 +3644,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, } // draw the foreground markers... - @SuppressWarnings({"index", "value"}) // https://github.com/kelloggm/checker-framework/issues/198 - List rendererIndices = getRendererIndices(order); + List rendererIndices = getRendererIndices(order); for (int i : rendererIndices) { drawDomainMarkers(g2, dataArea, i, Layer.FOREGROUND); } @@ -3737,7 +3729,6 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ - , 3 instances in this method private List getDatasetIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Map.Entry entry : @@ -3761,7 +3752,6 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return A list of indices. */ - , 3 instances in this method private List getRendererIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Map.Entry entry: diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 4801810e8..5fedaea92 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -2447,7 +2447,6 @@ public void addDomainMarker(Marker marker, Layer layer) { */ public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - @SuppressWarnings({"index", "value"}) // keys in backgroundDomainMarkers are non negative? also kelloggm#186 Set keys = this.backgroundDomainMarkers.keySet(); for (Integer key : keys) { clearDomainMarkers(key); @@ -2455,7 +2454,6 @@ public void clearDomainMarkers() { this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { - @SuppressWarnings({"index", "value"}) // keys in foregroundDomainMarkers are non negative? also kelloggm#186 Set keys = this.foregroundDomainMarkers.keySet(); for (Integer key : keys) { clearDomainMarkers(key); @@ -3288,9 +3286,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // now draw annotations and render data items... boolean foundData = false; DatasetRenderingOrder order = getDatasetRenderingOrder(); - @SuppressWarnings("value") // https://github.com/kelloggm/checker-framework/issues/186 List rendererIndices = getRendererIndices(order); - @SuppressWarnings("value") // https://github.com/kelloggm/checker-framework/issues/186 List datasetIndices = getDatasetIndices(order); // draw background annotations @@ -3403,7 +3399,6 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ - @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances private List< /*@NonNegative*/ Integer> getDatasetIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYDataset> entry : this.datasets.entrySet()) { @@ -3418,7 +3413,6 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, return result; } - @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/186, 3 instances private List< /*@NonNegative*/ Integer> getRendererIndices(DatasetRenderingOrder order) { List result = new ArrayList(); for (Entry< /*@NonNegative*/ Integer, XYItemRenderer> entry : this.renderers.entrySet()) { @@ -5578,7 +5572,6 @@ public boolean equals(Object obj) { * the plot cannot be cloned. */ @Override - @SuppressWarnings("value") // https://github.com/kelloggm/checker-framework/issues/186, 3 instances public Object clone() throws CloneNotSupportedException { XYPlot clone = (XYPlot) super.clone(); clone.domainAxes = CloneUtils.cloneMapValues(this.domainAxes); diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index a4967794f..6d4d6bb6d 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -114,7 +114,7 @@ public class DynamicTimeSeriesCollection extends AbstractIntervalXYDataset private /*@NonNegative*/ int maximumItemCount = 2000; // an arbitrary safe default value /** The history count. */ - protected /*@LTEqLengthOf("this.pointsInTime")*/ /*@Positive*/ int historyCount; + protected /*@LengthOf("this.pointsInTime")*/ /*@Positive*/ int historyCount; /** Storage for the series keys. */ private Comparable /*@SameLen("this.valueHistory")*/ [] seriesKeys; @@ -404,7 +404,7 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, + "cannot add more series than specified in c'tor"); } if (this.valueHistory[seriesNumber] == null) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + // @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[seriesNumber] = valueSequence; this.seriesCount++; @@ -467,7 +467,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer ); } if (this.valueHistory[seriesNumber] == null) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + // @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[seriesNumber] = valueSequence; this.seriesCount++; @@ -704,7 +704,7 @@ public void appendData(float[] newData) { // check whether the "valueHistory" array member exists; if not, // create them: if (this.valueHistory[s] == null) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + // @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } @@ -731,7 +731,7 @@ public void appendData(float[] newData, final /*@IndexFor("this.pointsInTime")*/ } for (int s = 0; s < nDataPoints; s++) { if (this.valueHistory[s] == null) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + // @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } From 55038b90122d3a0ec57ec801269304ff19e64738 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Wed, 24 Jan 2018 12:34:13 -0800 Subject: [PATCH 33/79] fix bad choice --- .../java/org/jfree/data/time/DynamicTimeSeriesCollection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 6d4d6bb6d..c68a42b48 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -114,7 +114,7 @@ public class DynamicTimeSeriesCollection extends AbstractIntervalXYDataset private /*@NonNegative*/ int maximumItemCount = 2000; // an arbitrary safe default value /** The history count. */ - protected /*@LengthOf("this.pointsInTime")*/ /*@Positive*/ int historyCount; + protected /*@LTEqLengthOf("this.pointsInTime")*/ /*@Positive*/ int historyCount; /** Storage for the series keys. */ private Comparable /*@SameLen("this.valueHistory")*/ [] seriesKeys; From a2e017acffb996a07cbb3fc07e977421148db0e6 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Wed, 24 Jan 2018 18:45:01 -0800 Subject: [PATCH 34/79] audit establish rep invariant sws --- .../category/AbstractCategoryItemRenderer.java | 2 +- .../chart/renderer/xy/CyclicXYItemRenderer.java | 3 ++- .../jfree/data/general/DefaultHeatMapDataset.java | 8 ++++---- .../java/org/jfree/data/jdbc/JDBCXYDataset.java | 2 +- .../statistics/DefaultBoxAndWhiskerXYDataset.java | 2 +- .../org/jfree/data/statistics/HistogramDataset.java | 2 +- .../data/statistics/SimpleHistogramDataset.java | 2 +- .../data/time/DynamicTimeSeriesCollection.java | 4 ++-- .../org/jfree/data/time/TimeTableXYDataset.java | 2 +- .../jfree/data/time/ohlc/OHLCSeriesCollection.java | 2 +- .../java/org/jfree/data/xy/DefaultWindDataset.java | 4 ++-- .../java/org/jfree/data/xy/DefaultXYDataset.java | 2 +- .../java/org/jfree/data/xy/DefaultXYZDataset.java | 2 +- src/main/java/org/jfree/data/xy/MatrixSeries.java | 2 +- src/main/java/org/jfree/data/xy/XYBarDataset.java | 13 ++----------- 15 files changed, 22 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 54f8b507e..3a703ac57 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -1592,7 +1592,7 @@ public LegendItemCollection getLegendItems() { if (this.plot == null) { return result; } - @SuppressWarnings("index") // class invariant: this.plot.getIndexOf(this) is always non negative, since this.plot is the plot associated with the renderer + @SuppressWarnings("index") // this.plot.getIndexOf(this) is always non negative, since this.plot is the plot associated with the renderer /*@NonNegative*/ int index = this.plot.getIndexOf(this); CategoryDataset dataset = this.plot.getDataset(index); if (dataset == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 8ee1ba6d8..f121ad977 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -362,6 +362,7 @@ protected static class OverwriteDataSet implements XYDataset { * @param y the y values. * @param delegateSet the dataset. */ + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 public OverwriteDataSet(double /*@SameLen("#2")*/ [] x, double /*@SameLen("#1")*/ [] y, XYDataset delegateSet) { this.delegateSet = delegateSet; @@ -390,7 +391,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.x.length; } diff --git a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java index 1e2546b19..1716e454c 100644 --- a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java @@ -108,21 +108,21 @@ public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamp throw new IllegalArgumentException("'maxY' cannot be INF or NaN."); } - @SuppressWarnings("index") // establish repr invariant + @SuppressWarnings("index") // establishing invariant of a ghost method /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int xSamplesTmp = xSamples; this.xSamples = xSamplesTmp; - @SuppressWarnings("index") // establish repr invariant + @SuppressWarnings("index") // establishing invariant of a ghost method /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int ySamplesTmp = ySamples; this.ySamples = ySamplesTmp; this.minX = minX; this.maxX = maxX; this.minY = minY; this.maxY = maxY; - @SuppressWarnings({"index", "value"}) // establish repr. invariant ; since ySamples is positive and will be used to create each inner array, the MinLen is true + @SuppressWarnings({"index", "value"}) // establishing invariant of a ghost method: since ySamples is positive and will be used to create each inner array, the MinLen is true double /*@SameLen("this.getData()")*/ [] /*@SameLen("this.getData()[0]")*/ /*@MinLen(1)*/ [] zValues = new double[xSamples][]; this.zValues = zValues; for (int x = 0; x < xSamples; x++) { - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // establishing invariant of a ghost method double /*@SameLen("this.getData()[0]")*/ [] zValuesX = new double[ySamples]; this.zValues[x] = zValuesX; } diff --git a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java index aa50eecf5..c55bfc285 100644 --- a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java +++ b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java @@ -458,7 +458,7 @@ public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries * @see XYDataset */ @Override - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // array-list interop: getItemCount needs to have this type for the other implementations public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { return this.rows.size(); } diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index afb13552a..29121088e 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -217,7 +217,7 @@ public void setFaroutCoefficient(double faroutCoefficient) { * @return The number of items in the specified series. */ @Override - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.dates.size(); } diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index 3a273b731..6522b4b35 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -339,7 +339,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getBins(series).size(); } diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index 4766a8dab..5bfa3c5f7 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -167,7 +167,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.bins.size(); } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index c68a42b48..5befe0bf9 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -149,7 +149,7 @@ public ValueSequence() { * @param length the length. */ public ValueSequence(/*@NonNegative*/ int length) { - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 float /*@SameLen("this")*/ [] dataPointsTmp = new float[length]; this.dataPoints = dataPointsTmp; for (int i = 0; i < length; i++) { @@ -503,7 +503,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer * @return The item count. */ @Override - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209: I'd like to write SameLen on this.pointsInTime public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, // so ignore argument: return this.historyCount; diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index 51dca3cbb..b660b2bda 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -328,7 +328,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { * @return The number of items within the series. */ @Override - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // array-list interop: series is ignored and the underlying rep here is a list public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getItemCount(); } diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index dd5dcbd68..a96640076 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -179,7 +179,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - @SuppressWarnings("index") // establish repr. invariant + @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index 8f6887306..ff24817cb 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -46,7 +46,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -190,7 +190,7 @@ public DefaultWindDataset(List seriesKeys, Object[][] /*@ArrayLen(3)*/ [] data) * @return The item count. */ @Override - @SuppressWarnings("index") // class invariant + @SuppressWarnings("index") // array-list interop: the annotation here expects this to be backed by a list of arrays, but its backed by a list of lists public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { if (series < 0 || series >= getSeriesCount()) { throw new IllegalArgumentException("Invalid series index: " diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index 20298dcee..8582f75c3 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -157,7 +157,7 @@ public DomainOrder getDomainOrder() { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - @SuppressWarnings("index") // class invariant: this.getSeries is the logical ghost variable representing this array + @SuppressWarnings("index") //array-list interop: this.getSeries is the logical ghost variable representing this array double /*@ArrayLen(2)*/ [] /*@SameLen("this.getSeries(#1)")*/ [] seriesArray = (double /*@ArrayLen(2)*/ [][]) this.seriesList.get(series); diff --git a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java index 4c90ef078..c3cc0e91d 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java @@ -155,7 +155,7 @@ public DomainOrder getDomainOrder() { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - @SuppressWarnings("index") // class invariant: this.getSeries is the logical ghost variable representing this array + @SuppressWarnings("index") // array-list interop: this.getSeries is the logical ghost variable representing this array double /*@ArrayLen(3)*/ [] /*@SameLen("this.getSeries(#1)")*/ [] seriesArray = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); return seriesArray[0].length; diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index 6912e6a16..cf719c1d4 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -74,7 +74,7 @@ public class MatrixSeries extends Series implements Serializable { * @param rows the number of rows. * @param columns the number of columns. */ - @SuppressWarnings("index") // representation invariant: this.data needs to be SameLen as "this" + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int columns) { super(name); this.data = new double[rows][columns]; diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index 26fa9f963..01f2572f0 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -66,7 +66,7 @@ public class XYBarDataset extends AbstractIntervalXYDataset implements IntervalXYDataset, DatasetChangeListener, PublicCloneable { /** The underlying dataset. */ - private XYDataset underlying; + private /*@SameLen("this")*/ XYDataset underlying; /** The bar width. */ private double barWidth; @@ -78,7 +78,7 @@ public class XYBarDataset extends AbstractIntervalXYDataset * permitted). * @param barWidth the width of the bars. */ - @SuppressWarnings("index") // the underlying dataset is the same length as this dataset by definition + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 public XYBarDataset(XYDataset underlying, double barWidth) { this.underlying = underlying; this.underlying.addChangeListener(this); @@ -153,7 +153,6 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getItemCount(series); } @@ -169,7 +168,6 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @see #getXValue(int, int) */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getX(series, item); } @@ -185,7 +183,6 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getX(int, int) */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getXValue(series, item); } @@ -201,7 +198,6 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getYValue(int, int) */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } @@ -217,7 +213,6 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getY(int, int) */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getYValue(series, item); } @@ -231,7 +226,6 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; Number xnum = this.underlying.getX(series, item); @@ -266,7 +260,6 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; Number xnum = this.underlying.getX(series, item); @@ -301,7 +294,6 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The value. */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } @@ -331,7 +323,6 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - @SuppressWarnings("index") // this and this.underlying have the same conceptual length public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } From b5cf5fba6d29fdbbe668faa6fd32be6c1dc17203 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Thu, 25 Jan 2018 08:49:49 -0800 Subject: [PATCH 35/79] Mark warning supressions with new issue. --- .../labels/BoxAndWhiskerXYToolTipGenerator.java | 2 +- .../chart/labels/BubbleXYItemLabelGenerator.java | 2 +- .../chart/labels/HighLowItemLabelGenerator.java | 2 +- .../chart/labels/IntervalXYItemLabelGenerator.java | 2 +- .../chart/labels/IntervalXYToolTipGenerator.java | 2 +- .../chart/labels/StandardXYZToolTipGenerator.java | 2 +- .../jfree/chart/renderer/xy/CandlestickRenderer.java | 4 ++-- .../chart/renderer/xy/ClusteredXYBarRenderer.java | 2 +- .../jfree/chart/renderer/xy/DeviationRenderer.java | 2 +- .../chart/renderer/xy/StackedXYBarRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/VectorRenderer.java | 2 +- .../jfree/chart/renderer/xy/WindItemRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/XYBarRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/XYBlockRenderer.java | 2 +- .../chart/renderer/xy/XYBoxAndWhiskerRenderer.java | 4 ++-- .../jfree/chart/renderer/xy/XYBubbleRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/XYErrorRenderer.java | 2 +- .../org/jfree/chart/renderer/xy/XYShapeRenderer.java | 2 +- .../jfree/chart/renderer/xy/YIntervalRenderer.java | 2 +- .../java/org/jfree/data/general/DatasetUtils.java | 12 ++++++------ 20 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 3c3510a19..1fff721cc 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -145,7 +145,7 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, if (dataset instanceof BoxAndWhiskerXYDataset) { BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("d.getSeries(series)")*/ int itemD = item; result[2] = formatter.format(d.getMeanValue(series, itemD)); result[3] = formatter.format(d.getMedianValue(series, itemD)); diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index ee44960f0..1eeb876d5 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -187,7 +187,7 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series Object[] items; if (dataset instanceof XYZDataset) { XYZDataset xyzDataset = (XYZDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("xyzDataset.getSeries(series)")*/ int item1 = item; items = createItemArray(xyzDataset, series, item1); } diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index fc17bf8c3..bac11ad3c 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -129,7 +129,7 @@ public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /* } StringBuilder sb = new StringBuilder(); OHLCDataset d = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("d.getSeries(series)")*/ int itemD = item; Number high = d.getHigh(series, itemD); Number low = d.getLow(series, itemD); diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index a2b60d985..d9614cb02 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -160,7 +160,7 @@ public IntervalXYItemLabelGenerator(String formatString, /*@IndexFor("#1.getSeries(#2)")*/ int item) { IntervalXYDataset intervalDataset = null; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("intervalDataset.getSeries(series)")*/ int itemIntervalDataset = item; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index 86d5e9500..60be84e23 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -155,7 +155,7 @@ public IntervalXYToolTipGenerator(String formatString, protected Object/*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { IntervalXYDataset intervalDataset = null; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("intervalDataset.getSeries(series)")*/ int itemIntervalDataset = item; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index 4c8904e89..a27965977 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -179,7 +179,7 @@ public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, / @Override public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { String result; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 Object[] items = createItemArray((XYZDataset) dataset, series, item); result = MessageFormat.format(getFormatString(), items); return result; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java index f1370889c..243faf997 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java @@ -670,7 +670,7 @@ else if (orientation == PlotOrientation.VERTICAL) { } OHLCDataset highLowData = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("highLowData.getSeries(series)")*/ int highLowItem = item; double x = highLowData.getXValue(series, highLowItem); @@ -731,7 +731,7 @@ else if (orientation == PlotOrientation.VERTICAL) { case WIDTHMETHOD_INTERVALDATA: IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; double startPos = domainAxis.valueToJava2D( intervalDataset.getStartXValue(series, intervalXYItem), diff --git a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java index 8a65f511d..bc6282588 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java @@ -229,7 +229,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; double y0; diff --git a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java index 1b27709fb..cd69b7380 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java @@ -285,7 +285,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (pass == 0) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; State drState = (State) state; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java index e0b022b88..647f898e4 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java @@ -266,7 +266,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; double value = intervalDataset.getYValue(series, intervalXYItem); if (Double.isNaN(value)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java index 297220a68..b6975f2ab 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java @@ -233,7 +233,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double dy = 0.0; if (dataset instanceof VectorXYDataset) { VectorXYDataset vectorXYDataset = (VectorXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("vectorXYDataset.getSeries(series)")*/ int vectorXYItem = item; dx = vectorXYDataset.getVectorXValue(series, vectorXYItem); dy = vectorXYDataset.getVectorYValue(series, vectorXYItem); diff --git a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java index d9414f71b..acc43a374 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java @@ -124,7 +124,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { WindDataset windData = (WindDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("windData.getSeries(series)")*/ int windItem = item; Paint seriesPaint = getItemPaint(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index 60a923c3a..cc60eeb3e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -816,7 +816,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalItem = item; double value0; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 9ce35a5b1..83f824424 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -359,7 +359,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double z = 0.0; if (dataset instanceof XYZDataset) { XYZDataset xyzDataset = ((XYZDataset) dataset); - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("xyzDataset.getSeries(series)")*/ int xyzItem = item; z = xyzDataset.getZValue(series, xyzItem); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index 97c6c84a8..4472cea27 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -391,7 +391,7 @@ public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("boxAndWhiskerData.getSeries(series)")*/ int boxAndWhiskerItem = item; Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); @@ -534,7 +534,7 @@ public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("boxAndWhiskerData.getSeries(series)")*/ int boxAndWhiskerItem = item; Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index 875acff9f..a2ab932f8 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -197,7 +197,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (dataset instanceof XYZDataset) { XYZDataset xyzData = (XYZDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("xyzData.getSeries(series)")*/ int xyzItem = item; z = xyzData.getZValue(series, xyzItem); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java index 5c17eda28..b9eff6915 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java @@ -313,7 +313,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, && getItemVisible(series, item)) { IntervalXYDataset ixyd = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("ixyd.getSeries(series)")*/ int ixydItem = item; PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 2a241cb37..fc07605c4 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -519,7 +519,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, protected Paint getPaint(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { Paint p; if (dataset instanceof XYZDataset) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 double z = ((XYZDataset) dataset).getZValue(series, item); p = this.paintScale.getPaint(z); } else { diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index 60fe1ee58..5ef714e92 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -197,7 +197,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalItem = item; double x = intervalDataset.getXValue(series, intervalItem); diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 88dc4d8be..f8fc0477d 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -1640,7 +1640,7 @@ public static Number findMinimumDomainValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = intervalXYData.getStartXValue(series, item); value = valueTmp; } @@ -1697,7 +1697,7 @@ public static Number findMaximumDomainValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = intervalXYData.getEndXValue(series, item); value = valueTmp; } @@ -1806,13 +1806,13 @@ public static Number findMinimumRangeValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = intervalXYData.getStartYValue(series, item); value = valueTmp; } else if (dataset instanceof OHLCDataset) { OHLCDataset highLowData = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = highLowData.getLowValue(series, item); value = valueTmp; } @@ -1923,13 +1923,13 @@ public static Number findMaximumRangeValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = intervalXYData.getEndYValue(series, item); value = valueTmp; } else if (dataset instanceof OHLCDataset) { OHLCDataset highLowData = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = highLowData.getHighValue(series, item); value = valueTmp; } From 9ccdcd4d8983a63b042f3dda22a88ea12ee86fbc Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Fri, 26 Jan 2018 12:54:39 -0800 Subject: [PATCH 36/79] Workaround FlowExpression parsing problem. --- .../java/org/jfree/chart/renderer/xy/CandlestickRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java index 243faf997..824101fb1 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java @@ -732,7 +732,7 @@ else if (orientation == PlotOrientation.VERTICAL) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; + /*@NonNegative*/ /*@UpperBoundBottom*/ int intervalXYItem = item; double startPos = domainAxis.valueToJava2D( intervalDataset.getStartXValue(series, intervalXYItem), dataArea, plot.getDomainAxisEdge()); From c91631be91d1ff6bea6b50726bd53ea0b8feeff5 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Fri, 26 Jan 2018 15:27:19 -0800 Subject: [PATCH 37/79] Add LessThan annotations. --- .../data/category/SlidingCategoryDataset.java | 4 ++-- .../gantt/SlidingGanttCategoryDataset.java | 2 +- .../statistics/BoxAndWhiskerCalculator.java | 22 +++++++++++++------ .../org/jfree/data/statistics/Statistics.java | 6 ++--- .../org/jfree/data/time/TimePeriodValues.java | 4 ++-- .../java/org/jfree/data/time/TimeSeries.java | 12 +++++----- 6 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index f2d89ea18..938a3e1fd 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -40,7 +40,7 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -157,6 +157,7 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { * * @return The index. */ + /*@Pure*/ private /*@GTENegativeOne*/ int lastCategoryIndex() { if (this.maximumCategoryCount == 0) { return -1; @@ -176,7 +177,6 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 index >= this.firstCategoryIndex is a condition to this block /*@NonNegative*/ int result = index - this.firstCategoryIndex; return result; } diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index bf143f733..0ef2a5e84 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -39,7 +39,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java index d1b5ec563..c9d9e3f16 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java @@ -48,6 +48,7 @@ package org.jfree.data.statistics; /*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ import java.util.ArrayList; import java.util.Collections; @@ -188,15 +189,17 @@ public static double calculateQ1(List values) { if (count > 0) { if (count % 2 == 1) { if (count > 1) { - result = Statistics.calculateMedian(values, 0, count / 2); + int count1 = count / 2; + result = Statistics.calculateMedian(values, 0, count1); } else { result = Statistics.calculateMedian(values, 0, 0); } } else { - @SuppressWarnings("index") // since count is a nonnegative even number, this expression is >= 0 - /*@NonNegative*/ int count1 = count / 2 - 1; + @SuppressWarnings({"index","value"}) // since count is a nonnegative even number, this expression is >= 0 + /*@IntRange(from=0)*/ int count1 = count / 2 - 1; + count1 = count1; result = Statistics.calculateMedian(values, 0, count1); } @@ -222,16 +225,21 @@ public static double calculateQ3(List values) { if (count > 0) { if (count % 2 == 1) { if (count > 1) { - result = Statistics.calculateMedian(values, count / 2, - count - 1); + int countDiv2 = count / 2; + int countMinus1 = count - 1; + result = Statistics.calculateMedian(values, countDiv2, + countMinus1); } else { result = Statistics.calculateMedian(values, 0, 0); } } else { - result = Statistics.calculateMedian(values, count / 2, - count - 1); + int countDiv2 = count / 2; + int countMinus1 = count - 1; + + result = Statistics.calculateMedian(values, countDiv2, + countMinus1); } } return result; diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index 6a15071bc..8f1cc86c4 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -244,7 +244,7 @@ public static double calculateMedian(List values, boolean copyAndSort) { * * @return The median. */ - public static double calculateMedian(List values, /*@NonNegative*/ int start, /*@NonNegative*/ int end) { + public static double calculateMedian(List values, /*@NonNegative*/ /*@LessThan("#3 + 1")*/ int start, /*@NonNegative*/ int end) { return calculateMedian(values, start, end, true); } @@ -261,12 +261,11 @@ public static double calculateMedian(List values, /*@NonNegative*/ int start, /* * * @return The median. */ - public static double calculateMedian(List values, /*@NonNegative*/ int start, /*@NonNegative*/ int end, + public static double calculateMedian(List values, /*@NonNegative*/ /*@LessThan("#3 + 1")*/ int start, /*@NonNegative*/ int end, boolean copyAndSort) { double result = Double.NaN; if (copyAndSort) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 end > start List working = new ArrayList(end - start + 1); for (int i = start; i <= end; i++) { working.add(values.get(i)); @@ -458,7 +457,6 @@ public static double getCorrelation(Number /*@SameLen("#2")*/ [] data1, Number / "Period can't be longer than dataset."); } - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 xData.length > period /*@NonNegative*/ int resultLen = xData.length - period; double[] /*@ArrayLen(2)*/ [] result = new double[resultLen][2]; for (int i = 0; i < result.length; i++) { diff --git a/src/main/java/org/jfree/data/time/TimePeriodValues.java b/src/main/java/org/jfree/data/time/TimePeriodValues.java index 0b43bb8a3..8ee5192ec 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValues.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValues.java @@ -50,6 +50,7 @@ /*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.GTENegativeOne; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +/*>>> import org.checkerframework.checker.index.qual.LessThan; */ import java.io.Serializable; import java.util.ArrayList; @@ -404,8 +405,7 @@ public void update(/*@NonNegative*/ int index, Number value) { * @param start the index of the first period to delete. * @param end the index of the last period to delete. */ - @SuppressWarnings("index") // https://github.com/kelloggm/issues/158 end > start is precondition - public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { + public void delete(/*@NonNegative*/ /*@LessThan("#2 + 1")*/ int start, /*@NonNegative*/ int end) { for (int i = 0; i <= (end - start); i++) { this.data.remove(start); } diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index 9cde4e149..8c4916795 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -91,6 +91,7 @@ package org.jfree.data.time; /*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.common.value.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ import java.io.Serializable; @@ -303,8 +304,10 @@ public void setMaximumItemCount(/*@NonNegative*/ int maximum) { this.maximumItemCount = maximum; int count = this.data.size(); if (count > maximum) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 - /*@NonNegative*/ int deleteIndex = count - maximum - 1; + @SuppressWarnings({"index","value"}) // https://github.com/kelloggm/checker-framework/issues/158 + /*@IntRange(from=0)*/ int deleteIndex = count - maximum - 1; + // Extra assignment to kill the dataflow refinement. + deleteIndex = deleteIndex; delete(0, deleteIndex); } } @@ -1083,7 +1086,7 @@ public void delete(RegularTimePeriod period) { * @param start the index of the first period to delete. * @param end the index of the last period to delete. */ - public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { + public void delete(/*@NonNegative*/ /*@LessThan("#2 + 1")*/ int start, /*@NonNegative*/ int end) { delete(start, end, true); } @@ -1096,8 +1099,7 @@ public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { * * @since 1.0.14 */ - @SuppressWarnings("index") // https://github.com/kelloggm/issues/158 end > start is precondition - public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end, boolean notify) { + public void delete(/*@NonNegative*/ /*@LessThan("#2 + 1")*/ int start, /*@NonNegative*/ int end, boolean notify) { if (end < start) { throw new IllegalArgumentException("Requires start <= end."); } From eb569c8db34973b38e87ec0118fd696b22bf002c Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Fri, 26 Jan 2018 15:40:37 -0800 Subject: [PATCH 38/79] reenable warnings suppressions in dynamic time series collection --- .../org/jfree/data/time/DynamicTimeSeriesCollection.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 5befe0bf9..21a6ce9ba 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -404,7 +404,7 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, + "cannot add more series than specified in c'tor"); } if (this.valueHistory[seriesNumber] == null) { - // @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + @SuppressWarnings("index") // this.historyCount is the length of this.pointsInTime /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[seriesNumber] = valueSequence; this.seriesCount++; @@ -467,7 +467,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer ); } if (this.valueHistory[seriesNumber] == null) { - // @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + @SuppressWarnings("index") // this.historyCount is the length of this.pointsInTime /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[seriesNumber] = valueSequence; this.seriesCount++; @@ -704,7 +704,7 @@ public void appendData(float[] newData) { // check whether the "valueHistory" array member exists; if not, // create them: if (this.valueHistory[s] == null) { - // @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + @SuppressWarnings("index") // this.historyCount is the length of this.pointsInTime /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } @@ -731,7 +731,7 @@ public void appendData(float[] newData, final /*@IndexFor("this.pointsInTime")*/ } for (int s = 0; s < nDataPoints; s++) { if (this.valueHistory[s] == null) { - // @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/194 this.historyCount is the length of this.pointsInTime + @SuppressWarnings("index") // this.historyCount is the length of this.pointsInTime /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } From 731eccd3bae8cfab609fbab3583af09427fd52d0 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Fri, 26 Jan 2018 15:45:44 -0800 Subject: [PATCH 39/79] Add Stat Checkers. --- ant/build.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ant/build.xml b/ant/build.xml index bf817ff73..014251e71 100644 --- a/ant/build.xml +++ b/ant/build.xml @@ -118,7 +118,7 @@ - + - + + From de276388688fcb6db6525853c38d41b9705095e1 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Fri, 26 Jan 2018 15:54:20 -0800 Subject: [PATCH 40/79] readd sws to xyBarRenderer --- src/main/java/org/jfree/data/xy/XYBarDataset.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index 01f2572f0..bc086c133 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -66,7 +66,7 @@ public class XYBarDataset extends AbstractIntervalXYDataset implements IntervalXYDataset, DatasetChangeListener, PublicCloneable { /** The underlying dataset. */ - private /*@SameLen("this")*/ XYDataset underlying; + private XYDataset underlying; /** The bar width. */ private double barWidth; @@ -78,7 +78,6 @@ public class XYBarDataset extends AbstractIntervalXYDataset * permitted). * @param barWidth the width of the bars. */ - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 public XYBarDataset(XYDataset underlying, double barWidth) { this.underlying = underlying; this.underlying.addChangeListener(this); @@ -128,6 +127,7 @@ public void setBarWidth(double barWidth) { * @return The series count. */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public /*@NonNegative*/ int getSeriesCount() { return this.underlying.getSeriesCount(); } @@ -153,6 +153,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getItemCount(series); } @@ -168,6 +169,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @see #getXValue(int, int) */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getX(series, item); } @@ -183,6 +185,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getX(int, int) */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getXValue(series, item); } @@ -198,6 +201,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getYValue(int, int) */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } @@ -213,6 +217,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getY(int, int) */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getYValue(series, item); } @@ -226,6 +231,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; Number xnum = this.underlying.getX(series, item); @@ -260,6 +266,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { Number result = null; Number xnum = this.underlying.getX(series, item); @@ -294,6 +301,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The value. */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } @@ -323,6 +331,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.underlying.getY(series, item); } From b1c6a5a03540ebedd07bc94bd5544fbaaa5f781e Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Fri, 26 Jan 2018 18:18:50 -0800 Subject: [PATCH 41/79] Run AnnotationStatistics and JavaCodeStatistics checkers --- ant/build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ant/build.xml b/ant/build.xml index 014251e71..37a19e554 100644 --- a/ant/build.xml +++ b/ant/build.xml @@ -127,7 +127,7 @@ source="${src.version}" target="${target.version}" includeantruntime="false"> - + From 31342e8d9cf7c6d3b9614bbf69a51dd20479ebdc Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sat, 27 Jan 2018 18:22:26 -0800 Subject: [PATCH 42/79] replace closed issue 195 with open and PR'd issue 218 --- src/main/java/org/jfree/chart/plot/CompassPlot.java | 2 +- .../org/jfree/chart/plot/DefaultDrawingSupplier.java | 12 ++++++------ src/main/java/org/jfree/data/xy/MatrixSeries.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 95472662a..136e023e9 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -704,7 +704,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, value = (data.getValue().doubleValue()) % this.revolutionDistance; value = value / this.revolutionDistance * 360; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 /*@IndexFor("this.seriesNeedle")*/ int current1 = i % x; current = current1; this.seriesNeedle[current].draw(g2, needleArea, value); diff --git a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java index 704788c99..99d6b00d0 100644 --- a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java +++ b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java @@ -215,7 +215,7 @@ public DefaultDrawingSupplier(Paint[] paintSequence, */ @Override public Paint getNextPaint() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 /*@IndexFor("this.paintSequence")*/ int index = this.paintIndex % this.paintSequence.length; Paint result = this.paintSequence[index]; @@ -230,7 +230,7 @@ public Paint getNextPaint() { */ @Override public Paint getNextOutlinePaint() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 /*@IndexFor("this.outlinePaintSequence")*/ int index = this.outlinePaintIndex % this.outlinePaintSequence.length; Paint result = this.outlinePaintSequence[index]; this.outlinePaintIndex++; @@ -246,7 +246,7 @@ public Paint getNextOutlinePaint() { */ @Override public Paint getNextFillPaint() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 /*@IndexFor("this.fillPaintSequence")*/ int index = this.fillPaintIndex % this.fillPaintSequence.length; Paint result = this.fillPaintSequence[index]; this.fillPaintIndex++; @@ -260,7 +260,7 @@ public Paint getNextFillPaint() { */ @Override public Stroke getNextStroke() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 /*@IndexFor("this.strokeSequence")*/ int index = this.strokeIndex % this.strokeSequence.length; Stroke result = this.strokeSequence[index]; this.strokeIndex++; @@ -274,7 +274,7 @@ public Stroke getNextStroke() { */ @Override public Stroke getNextOutlineStroke() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 /*@IndexFor("this.outlineStrokeSequence")*/ int index = this.outlineStrokeIndex % this.outlineStrokeSequence.length; Stroke result = this.outlineStrokeSequence[index]; this.outlineStrokeIndex++; @@ -288,7 +288,7 @@ public Stroke getNextOutlineStroke() { */ @Override public Shape getNextShape() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 /*@IndexFor("this.shapeSequence")*/ int index = this.shapeIndex % this.shapeSequence.length; Shape result = this.shapeSequence[index]; this.shapeIndex++; diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index cf719c1d4..f0dea7743 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -119,7 +119,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * * @return The column of the specified item. */ - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/195 + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 public /*@IndexFor("this.data")*/ int getItemColumn(/*@NonNegative*/ int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex % getColumnsCount(); From 66ca9715ae62534144e4cb37a4d87618122e253c Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sat, 27 Jan 2018 18:28:26 -0800 Subject: [PATCH 43/79] a bit of consolidation --- .../gantt/SlidingGanttCategoryDataset.java | 14 +++++------ .../org/jfree/data/general/DatasetUtils.java | 24 +++++++++---------- .../jfree/data/xy/DefaultHighLowDataset.java | 14 +++++------ .../org/jfree/data/xy/DefaultOHLCDataset.java | 14 +++++------ 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index 0ef2a5e84..c9952645b 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -330,7 +330,7 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + @SuppressWarnings("index") // True positive bug, fixed upstream Number result = this.underlying.getPercentComplete(r, c + this.firstCategoryIndex); return result; @@ -357,7 +357,7 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey, int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + @SuppressWarnings("index") // True positive bug, fixed upstream Number result = this.underlying.getPercentComplete(r, c + this.firstCategoryIndex, subinterval); return result; @@ -384,7 +384,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + @SuppressWarnings("index") // True positive bug, fixed upstream Number result = this.underlying.getEndValue(r, c + this.firstCategoryIndex, subinterval); return result; @@ -459,7 +459,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + @SuppressWarnings("index") // True positive bug, fixed upstream Number result = this.underlying.getStartValue(r, c + this.firstCategoryIndex, subinterval); return result; @@ -501,7 +501,7 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + @SuppressWarnings("index") // True positive bug, fixed upstream int result = this.underlying.getSubIntervalCount(r, c + this.firstCategoryIndex); return result; @@ -542,7 +542,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + @SuppressWarnings("index") // True positive bug, fixed upstream Number result = this.underlying.getStartValue(r, c + this.firstCategoryIndex); return result; @@ -583,7 +583,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c != -1) { - @SuppressWarnings("index") // I think this is a bug. Why isn't r being checked the same way c is checked? + @SuppressWarnings("index") // True positive bug, fixed upstream Number result = this.underlying.getEndValue(r, c + this.firstCategoryIndex); return result; } diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index f8fc0477d..e17bfb936 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -1029,7 +1029,7 @@ public static Range iterateToFindRangeBounds(CategoryDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); int itemCount = dataset.getColumnCount(); for (int item = 0; item < itemCount; item++) { @@ -1059,7 +1059,7 @@ else if (includeInterval Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { lvalue = icd.getStartValue(series, column); @@ -1082,7 +1082,7 @@ else if (includeInterval Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { List values = mvcd.getValues(series, column); @@ -1109,7 +1109,7 @@ else if (includeInterval Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { Number meanN = scd.getMeanValue(series, column); @@ -1136,7 +1136,7 @@ else if (includeInterval Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { Number value = dataset.getValue(series, column); @@ -1384,7 +1384,7 @@ public static Range iterateToFindDomainBounds(XYDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = ixyd.getItemCount(series); for (int item = 0; item < itemCount; item++) { @@ -1408,7 +1408,7 @@ public static Range iterateToFindDomainBounds(XYDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { @@ -1462,7 +1462,7 @@ public static Range iterateToFindRangeBounds(XYDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = ohlc.getItemCount(series); for (int item = 0; item < itemCount; item++) { @@ -1486,7 +1486,7 @@ else if (includeInterval && dataset instanceof BoxAndWhiskerXYDataset) { Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = bx.getItemCount(series); for (int item = 0; item < itemCount; item++) { @@ -1510,7 +1510,7 @@ else if (includeInterval && dataset instanceof IntervalXYDataset) { Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = ixyd.getItemCount(series); for (int item = 0; item < itemCount; item++) { @@ -1537,7 +1537,7 @@ else if (includeInterval && dataset instanceof IntervalXYDataset) { Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { @@ -1586,7 +1586,7 @@ public static Range iterateToFindZBounds(XYZDataset dataset, Iterator iterator = visibleSeriesKeys.iterator(); while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); - @SuppressWarnings("index") // guaranteed to be an index since getRowIndex called on a key known to be in the dataset + @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset /*@NonNegative*/ int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { diff --git a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java index 9ea524270..511842378 100644 --- a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java @@ -148,7 +148,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // the annotation on this method cannot expose the implementation detail of this class being backed by an array + @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = new Long(this.date[item].getTime()); return result; } @@ -166,7 +166,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getX(int, int) */ public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // the annotation on this method cannot expose the implementation detail of this class being backed by an array + @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Date result = this.date[item]; return result; } @@ -201,7 +201,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // the annotation on this method cannot expose the implementation detail of this class being backed by an array + @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.high[item]; return result; } @@ -239,7 +239,7 @@ public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer */ @Override public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // the annotation on this method cannot expose the implementation detail of this class being backed by an array + @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.low[item]; return result; } @@ -277,7 +277,7 @@ public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeri */ @Override public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // the annotation on this method cannot expose the implementation detail of this class being backed by an array + @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.open[item]; return result; } @@ -315,7 +315,7 @@ public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer */ @Override public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // the annotation on this method cannot expose the implementation detail of this class being backed by an array + @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.close[item]; return result; } @@ -353,7 +353,7 @@ public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSe */ @Override public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // the annotation on this method cannot expose the implementation detail of this class being backed by an array + @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.volume[item]; return result; } diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index f2860e8b6..f526e1559 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -100,7 +100,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = new Long(this.data[item].getDate().getTime()); return result; } @@ -114,7 +114,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The x-value as a date. */ public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Date result = this.data[item].getDate(); return result; } @@ -142,7 +142,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getHigh(); return result; } @@ -176,7 +176,7 @@ public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer */ @Override public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getLow(); return result; } @@ -210,7 +210,7 @@ public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeri */ @Override public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getOpen(); return result; } @@ -244,7 +244,7 @@ public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer */ @Override public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getClose(); return result; } @@ -278,7 +278,7 @@ public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSe */ @Override public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - @SuppressWarnings("index") // There is only one series for an OHLC dataset, so this is always safe. + @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getVolume(); return result; } From 59208e93b1f61662b297bd5ee26ed1d9136c488e Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sat, 27 Jan 2018 18:44:18 -0800 Subject: [PATCH 44/79] more consolidation --- src/main/java/org/jfree/chart/plot/CategoryPlot.java | 4 ++-- src/main/java/org/jfree/chart/plot/CompassPlot.java | 8 ++++---- .../renderer/category/AbstractCategoryItemRenderer.java | 4 ++-- .../org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java | 4 ++-- .../data/category/DefaultIntervalCategoryDataset.java | 8 ++++---- src/main/java/org/jfree/data/general/DatasetUtils.java | 4 ++-- .../org/jfree/data/time/DynamicTimeSeriesCollection.java | 4 ++-- .../java/org/jfree/data/xy/VectorSeriesCollection.java | 2 +- .../org/jfree/data/xy/XYIntervalSeriesCollection.java | 4 ++-- src/main/java/org/jfree/data/xy/XYSeriesCollection.java | 6 +++--- .../java/org/jfree/data/xy/YIntervalSeriesCollection.java | 4 ++-- 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index e74a934e5..5fa324f35 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -3618,12 +3618,12 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw the markers... for (CategoryItemRenderer renderer : this.renderers.values()) { - @SuppressWarnings("index") // renderer is one of the renderers of this object, so getIndexOf must return nonnegative + @SuppressWarnings("index") // guaranteed index: renderer is one of the renderers of this object, so getIndexOf must return nonnegative /*@NonNegative*/ int i = getIndexOf(renderer); drawDomainMarkers(g2, dataArea, i, Layer.BACKGROUND); } for (CategoryItemRenderer renderer : this.renderers.values()) { - @SuppressWarnings("index") // renderer is one of the renderers of this object, so getIndexOf must return nonnegative + @SuppressWarnings("index") // guaranteed index: renderer is one of the renderers of this object, so getIndexOf must return nonnegative /*@NonNegative*/ int i = getIndexOf(renderer); drawRangeMarkers(g2, dataArea, i, Layer.BACKGROUND); } diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 136e023e9..5f42c3ec2 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -170,11 +170,11 @@ public class CompassPlot extends Plot implements Cloneable, Serializable { private transient Rectangle2D rect1; /** An array of value datasets. */ - @SuppressWarnings("index") // this.datasets and this.seriesNeedle are always updated in tandem + @SuppressWarnings("index") // synced update: this.datasets and this.seriesNeedle are always updated in tandem private ValueDataset /*@MinLen(1)*/ /*@SameLen("this.seriesNeedle")*/ [] datasets = new ValueDataset[1]; /** An array of needles. */ - @SuppressWarnings("index") // this.datasets and this.seriesNeedle are always updated in tandem + @SuppressWarnings("index") // synced update: this.datasets and this.seriesNeedle are always updated in tandem private MeterNeedle /*@MinLen(1)*/ /*@SameLen("this.datasets")*/ [] seriesNeedle = new MeterNeedle[1]; /** The resourceBundle for the localization. */ @@ -559,10 +559,10 @@ public void addDataset(ValueDataset dataset, MeterNeedle needle) { ValueDataset[] a = this.datasets; MeterNeedle[] b = this.seriesNeedle; - @SuppressWarnings({"index", "value"}) // these two values are being changed together, but they go out of sync as the change occurs + @SuppressWarnings({"index", "value"}) // synced update: these two values are being changed together, but they go out of sync as the change occurs ValueDataset /*@MinLen(1)*/ /*@SameLen("this.seriesNeedle")*/ [] t0 = t; - @SuppressWarnings({"index", "value"}) // these two values are being changed together, but they go out of sync as the change occurs + @SuppressWarnings({"index", "value"}) // synced update: these two values are being changed together, but they go out of sync as the change occurs MeterNeedle /*@MinLen(1)*/ /*@SameLen("this.datasets")*/ [] p0 = p; this.datasets = t0; diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 3a703ac57..2cb02903b 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -697,14 +697,14 @@ public CategoryItemRendererState initialise(Graphics2D g2, int visibleSeriesCount = 0; for (int row = 0; row < rowCount; row++) { if (isSeriesVisible(row)) { - @SuppressWarnings("index") // visibleSeriesCount is incremented at most as many times as row, which is an index + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: visibleSeriesCount is incremented at most as many times as row, which is an index /*@IndexFor("visibleSeriesTemp")*/ int visibleSeriesCountTemp = visibleSeriesCount; visibleSeriesTemp[visibleSeriesCountTemp] = row; visibleSeriesCount++; } } /*@NonNegative*/ int[] visibleSeries = new int[visibleSeriesCount]; - @SuppressWarnings("index") // visibleSeriesCount is incremented at most as many times as row, which is an index + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: visibleSeriesCount is incremented at most as many times as row, which is an index /*@IndexOrHigh({"visibleSeriesTemp", "visibleSeries"})*/ int visibleSeriesCountTemp = visibleSeriesCount; System.arraycopy(visibleSeriesTemp, 0, visibleSeries, 0, visibleSeriesCountTemp); diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index f121ad977..4fa9319cf 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -228,9 +228,9 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, / (y[1] - y[0]) + x[0]; if (x.length == 3) { - @SuppressWarnings("index") // x's length is exactly one less than both nx and ny; x and y's lengths are the same + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: x's length is exactly one less than both nx and ny; x and y's lengths are the same double dead = (nx[3] = x[2]); - @SuppressWarnings("index") // x's length is exactly one less than both nx and ny; x and y's lengths are the same + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: x's length is exactly one less than both nx and ny; x and y's lengths are the same double dead2 = (ny[3] = y[2]); } x = nx; y = ny; diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index f823b422d..d6b766bb3 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -468,7 +468,7 @@ public Number getStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int ca } // fetch the value... - @SuppressWarnings("index") // that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. + @SuppressWarnings("index") // array-list interop: that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. Number result = this.startData[series][category]; return result; } @@ -519,7 +519,7 @@ public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int cate "DefaultIntervalCategoryDataset.getValue(): " + "category index out of range."); } - @SuppressWarnings("index") // that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. + @SuppressWarnings("index") // array-list interop: that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. Number result = this.endData[series][category]; return result; } @@ -552,7 +552,7 @@ public void setStartValue(/*@NonNegative*/ int series, Comparable category, Numb } // update the data... - @SuppressWarnings("index") // that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. + @SuppressWarnings("index") // array-list interop: that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. Number tmp = (this.startData[series][categoryIndex] = value); fireDatasetChanged(); @@ -586,7 +586,7 @@ public void setEndValue(/*@NonNegative*/ int series, Comparable category, Number } // update the data... - @SuppressWarnings("index") // that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. + @SuppressWarnings("index") // array-list interop: that these are indices into these arrays is an implementation detail. Most implementations of this interface are backed by a list. Number tmp = (this.endData[series][categoryIndex] = value); fireDatasetChanged(); diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index e17bfb936..a540111c9 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -2288,10 +2288,10 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, return Double.NaN; } - @SuppressWarnings("index") // the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. + @SuppressWarnings("index") // guaranteed index: the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. /*@IndexFor("dataset.getSeries(series)")*/ int indices0 = indices[0]; - @SuppressWarnings("index") // the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. + @SuppressWarnings("index") // guaranteed index: the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. /*@IndexFor("dataset.getSeries(series)")*/ int indices1 = indices[1]; if (indices0 == indices1) { diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 21a6ce9ba..e26aec50b 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -413,12 +413,12 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, // Avoid IndexOutOfBoundsException: int srcLength = values.length; - @SuppressWarnings("index") // this.valueHistory[seriesNumber]'s length is <= this.historyCount + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: this.valueHistory[seriesNumber]'s length is <= this.historyCount /*@LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"})*/ int copyLength = this.historyCount; boolean fillNeeded = false; if (srcLength < this.historyCount) { fillNeeded = true; - @SuppressWarnings("index") // this.valueHistory[seriesNumber]'s length is <= this.historyCount + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: this.valueHistory[seriesNumber]'s length is <= this.historyCount /*@LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"})*/ int newCopyLength = srcLength; copyLength = newCopyLength; } diff --git a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java index d8e9b26be..a72db1ac1 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java @@ -195,7 +195,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java index 06844a82b..f85ecbd8c 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java @@ -45,7 +45,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -147,7 +147,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); diff --git a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java index d68931635..64ba0eafe 100644 --- a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java @@ -344,7 +344,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); @@ -373,7 +373,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting X value. */ @Override - @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -387,7 +387,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending X value. */ @Override - @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getEndX(series, item); } diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java index 3c7710491..b21f43c2c 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java @@ -45,7 +45,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -147,7 +147,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated because some series are mutable + @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); From 280a385c01041e1e0649e84e48333f98573c753e Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sat, 27 Jan 2018 19:04:14 -0800 Subject: [PATCH 45/79] more consolidation --- src/main/java/org/jfree/chart/axis/MonthDateFormat.java | 2 +- src/main/java/org/jfree/chart/axis/QuarterDateFormat.java | 2 +- src/main/java/org/jfree/chart/axis/TickUnits.java | 6 +++--- src/main/java/org/jfree/chart/date/SerialDate.java | 2 +- src/main/java/org/jfree/chart/plot/XYPlot.java | 4 ++-- .../java/org/jfree/chart/util/DefaultShadowGenerator.java | 4 ++-- .../jfree/data/category/DefaultIntervalCategoryDataset.java | 4 ++-- src/main/java/org/jfree/data/general/DatasetUtils.java | 4 ++-- src/main/java/org/jfree/data/time/Day.java | 2 +- src/main/java/org/jfree/data/time/Hour.java | 2 +- src/main/java/org/jfree/data/time/Millisecond.java | 2 +- src/main/java/org/jfree/data/time/Minute.java | 2 +- src/main/java/org/jfree/data/time/Month.java | 2 +- src/main/java/org/jfree/data/time/Quarter.java | 2 +- src/main/java/org/jfree/data/time/Second.java | 2 +- src/main/java/org/jfree/data/time/Week.java | 6 +++--- src/main/java/org/jfree/data/time/Year.java | 2 +- src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java | 4 ++-- src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java | 4 ++-- 19 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java index 24b62aaa6..f8cd721de 100644 --- a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java @@ -207,7 +207,7 @@ public MonthDateFormat(TimeZone zone, Locale locale, int chars, public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { this.calendar.setTime(date); - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation /*@IntRange(from=0, to=11)*/ int month = this.calendar.get(Calendar.MONTH); toAppendTo.append(this.months[month]); if (this.showYear[month]) { diff --git a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java index 8b0958b59..2d7991121 100644 --- a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java @@ -159,7 +159,7 @@ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { this.calendar.setTime(date); int year = this.calendar.get(Calendar.YEAR); - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation /*@IntRange(from=0, to=11)*/ int month = this.calendar.get(Calendar.MONTH); int quarter = month / 3; if (this.quarterFirst) { diff --git a/src/main/java/org/jfree/chart/axis/TickUnits.java b/src/main/java/org/jfree/chart/axis/TickUnits.java index f23e91518..ba9503edf 100644 --- a/src/main/java/org/jfree/chart/axis/TickUnits.java +++ b/src/main/java/org/jfree/chart/axis/TickUnits.java @@ -54,7 +54,7 @@ */ package org.jfree.chart.axis; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ import java.io.Serializable; import java.text.NumberFormat; @@ -127,7 +127,7 @@ public TickUnit get(/*@NonNegative*/ int pos) { * @return A tick unit that is larger than the supplied unit. */ @Override - @SuppressWarnings("index") // binarySearch on list + @SuppressWarnings("index") // binary search on list public TickUnit getLargerTickUnit(TickUnit unit) { int index = Collections.binarySearch(this.tickUnits, unit); if (index >= 0) { @@ -150,7 +150,7 @@ public TickUnit getLargerTickUnit(TickUnit unit) { * @return A unit from the collection. */ @Override - @SuppressWarnings("index") // binarySearch on list + @SuppressWarnings("index") // binary search on list public TickUnit getCeilingTickUnit(TickUnit unit) { int index = Collections.binarySearch(this.tickUnits, unit); if (index >= 0) { diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index 30322aa93..f3823d118 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -768,7 +768,7 @@ public static SerialDate createInstance(/*@IntRange(from = 2, to = 2958465)*/ in * * @return a instance of SerialDate. */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public static SerialDate createInstance(java.util.Date date) { GregorianCalendar calendar = new GregorianCalendar(); diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 5fedaea92..518fbaab1 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -3273,12 +3273,12 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw the markers that are associated with a specific dataset... for (XYDataset dataset: this.datasets.values()) { - @SuppressWarnings("index") // dataset is definitely a valid dataset, so its index will be nonnegative + @SuppressWarnings("index") // guaranteed index: dataset is definitely a valid dataset, so its index will be nonnegative /*@NonNegative*/ int datasetIndex = indexOf(dataset); drawDomainMarkers(g2, dataArea, datasetIndex, Layer.BACKGROUND); } for (XYDataset dataset: this.datasets.values()) { - @SuppressWarnings("index") // dataset is definitely a valid dataset, so its index will be nonnegative + @SuppressWarnings("index") // guaranteed index: dataset is definitely a valid dataset, so its index will be nonnegative /*@NonNegative*/ int datasetIndex = indexOf(dataset); drawRangeMarkers(g2, dataArea, datasetIndex, Layer.BACKGROUND); } diff --git a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java index c292fd6ac..89ab2562c 100644 --- a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java +++ b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java @@ -239,7 +239,7 @@ protected void applyShadow(BufferedImage image) { @SuppressWarnings("index") // dataBuffer has an internal structure: it's divided into dstHeight sections of dstWidth. We iterate through dstHeight with y, and bufferOffset moves through the width int dead = (dataBuffer[bufferOffset] = a << 24 | shadowRgb); - @SuppressWarnings("index") // historyIdx is always less than this.shadowSize, which is the length of aHistory + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: historyIdx is always less than this.shadowSize, which is the length of aHistory /*@IndexFor("aHistory")*/ int historyIdx1 = historyIdx; // substract the oldest pixel from the sum @@ -277,7 +277,7 @@ protected void applyShadow(BufferedImage image) { @SuppressWarnings("index") // dataBuffer has an internal structure: it's divided into dstHeight sections of dstWidth. We iterate through dstWidth with x, and bufferOffset moves through the height int dead = (dataBuffer[bufferOffset] = a << 24 | shadowRgb); - @SuppressWarnings("index") // historyIdx is always less than this.shadowSize, which is the length of aHistory + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: historyIdx is always less than this.shadowSize, which is the length of aHistory /*@IndexFor("aHistory")*/ int historyIdx1 = historyIdx; // substract the oldest pixel from the sum diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index d6b766bb3..08aa9810f 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -641,7 +641,7 @@ private Comparable[] generateKeys(/*@NonNegative*/ int count, String prefix) { * @see #getRowKey(int) */ @Override - @SuppressWarnings("index") // because this underlying array isn't exposed by the interface this method is inherited from, there is no way to write an upperbound annotation on column + @SuppressWarnings("index") // array-list interop: because this underlying array isn't exposed by the interface this method is inherited from, there is no way to write an upperbound annotation on column public Comparable getColumnKey(/*@NonNegative*/ int column) { return this.categoryKeys[column]; } @@ -705,7 +705,7 @@ public List getRowKeys() { * @see #getColumnKey(int) */ @Override - @SuppressWarnings("index") // because this underlying array isn't exposed by the interface this method is inherited from, there is no way to write an upperbound annotation on column + @SuppressWarnings("index") // array-list interop: because this underlying array isn't exposed by the interface this method is inherited from, there is no way to write an upperbound annotation on column public Comparable getRowKey(/*@NonNegative*/ int row) { if ((row >= getRowCount()) || (row < 0)) { throw new IllegalArgumentException( diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index a540111c9..1efd8ad79 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -2333,7 +2333,7 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, return new int[] {-1, -1}; } if (itemCount == 1) { - @SuppressWarnings("index") // 0 is a valid index, because itemCount is at least 1 + @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; double xValue = dataset.getXValue(series, zero); if (x == xValue) { @@ -2410,7 +2410,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // we don't know anything about the ordering of the x-values, // so we iterate until we find the first crossing of x (if any) // we know there are at least 2 items in the series at this point - @SuppressWarnings("index") // 0 is a valid index, because itemCount is at least 1 + @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; double prev = dataset.getXValue(series, zero); if (x == prev) { diff --git a/src/main/java/org/jfree/data/time/Day.java b/src/main/java/org/jfree/data/time/Day.java index 86981967c..7ba4ea5a0 100644 --- a/src/main/java/org/jfree/data/time/Day.java +++ b/src/main/java/org/jfree/data/time/Day.java @@ -164,7 +164,7 @@ public Day(Date time) { * @param zone the time zone ({@code null} not permitted). * @param locale the locale ({@code null} not permitted). */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Day(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); diff --git a/src/main/java/org/jfree/data/time/Hour.java b/src/main/java/org/jfree/data/time/Hour.java index c8b63609f..951085c06 100644 --- a/src/main/java/org/jfree/data/time/Hour.java +++ b/src/main/java/org/jfree/data/time/Hour.java @@ -156,7 +156,7 @@ public Hour(Date time) { * * @since 1.0.13 */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Hour(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); diff --git a/src/main/java/org/jfree/data/time/Millisecond.java b/src/main/java/org/jfree/data/time/Millisecond.java index a1f7d8b33..47269f7e3 100644 --- a/src/main/java/org/jfree/data/time/Millisecond.java +++ b/src/main/java/org/jfree/data/time/Millisecond.java @@ -162,7 +162,7 @@ public Millisecond(Date time) { * * @since 1.0.13 */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Millisecond(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/Minute.java b/src/main/java/org/jfree/data/time/Minute.java index cd024d260..642ac86e0 100644 --- a/src/main/java/org/jfree/data/time/Minute.java +++ b/src/main/java/org/jfree/data/time/Minute.java @@ -148,7 +148,7 @@ public Minute(Date time) { * * @since 1.0.13 */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Minute(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); diff --git a/src/main/java/org/jfree/data/time/Month.java b/src/main/java/org/jfree/data/time/Month.java index 5c64f8a1b..d8ca2ce17 100644 --- a/src/main/java/org/jfree/data/time/Month.java +++ b/src/main/java/org/jfree/data/time/Month.java @@ -155,7 +155,7 @@ public Month(Date time) { * * @since 1.0.12 */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Month(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index 97b444ab5..841909805 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -173,7 +173,7 @@ public Quarter(Date time) { * * @since 1.0.12 */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Quarter(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/Second.java b/src/main/java/org/jfree/data/time/Second.java index d435489e1..b198d76d6 100644 --- a/src/main/java/org/jfree/data/time/Second.java +++ b/src/main/java/org/jfree/data/time/Second.java @@ -163,7 +163,7 @@ public Second(Date time) { * * @since 1.0.13 */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Second(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/time/Week.java b/src/main/java/org/jfree/data/time/Week.java index 92f95d941..7240e1c08 100644 --- a/src/main/java/org/jfree/data/time/Week.java +++ b/src/main/java/org/jfree/data/time/Week.java @@ -180,7 +180,7 @@ public Week(Date time) { * * @since 1.0.7 */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Week(Date time, TimeZone zone, Locale locale) { Args.nullNotPermitted(time, "time"); Args.nullNotPermitted(zone, "zone"); @@ -303,7 +303,7 @@ public RegularTimePeriod previous() { int yy = this.year - 1; Calendar prevYearCalendar = Calendar.getInstance(); prevYearCalendar.set(yy, Calendar.DECEMBER, 31); - @SuppressWarnings({"index", "value"}) // calendar.getActualMaximum is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.getActualMaximum is a combined getter for various calendar fields, and therefore has no sensical annotation Week resultTmp = new Week(prevYearCalendar.getActualMaximum( Calendar.WEEK_OF_YEAR), yy); result = resultTmp; @@ -335,7 +335,7 @@ public RegularTimePeriod next() { else { Calendar calendar = Calendar.getInstance(); calendar.set(this.year, Calendar.DECEMBER, 31); - @SuppressWarnings({"index", "value"}) // calendar.getActualMaximum is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.getActualMaximum is a combined getter for various calendar fields, and therefore has no sensical annotation /*@IntRange(from = 52, to = 53)*/ int actualMaxWeek = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); if (this.week < actualMaxWeek) { diff --git a/src/main/java/org/jfree/data/time/Year.java b/src/main/java/org/jfree/data/time/Year.java index 3aa79fa84..04bf27a01 100644 --- a/src/main/java/org/jfree/data/time/Year.java +++ b/src/main/java/org/jfree/data/time/Year.java @@ -144,7 +144,7 @@ public Year(Date time) { * * @since 1.0.12 */ - @SuppressWarnings({"index", "value"}) // calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation + @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation public Year(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); diff --git a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java index be80188d9..c87e24c90 100644 --- a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java @@ -228,7 +228,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting X value. */ @Override - @SuppressWarnings("index") // interval delegate and this.getSeries have the same conceptual length + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -242,7 +242,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending X value. */ @Override - @SuppressWarnings("index") // interval delegate and this.getSeries have the same conceptual length + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getEndX(series, item); } diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index deeadca78..af7b765fc 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -301,7 +301,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting X value. */ @Override - @SuppressWarnings("index") // interval delegate and this.getSeries have the same conceptual length + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getStartX(series, item); } @@ -315,7 +315,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending X value. */ @Override - @SuppressWarnings("index") // interval delegate and this.getSeries have the same conceptual length + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { return this.intervalDelegate.getEndX(series, item); } From 67d6f8719a2e1df30b55377daf120fe05464779f Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sat, 27 Jan 2018 19:18:03 -0800 Subject: [PATCH 46/79] a few more consolidations in jfc --- src/main/java/org/jfree/chart/plot/CategoryPlot.java | 8 ++++---- src/main/java/org/jfree/chart/plot/XYPlot.java | 4 ++-- .../renderer/category/AbstractCategoryItemRenderer.java | 2 +- src/main/java/org/jfree/data/general/DatasetUtils.java | 4 ++-- src/main/java/org/jfree/data/statistics/Regression.java | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 5fa324f35..2711e3f8b 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -3404,7 +3404,7 @@ protected AxisSpace calculateDomainAxisSpace(Graphics2D g2, // reserve space for any domain axes... for (CategoryAxis xAxis : this.domainAxes.values()) { if (xAxis != null) { - @SuppressWarnings("index") // xAxis is guaranteed to be in the set, so IndexOf returns NN + @SuppressWarnings("index") // guaranteed index: xAxis is guaranteed to be in the set, so IndexOf returns NN /*@NonNegative*/ int i = getDomainAxisIndex(xAxis); RectangleEdge edge = getDomainAxisEdge(i); space = xAxis.reserveSpace(g2, this, plotArea, edge, space); @@ -3449,7 +3449,7 @@ protected AxisSpace calculateRangeAxisSpace(Graphics2D g2, // reserve space for the range axes (if any)... for (ValueAxis yAxis : this.rangeAxes.values()) { if (yAxis != null) { - @SuppressWarnings("index") // yAxis is guaranteed to be in the set, so indexOf returns NN + @SuppressWarnings("index") // guaranteed index: yAxis is guaranteed to be in the set, so indexOf returns NN /*@NonNegative*/ int i = findRangeAxisIndex(yAxis); RectangleEdge edge = getRangeAxisEdge(i); space = yAxis.reserveSpace(g2, this, plotArea, edge, space); @@ -3802,7 +3802,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add domain axes to lists... for (CategoryAxis xAxis : this.domainAxes.values()) { if (xAxis != null) { - @SuppressWarnings("index") // xAxis is guaranteed to have an index, so getDomainAxisIndex return NN + @SuppressWarnings("index") // guaranteed index: xAxis is guaranteed to have an index, so getDomainAxisIndex return NN /*@NonNegative*/ int index = getDomainAxisIndex(xAxis); axisCollection.add(xAxis, getDomainAxisEdge(index)); } @@ -3811,7 +3811,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add range axes to lists... for (ValueAxis yAxis : this.rangeAxes.values()) { if (yAxis != null) { - @SuppressWarnings("index") // yAxis is guaranteed to have an index, so getRangeAxisIndex return NN + @SuppressWarnings("index") // guaranteed index: yAxis is guaranteed to have an index, so getRangeAxisIndex return NN /*@NonNegative*/ int index = findRangeAxisIndex(yAxis); axisCollection.add(yAxis, getRangeAxisEdge(index)); } diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 518fbaab1..621b10ee0 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -3321,7 +3321,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw domain crosshair if required... int datasetIndex = crosshairState.getDatasetIndex(); ValueAxis xAxis = getDomainAxisForDataset(datasetIndex); - @SuppressWarnings("index") // xAxis was just fetched out of the dataset, so getDomainAxisIndex will return NN + @SuppressWarnings("index") // guaranteed index: xAxis was just fetched out of the dataset, so getDomainAxisIndex will return NN RectangleEdge xAxisEdge = getDomainAxisEdge(getDomainAxisIndex(xAxis)); if (!this.domainCrosshairLockedOnData && anchor != null) { double xx; @@ -3343,7 +3343,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw range crosshair if required... ValueAxis yAxis = getRangeAxisForDataset(datasetIndex); - @SuppressWarnings("index") // yAxis was just fetched out of the dataset, so getRangeAxisIndex will return NN + @SuppressWarnings("index") // guaranteed index: yAxis was just fetched out of the dataset, so getRangeAxisIndex will return NN RectangleEdge yAxisEdge = getRangeAxisEdge(getRangeAxisIndex(yAxis)); if (!this.rangeCrosshairLockedOnData && anchor != null) { double yy; diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 2cb02903b..b70b1fbaf 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -1592,7 +1592,7 @@ public LegendItemCollection getLegendItems() { if (this.plot == null) { return result; } - @SuppressWarnings("index") // this.plot.getIndexOf(this) is always non negative, since this.plot is the plot associated with the renderer + @SuppressWarnings("index") // guaranteed index: this.plot.getIndexOf(this) is always non negative, since this.plot is the plot associated with the renderer /*@NonNegative*/ int index = this.plot.getIndexOf(this); CategoryDataset dataset = this.plot.getDataset(index); if (dataset == null) { diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 1efd8ad79..55f43dfb3 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -2343,7 +2343,7 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, } } if (dataset.getDomainOrder() == DomainOrder.ASCENDING) { - @SuppressWarnings("index") // 0 is an index, because itemCount > 1 + @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; @SuppressWarnings("index") // itemCount - 1 is an index, because itemCount > 1 /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; @@ -2378,7 +2378,7 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, return new int[] {low, high}; } else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { - @SuppressWarnings("index") // 0 is an index, because itemCount > 1 + @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 /*@IndexFor("dataset.getSeries(series)")*/ int high = 0; @SuppressWarnings("index") // itemCount - 1 is an index, because itemCount > 1 /*@IndexFor("dataset.getSeries(series)")*/ int low = itemCount - 1; diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index 192586de7..bddedb656 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -270,7 +270,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, if (!Double.isNaN(x) && !Double.isNaN(y)){ data[0][validItems] = x; data[1][validItems] = y; - @SuppressWarnings("index") // validItems is incremented at most as often as item, which is a valid index + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: validItems is incremented at most as often as item, which is a valid index /*@LTLengthOf(value={"data[0]","data[1]"}, offset={"0","0"})*/ /*@NonNegative*/ int validItemsTmp = validItems + 1; validItems = validItemsTmp; } From 6c78aed2576156c6709cf057dd31b87f8eb422fe Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sat, 27 Jan 2018 20:00:38 -0800 Subject: [PATCH 47/79] almost finished with consolidation --- src/main/java/org/jfree/chart/plot/CategoryPlot.java | 2 +- src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java | 2 +- src/main/java/org/jfree/chart/plot/PiePlot.java | 2 +- .../org/jfree/chart/renderer/DefaultPolarItemRenderer.java | 4 ++-- .../org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java | 4 ++-- .../java/org/jfree/chart/renderer/xy/XYSplineRenderer.java | 2 +- src/main/java/org/jfree/chart/text/TextUtils.java | 2 +- src/main/java/org/jfree/data/ComparableObjectSeries.java | 2 +- src/main/java/org/jfree/data/DefaultKeyedValues2D.java | 4 ++-- .../jfree/data/category/DefaultIntervalCategoryDataset.java | 4 ++-- src/main/java/org/jfree/data/io/CSV.java | 2 +- src/main/java/org/jfree/data/statistics/Regression.java | 2 +- .../java/org/jfree/data/time/TimePeriodValuesCollection.java | 2 +- src/main/java/org/jfree/data/time/TimeSeriesCollection.java | 2 +- src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java | 2 +- src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java | 2 +- src/main/java/org/jfree/data/xy/MatrixSeries.java | 2 +- src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java | 2 +- .../java/org/jfree/data/xy/XIntervalSeriesCollection.java | 4 ++-- src/main/java/org/jfree/data/xy/XYDatasetTableModel.java | 2 +- src/main/java/org/jfree/data/xy/XYSeries.java | 4 ++-- 21 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 2711e3f8b..325432d45 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -2192,7 +2192,7 @@ public LegendItemCollection getLegendItems() { // get the legend items for the datasets... for (CategoryDataset dataset: this.datasets.values()) { if (dataset != null) { - @SuppressWarnings("index") // indexOf cannot return -1 here because we're looking up the indexOf an element we already know is in the dataset + @SuppressWarnings("index") // guaranteed index: indexOf cannot return -1 here because we're looking up the indexOf an element we already know is in the dataset /*@NonNegative*/ int datasetIndex = indexOf(dataset); CategoryItemRenderer renderer = getRenderer(datasetIndex); if (renderer != null) { diff --git a/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java b/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java index 7d4a8808b..b25125951 100644 --- a/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java +++ b/src/main/java/org/jfree/chart/plot/CombinedDomainXYPlot.java @@ -616,7 +616,7 @@ public void panRangeAxes(double panRange, PlotRenderingInfo info, if (!subplot.isRangePannable()) { return; } - @SuppressWarnings("index") // getSubplotIndex is guaranteed to return non-negative because if the subplot isn't found, then subplot would have been null above and the function would have returned. + @SuppressWarnings("index") // guaranteed index: getSubplotIndex is guaranteed to return non-negative because if the subplot isn't found, then subplot would have been null above and the function would have returned. PlotRenderingInfo subplotInfo = info.getSubplotInfo( info.getSubplotIndex(source)); if (subplotInfo == null) { diff --git a/src/main/java/org/jfree/chart/plot/PiePlot.java b/src/main/java/org/jfree/chart/plot/PiePlot.java index 136907ae4..3e2a69c09 100644 --- a/src/main/java/org/jfree/chart/plot/PiePlot.java +++ b/src/main/java/org/jfree/chart/plot/PiePlot.java @@ -2966,7 +2966,7 @@ public LegendItemCollection getLegendItems() { false, // line not visible new Line2D.Float(), new BasicStroke(), Color.BLACK); item.setDataset(getDataset()); - @SuppressWarnings("index") // key came from the list of keys for this dataset, so getIndex has to return non-negative + @SuppressWarnings("index") // guaranteed index: key came from the list of keys for this dataset, so getIndex has to return non-negative /*@NonNegative*/ int newSeriesIndex = this.dataset.getIndex(key); item.setSeriesIndex(newSeriesIndex); item.setSeriesKey(key); diff --git a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java index 0659d4201..0ce4f8aa4 100644 --- a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java @@ -589,7 +589,7 @@ public void drawSeries(Graphics2D g2, Rectangle2D dataArea, // data area... if (entities != null && ShapeUtils.isPointInRect(dataArea, x, y)) { - @SuppressWarnings("index") // i - 1 is an index because the i increases once on each iteration of this while loop, and the loop condition is equivalent to the length of this series + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: i - 1 is an index because the i increases once on each iteration of this while loop, and the loop condition is equivalent to the length of this series /*@IndexFor("dataset.getSeries(seriesIndex)")*/ int i1 = i - 1; addEntity(entities, shape, dataset, seriesIndex, i1, x, y); } @@ -698,7 +698,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int series) { if (plot == null) { return null; } - @SuppressWarnings("index") // this renderer belongs to the plot, so plot.getIndexOf returns a non negative + @SuppressWarnings("index") // guaranteed index: this renderer belongs to the plot, so plot.getIndexOf returns a non negative XYDataset dataset = plot.getDataset(plot.getIndexOf(this)); if (dataset == null) { return null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java index bd9320fd3..9758b2fa2 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java @@ -816,7 +816,7 @@ public LegendItemCollection getLegendItems() { return new LegendItemCollection(); } LegendItemCollection result = new LegendItemCollection(); - @SuppressWarnings("index") // this is guaranteed to be a renderer for this.plot, so indexOf will return nonnegative + @SuppressWarnings("index") // guaranteed index: this is guaranteed to be a renderer for this.plot, so indexOf will return nonnegative /*@NonNegative*/ int index = this.plot.getIndexOf(this); XYDataset dataset = this.plot.getDataset(index); if (dataset != null) { @@ -1690,7 +1690,7 @@ else if (layer.equals(Layer.BACKGROUND)) { } while (iterator.hasNext()) { XYAnnotation annotation = (XYAnnotation) iterator.next(); - @SuppressWarnings("index") // this is a renderer of this.plot by definition, so indexOf will return nonnegative + @SuppressWarnings("index") // guaranteed index: this is a renderer of this.plot by definition, so indexOf will return nonnegative /*@NonNegative*/ int index = this.plot.getIndexOf(this); annotation.draw(g2, this.plot, dataArea, domainAxis, rangeAxis, index, info); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java index 85682217e..e20bc7af2 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java @@ -376,7 +376,7 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, s.seriesPath.lineTo(cp1.getX(), cp1.getY()); } else { // construct spline - @SuppressWarnings({"index", "value"}) // list/array interop; s.points is minlen 3 at this point + @SuppressWarnings({"index", "value"}) // array-list interop: s.points is minlen 3 at this point /*@IntRange(from = 3)*/ int np = s.points.size(); // number of points float[] d = new float[np]; // Newton form coefficients float[] x = new float[np]; // x-coordinates of nodes diff --git a/src/main/java/org/jfree/chart/text/TextUtils.java b/src/main/java/org/jfree/chart/text/TextUtils.java index 440ad5816..39743e3a2 100644 --- a/src/main/java/org/jfree/chart/text/TextUtils.java +++ b/src/main/java/org/jfree/chart/text/TextUtils.java @@ -178,7 +178,7 @@ public static TextBlock createTextBlock(String text, Font font, next++; // we must take one more character or we'll loop forever } - @SuppressWarnings("index") // next is either < current < text.length, or next = current + 1 <= text.length + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: next is either < current < text.length, or next = current + 1 <= text.length /*@IndexOrHigh("text")*/ int next1 = next; result.addLine(text.substring(current, next1), font, paint); diff --git a/src/main/java/org/jfree/data/ComparableObjectSeries.java b/src/main/java/org/jfree/data/ComparableObjectSeries.java index 79f04d8f6..f3d30ee36 100644 --- a/src/main/java/org/jfree/data/ComparableObjectSeries.java +++ b/src/main/java/org/jfree/data/ComparableObjectSeries.java @@ -384,7 +384,7 @@ protected ComparableObjectItem remove(/*@NonNegative*/ int index) { * @return The item removed. */ - @SuppressWarnings("index") // method precondition is that this element is in the list, so indexOf will return NN + @SuppressWarnings("index") // guaranteed index: method precondition is that this element is in the list, so indexOf will return NN public ComparableObjectItem remove(Comparable x) { return remove(indexOf(x)); } diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java index c968b56ea..1031e5acc 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java @@ -57,7 +57,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ +/*>>> import org.checkerframework.dataflow.qual.Pure; */ /*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; */ @@ -366,7 +366,7 @@ public void removeValue(Comparable rowKey, Comparable columnKey) { // 1. check whether the row is now empty. boolean allNull = true; - @SuppressWarnings("index") // this method assumes that the rowKey is valid, which can't be checked b/c it's a list + @SuppressWarnings("index") // array-list interop: this method assumes that the rowKey is valid, which can't be checked b/c it's a list /*@NonNegative*/ int rowIndex = getRowIndex(rowKey); DefaultKeyedValues row = (DefaultKeyedValues) this.rows.get(rowIndex); diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index 08aa9810f..df5b7a412 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -281,7 +281,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { if ((series >= getSeriesCount()) || (series < 0)) { throw new IllegalArgumentException("No such series : " + series); } - @SuppressWarnings("index") // getSeriesCount() should be annotated as LengthOf, but because most implementations of this interface implement the series with a list it isn't + @SuppressWarnings("index") // array-list interop: getSeriesCount() should be annotated as LengthOf, but because most implementations of this interface implement the series with a list it isn't Comparable result = this.seriesKeys[series]; return result; } @@ -316,7 +316,7 @@ public void setSeriesKeys(Comparable[] seriesKeys) { int result = 0; if (this.startData != null) { if (getSeriesCount() > 0) { - @SuppressWarnings("index") // getSeriesCount is the length of startData, but can't be annotated that way b/c implementation detail + @SuppressWarnings("index") // array-list interop: getSeriesCount is the length of startData, but can't be annotated that way b/c implementation detail int newResult = this.startData[0].length; result = newResult; } diff --git a/src/main/java/org/jfree/data/io/CSV.java b/src/main/java/org/jfree/data/io/CSV.java index 9ac0868fa..59362bcfd 100644 --- a/src/main/java/org/jfree/data/io/CSV.java +++ b/src/main/java/org/jfree/data/io/CSV.java @@ -138,7 +138,7 @@ private List extractColumnKeys(String line) { fieldIndex++; } } - @SuppressWarnings("index") // the for loop above cannot increment start more than line.length times, so start is IOH of line + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: the for loop above cannot increment start more than line.length times, so start is IOH of line String key = line.substring(start, line.length()); keys.add(removeStringDelimiters(key)); return keys; diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index bddedb656..b2f16cbdd 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -353,7 +353,7 @@ private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen( // I added the second condition here - matrix is rectangular, and this is the easiest way to guarantee this typechecks for (int coe = 1; coe < matrix[eq].length && coe < matrix[0].length; coe++) { int resultEq = eq - 1; - @SuppressWarnings("index") // result is one smaller in both dimensions than matrix, and coe is an index for matrix. Also note the use of a temporary here: the Index Checker's java expression parser chokes on "result[eq - 1]" + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: result is one smaller in both dimensions than matrix, and coe is an index for matrix. Also note the use of a temporary here: the Index Checker's java expression parser chokes on "result[eq - 1]" /*@IndexFor("result[resultEq]")*/ int resultCoe = coe -1; result[resultEq][resultCoe] = matrix[0][coe] - matrix[eq][coe] * factor; diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index fbfb7e102..a9c95a689 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -221,7 +221,7 @@ public void removeSeries(/*@NonNegative*/ int index) { * @return The number of items in the specified series. */ @Override - @SuppressWarnings("index") // getSeries(series).getItemCount is LengthOf(this.getSeries) + @SuppressWarnings("index") // array-list interop: getSeries(series).getItemCount is LengthOf(this.getSeries) public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index a965b03ae..62e1d3a24 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -405,7 +405,7 @@ public void removeAllSeries() { * @return The item count. */ @Override - @SuppressWarnings("index") // getSeries(series).getItemCount is LengthOf(this.getSeries(series) + @SuppressWarnings("index") // array-list interop: getSeries(series).getItemCount is LengthOf(this.getSeries) public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return getSeries(series).getItemCount(); } diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index f526e1559..f8e2a7979 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -320,7 +320,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The item count. */ @Override - @SuppressWarnings("index") // this.data is the same length as the conceptual getSeries called with any argument, but no SameLen annotation can express that due to the argument needed for getSeries + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209: this.data is the same length as the conceptual getSeries called with any argument, but no SameLen annotation can express that due to the argument needed for getSeries public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.data.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index af7b765fc..79b5786eb 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -451,7 +451,7 @@ public void removeAllValuesForX(Number x) { * * @return A boolean. */ - @SuppressWarnings("index") // this method assumes that x is in the dataset. This is a documentation bug. + @SuppressWarnings("index") // documentation bug: this method assumes that x is in the dataset. This is a documentation bug. protected boolean canPrune(Number x) { for (int s = 0; s < this.data.size(); s++) { XYSeries series = (XYSeries) this.data.get(s); diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index f0dea7743..ddf47e59b 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -86,7 +86,7 @@ public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int * * @return The number of columns in this matrix series. */ - @SuppressWarnings("index") // this method assumes that there is at least one row, but the documentation doesn't say so. This is a documentation bug. + @SuppressWarnings("index") // documentation bug: this method assumes that there is at least one row, but the documentation doesn't say so. This is a documentation bug. public /*@LengthOf("this.data")*/ int getColumnsCount() { return this.data[0].length; } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java index 0c6ff23d4..23a157632 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java @@ -97,7 +97,7 @@ public MatrixSeriesCollection(MatrixSeries series) { * @return The number of items in the specified series. */ @Override - @SuppressWarnings("index") // getSeries.getItemCount cannot be annotated correctly because some Series are mutable length + @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated correctly because some Series are mutable length public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { return getSeries(seriesIndex).getItemCount(); } diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java index 0f6e1e465..a2cdb2d5d 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java @@ -43,7 +43,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -145,7 +145,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * range {@code 0} to {@code getSeriesCount() - 1}. */ @Override - @SuppressWarnings("index") // getSeries.getItemCount can't be annotated because some series are mutable + @SuppressWarnings("index") // array-list interop: getSeries.getItemCount can't be annotated because some series are mutable public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // defer argument checking return getSeries(series).getItemCount(); diff --git a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java index dc76410df..7873ff748 100644 --- a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java +++ b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java @@ -154,7 +154,7 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The value of the specified cell. */ @Override - @SuppressWarnings("index") // this method relies on row being an index into a particular data series in the underlying dataset. The annotations can't neatly express that fact (not all implementations of this interface would even have an underlying dataset...), so I'm not sure how I'd verify this. + @SuppressWarnings("index") // array-list interop: this method relies on row being an index into a particular data series in the underlying dataset. The annotations can't neatly express that fact (not all implementations of this interface would even have an underlying dataset...), so I'm not sure how I'd verify this. public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { if (this.model == null) { return null; diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index 91cda9202..8e767b592 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -512,7 +512,7 @@ public void add(XYDataItem item, boolean notify) { if (this.autoSort) { int index = Collections.binarySearch(this.data, item); if (index < 0) { - @SuppressWarnings("index") // searchindex for list + @SuppressWarnings("index") // binary search on list /*@NonNegative*/ int newIndex = -index - 1; this.data.add(newIndex, item); } @@ -826,7 +826,7 @@ else if (item.getY() != null) { // append the value to the list... item = (XYDataItem) item.clone(); if (this.autoSort) { - @SuppressWarnings("index") // this is a search index iff this.autoSort is true + @SuppressWarnings("index") // binary search on list /*@NonNegative*/ int addIndex = -index - 1; this.data.add(addIndex, item); } From 164e57a109bb4558f1043f6806bfe2423946c44d Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Sun, 28 Jan 2018 12:15:08 -0800 Subject: [PATCH 48/79] finish consolidation --- src/main/java/org/jfree/chart/plot/CompassPlot.java | 2 +- src/main/java/org/jfree/chart/plot/PolarPlot.java | 2 +- src/main/java/org/jfree/chart/plot/XYPlot.java | 10 +++++----- .../jfree/chart/renderer/xy/XYDifferenceRenderer.java | 4 ++-- src/main/java/org/jfree/data/gantt/XYTaskDataset.java | 4 ++-- .../java/org/jfree/data/statistics/Regression.java | 6 +++--- .../java/org/jfree/data/statistics/Statistics.java | 2 +- .../jfree/data/time/DynamicTimeSeriesCollection.java | 4 ++-- .../jfree/data/time/TimePeriodValuesCollection.java | 2 +- .../org/jfree/data/xy/DefaultIntervalXYDataset.java | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 5f42c3ec2..83bba9975 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -550,7 +550,7 @@ public void addDataset(ValueDataset dataset, MeterNeedle needle) { p[i] = this.seriesNeedle[i]; } - @SuppressWarnings("index") // arrays have correlated but non-equal length + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: arrays have correlated but non-equal length /*@LTLengthOf(value = {"t", "p", "p", "this.datasets"}, offset = {"0", "0", "-1", "-1"})*/ int newI = this.datasets.length; i = newI; t[i] = dataset; diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index f580296df..fc9ce7898 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -1308,7 +1308,7 @@ public ValueAxis getAxisForDataset(/*@NonNegative*/ int index) { new Integer(index)); if (axisIndices != null) { // the first axis in the list is used for data <--> Java2D - @SuppressWarnings("index") // axesIndices[0] is always NN + @SuppressWarnings("index") // guaranteed index: axesIndices[0] is always NN /*@NonNegative*/ int axisIndex = ((Integer) axisIndices.get(0)).intValue(); valueAxis = getAxis(axisIndex); } diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index 621b10ee0..1a7e8213b 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -3056,7 +3056,7 @@ else if (this.orientation == PlotOrientation.VERTICAL) { // reserve space for the domain axes... for (ValueAxis axis: this.domainAxes.values()) { if (axis != null) { - @SuppressWarnings("index") // axis is guaranteed to be a domain axis, so findDomainAxisIndex will return NN + @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a domain axis, so findDomainAxisIndex will return NN RectangleEdge edge = getDomainAxisEdge( findDomainAxisIndex(axis)); space = axis.reserveSpace(g2, this, plotArea, edge, space); @@ -3103,7 +3103,7 @@ else if (this.orientation == PlotOrientation.VERTICAL) { // reserve space for the range axes... for (ValueAxis axis: this.rangeAxes.values()) { if (axis != null) { - @SuppressWarnings("index") // axis is guaranteed to be a range axis, so findRangeAxisIndex will return NN + @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a range axis, so findRangeAxisIndex will return NN RectangleEdge edge = getRangeAxisEdge( findRangeAxisIndex(axis)); space = axis.reserveSpace(g2, this, plotArea, edge, space); @@ -3645,7 +3645,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add domain axes to lists... for (ValueAxis axis : this.domainAxes.values()) { if (axis != null) { - @SuppressWarnings("index") // axis is guaranteed to be a domain axis, so axisIndex is NN + @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a domain axis, so axisIndex is NN /*@NonNegative*/ int axisIndex = findDomainAxisIndex(axis); axisCollection.add(axis, getDomainAxisEdge(axisIndex)); } @@ -3654,7 +3654,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add range axes to lists... for (ValueAxis axis : this.rangeAxes.values()) { if (axis != null) { - @SuppressWarnings("index") // axis is guaranteed to be a range axis, so axisIndex is NN + @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a range axis, so axisIndex is NN /*@NonNegative*/ int axisIndex = findRangeAxisIndex(axis); axisCollection.add(axis, getRangeAxisEdge(axisIndex)); } @@ -5325,7 +5325,7 @@ public LegendItemCollection getLegendItems() { if (dataset == null) { continue; } - @SuppressWarnings("index") // dataset is came from this object, so indexOf returns NN + @SuppressWarnings("index") // guaranteed index: dataset is came from this object, so indexOf returns NN /*@NonNegative*/ int datasetIndex = indexOf(dataset); XYItemRenderer renderer = getRenderer(datasetIndex); if (renderer == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index 2c454fa1e..f99e0accb 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -1066,9 +1066,9 @@ private void createPolygon (Graphics2D x_graphics, RectangleEdge l_domainAxisLocation = x_plot.getDomainAxisEdge(); RectangleEdge l_rangeAxisLocation = x_plot.getRangeAxisEdge(); - @SuppressWarnings({"index", "value"}) // This seems like a documentation bug. x_xValues should have at least 1 element + @SuppressWarnings({"index", "value"}) // documentation bug: x_xValues should have at least 1 element Object /*@MinLen(1)*/ [] l_xValues = x_xValues.toArray(); - @SuppressWarnings({"index", "value"}) // This seems like a documentation bug. x_yValues should have at least 1 element, and the two linked lists need to be coordinated + @SuppressWarnings({"index", "value"}) // documentation bug: x_yValues should have at least 1 element, and the two linked lists need to be coordinated Object /*@MinLen(1)*/ /*@SameLen("l_xValues")*/ [] l_yValues = x_yValues.toArray(); GeneralPath l_path = new GeneralPath(); diff --git a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java index 7d042f8cc..a3a4a32f3 100644 --- a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java +++ b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java @@ -40,7 +40,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.*; */ +/*>>> import org.checkerframework.checker.index.qual.*; */ /*>>> import org.checkerframework.checker.index.qual.NonNegative; @@ -186,7 +186,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - @SuppressWarnings("index") // The underlying representation here is a mutable collection, but this annotation is needed to match the interface + @SuppressWarnings("index") // array-list interop: The underlying representation here is a mutable collection, but this annotation is needed to match the interface public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { return this.underlying.getSeries(series).getItemCount(); } diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index b2f16cbdd..9e94885bb 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -292,7 +292,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, for(int coe = 0; coe < matrix[eq].length - 1; coe++){ matrix[eq][coe] += Math.pow(data[0][item],eq + coe); } - @SuppressWarnings("index") // coefficients is positive, and matrix's subarrays are all exactly `coefficients` long + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: coefficients is positive, and matrix's subarrays are all exactly `coefficients` long /*@IndexFor("matrix[eq]")*/ int coe1 = coefficients - 1; matrix[eq][coe1] += data[1][item] * Math.pow(data[0][item],eq); @@ -310,7 +310,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, for (int eq = equations - 1; eq > -1; eq--) { double value = matrix[eq][matrix[eq].length - 1]; for (int coe = eq; coe < matrix[eq].length -1; coe++) { - @SuppressWarnings("index") // coe is LTOM for matrix[eq], which means that it is LTL for result[eq], which is one smaller in each dimension + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: coe is LTOM for matrix[eq], which means that it is LTL for result[eq], which is one smaller in each dimension double resultCoefficient = result[coe]; value -= matrix[eq][coe] * resultCoefficient; } @@ -362,7 +362,7 @@ private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen( if (equations == 1) { return result; } - @SuppressWarnings({"value", "index"}) // equations != 1 -> equations >= 2 -> result is minlen(1) + @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/158: equations != 1 -> equations >= 2 -> result is minlen(1) double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] result1 = result; // check for zero pivot element diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index 8f1cc86c4..72a3b1356 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -223,7 +223,7 @@ public static double calculateMedian(List values, boolean copyAndSort) { } } else { - @SuppressWarnings("index") // count is a positive even number (min. 2), so count/2 - 1 is at least zero + @SuppressWarnings("index") // count is a positive even integer -> count >= 2 -> count / 2 - 1 is NN Number value1 = (Number) values.get(count / 2 - 1); Number value2 = (Number) values.get(count / 2); result = (value1.doubleValue() + value2.doubleValue()) diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index e26aec50b..594713bae 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -793,7 +793,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { // Don't synchronize this!! // Instead, synchronize the loop that calls it. - @SuppressWarnings("index") // every other class that implements these interfaces uses a list to store series, so the annotation here is wrong + @SuppressWarnings("index") // array-list interop: every other class that implements these interfaces uses a list to store series, so the annotation here is wrong ValueSequence values = this.valueHistory[series]; return values.getData(translateGet(item, series)); } @@ -884,7 +884,7 @@ public float getUntranslatedY(int series, @NonNegative int item) * @return The key. */ @Override - @SuppressWarnings("index") // every other class that implements this interface backs the series with a list, so the annotation on this class don't correspond to the ones on the interface + @SuppressWarnings("index") // array-list interop: every other class that implements this interface backs the series with a list, so the annotation on this class don't correspond to the ones on the interface public Comparable getSeriesKey(/*@IndexFor("this.seriesKeys")*/ int series) { return this.seriesKeys[series]; } diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index a9c95a689..8b8e3a099 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -383,7 +383,7 @@ public double getDomainUpperBound(boolean includeInterval) { * @return The range. */ @Override - @SuppressWarnings("index") // every call to getXIndex in this method (there are a lot) is guarded by the if (count > 0) check, which ensures that those values can't be negative. + @SuppressWarnings("index") // guaranteed index: every call to getXIndex in this method (there are a lot) is guarded by the if (count > 0) check, which ensures that those values can't be negative. public Range getDomainBounds(boolean includeInterval) { boolean interval = includeInterval; Range result = null; diff --git a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java index edc3746b8..60cf68d15 100644 --- a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java @@ -482,7 +482,7 @@ public void addSeries(Comparable seriesKey, double /*@ArrayLen(6)*/ [][] data) { * @return A boolean. */ @Override - @SuppressWarnings("index") // Equality test relies on well-formedness of other object, which can't be annotated perfectly because of array-list interop + @SuppressWarnings("index") // array-list interop: Equality test relies on well-formedness of other object, which can't be annotated perfectly because of array-list interop public boolean equals(Object obj) { if (obj == this) { return true; From b3f8b479233679e6774b987ee1ace6447cb91bc5 Mon Sep 17 00:00:00 2001 From: Vlastimil Dort Date: Mon, 29 Jan 2018 13:43:57 +0100 Subject: [PATCH 49/79] Remove suppress warnings for typetools/kelloggm#218 --- .../org/jfree/chart/plot/CompassPlot.java | 4 +-- .../chart/plot/DefaultDrawingSupplier.java | 29 +++++++------------ .../java/org/jfree/data/xy/MatrixSeries.java | 1 - 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 83bba9975..944582aa3 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -704,9 +704,7 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, value = (data.getValue().doubleValue()) % this.revolutionDistance; value = value / this.revolutionDistance * 360; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 - /*@IndexFor("this.seriesNeedle")*/ int current1 = i % x; - current = current1; + current = i % x; this.seriesNeedle[current].draw(g2, needleArea, value); } } diff --git a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java index 99d6b00d0..531703465 100644 --- a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java +++ b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java @@ -215,10 +215,8 @@ public DefaultDrawingSupplier(Paint[] paintSequence, */ @Override public Paint getNextPaint() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 - /*@IndexFor("this.paintSequence")*/ int index = this.paintIndex % this.paintSequence.length; Paint result - = this.paintSequence[index]; + = this.paintSequence[this.paintIndex % this.paintSequence.length]; this.paintIndex++; return result; } @@ -230,9 +228,8 @@ public Paint getNextPaint() { */ @Override public Paint getNextOutlinePaint() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 - /*@IndexFor("this.outlinePaintSequence")*/ int index = this.outlinePaintIndex % this.outlinePaintSequence.length; - Paint result = this.outlinePaintSequence[index]; + Paint result = this.outlinePaintSequence[ + this.outlinePaintIndex % this.outlinePaintSequence.length]; this.outlinePaintIndex++; return result; } @@ -246,9 +243,8 @@ public Paint getNextOutlinePaint() { */ @Override public Paint getNextFillPaint() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 - /*@IndexFor("this.fillPaintSequence")*/ int index = this.fillPaintIndex % this.fillPaintSequence.length; - Paint result = this.fillPaintSequence[index]; + Paint result = this.fillPaintSequence[this.fillPaintIndex + % this.fillPaintSequence.length]; this.fillPaintIndex++; return result; } @@ -260,9 +256,8 @@ public Paint getNextFillPaint() { */ @Override public Stroke getNextStroke() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 - /*@IndexFor("this.strokeSequence")*/ int index = this.strokeIndex % this.strokeSequence.length; - Stroke result = this.strokeSequence[index]; + Stroke result = this.strokeSequence[ + this.strokeIndex % this.strokeSequence.length]; this.strokeIndex++; return result; } @@ -274,9 +269,8 @@ public Stroke getNextStroke() { */ @Override public Stroke getNextOutlineStroke() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 - /*@IndexFor("this.outlineStrokeSequence")*/ int index = this.outlineStrokeIndex % this.outlineStrokeSequence.length; - Stroke result = this.outlineStrokeSequence[index]; + Stroke result = this.outlineStrokeSequence[ + this.outlineStrokeIndex % this.outlineStrokeSequence.length]; this.outlineStrokeIndex++; return result; } @@ -288,9 +282,8 @@ public Stroke getNextOutlineStroke() { */ @Override public Shape getNextShape() { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 - /*@IndexFor("this.shapeSequence")*/ int index = this.shapeIndex % this.shapeSequence.length; - Shape result = this.shapeSequence[index]; + Shape result = this.shapeSequence[ + this.shapeIndex % this.shapeSequence.length]; this.shapeIndex++; return result; } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index ddf47e59b..9ab26ac6b 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -119,7 +119,6 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * * @return The column of the specified item. */ - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/218 public /*@IndexFor("this.data")*/ int getItemColumn(/*@NonNegative*/ int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex % getColumnsCount(); From 9a26b56e066e1727eb45fc304ab12e400a1402a1 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Mon, 29 Jan 2018 16:09:32 -0800 Subject: [PATCH 50/79] Remove Unneeded annotations. --- .../java/org/jfree/chart/date/SerialDate.java | 2 +- .../org/jfree/chart/plot/ThermometerPlot.java | 40 +++++++++---------- .../java/org/jfree/chart/ui/LCBLayout.java | 2 +- .../jfree/chart/util/AbstractObjectList.java | 2 +- src/main/java/org/jfree/data/time/Year.java | 4 +- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index f3823d118..26c7a1484 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -69,7 +69,7 @@ public abstract class SerialDate implements Comparable, Serializable, DATE_FORMAT_SYMBOLS = new SimpleDateFormat().getDateFormatSymbols(); /** The serial number for 1 January 1900. */ - public static final /*@IntVal(2)*/ int SERIAL_LOWER_BOUND = 2; + public static final int SERIAL_LOWER_BOUND = 2; /** The serial number for 31 December 9999. */ public static final int SERIAL_UPPER_BOUND = 2958465; diff --git a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java index a8f8081df..4ff6510c1 100644 --- a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java +++ b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java @@ -163,56 +163,56 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, private static final long serialVersionUID = 4087093313147984390L; /** A constant for unit type 'None'. */ - public static final /*@IntVal(0)*/ int UNITS_NONE = 0; + public static final int UNITS_NONE = 0; /** A constant for unit type 'Fahrenheit'. */ - public static final /*@IntVal(1)*/ int UNITS_FAHRENHEIT = 1; + public static final int UNITS_FAHRENHEIT = 1; /** A constant for unit type 'Celcius'. */ - public static final /*@IntVal(2)*/ int UNITS_CELCIUS = 2; + public static final int UNITS_CELCIUS = 2; /** A constant for unit type 'Kelvin'. */ - public static final /*@IntVal(3)*/ int UNITS_KELVIN = 3; + public static final int UNITS_KELVIN = 3; /** A constant for the value label position (no label). */ - public static final /*@IntVal(0)*/ int NONE = 0; + public static final int NONE = 0; /** A constant for the value label position (right of the thermometer). */ - public static final /*@IntVal(1)*/ int RIGHT = 1; + public static final int RIGHT = 1; /** A constant for the value label position (left of the thermometer). */ - public static final /*@IntVal(2)*/ int LEFT = 2; + public static final int LEFT = 2; /** A constant for the value label position (in the thermometer bulb). */ - public static final /*@IntVal(3)*/ int BULB = 3; + public static final int BULB = 3; /** A constant for the 'normal' range. */ - public static final /*@IntVal(0)*/ int NORMAL = 0; + public static final int NORMAL = 0; /** A constant for the 'warning' range. */ - public static final /*@IntVal(1)*/ int WARNING = 1; + public static final int WARNING = 1; /** A constant for the 'critical' range. */ - public static final /*@IntVal(2)*/ int CRITICAL = 2; + public static final int CRITICAL = 2; /** The axis gap. */ - protected static final /*@IntVal(10)*/ int AXIS_GAP = 10; + protected static final int AXIS_GAP = 10; /** The unit strings. */ - protected static final String /*@ArrayLen(4)*/ [] UNITS = {"", "\u00B0F", "\u00B0C", + protected static final String [] UNITS = {"", "\u00B0F", "\u00B0C", "\u00B0K"}; /** Index for low value in subrangeInfo matrix. */ - protected static final /*@IntVal(0)*/ int RANGE_LOW = 0; + protected static final int RANGE_LOW = 0; /** Index for high value in subrangeInfo matrix. */ - protected static final /*@IntVal(1)*/ int RANGE_HIGH = 1; + protected static final int RANGE_HIGH = 1; /** Index for display low value in subrangeInfo matrix. */ - protected static final /*@IntVal(2)*/ int DISPLAY_LOW = 2; + protected static final int DISPLAY_LOW = 2; /** Index for display high value in subrangeInfo matrix. */ - protected static final /*@IntVal(3)*/ int DISPLAY_HIGH = 3; + protected static final int DISPLAY_HIGH = 3; /** The default lower bound. */ protected static final double DEFAULT_LOWER_BOUND = 0.0; @@ -225,21 +225,21 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, * * @since 1.0.7 */ - protected static final /*@IntVal(40)*/ int DEFAULT_BULB_RADIUS = 40; + protected static final int DEFAULT_BULB_RADIUS = 40; /** * The default column radius. * * @since 1.0.7 */ - protected static final /*@IntVal(20)*/ int DEFAULT_COLUMN_RADIUS = 20; + protected static final int DEFAULT_COLUMN_RADIUS = 20; /** * The default gap between the outlines representing the thermometer. * * @since 1.0.7 */ - protected static final /*@IntVal(5)*/ int DEFAULT_GAP = 5; + protected static final int DEFAULT_GAP = 5; /** The dataset for the plot. */ private ValueDataset dataset; diff --git a/src/main/java/org/jfree/chart/ui/LCBLayout.java b/src/main/java/org/jfree/chart/ui/LCBLayout.java index 3eaea8237..76ce48e7d 100644 --- a/src/main/java/org/jfree/chart/ui/LCBLayout.java +++ b/src/main/java/org/jfree/chart/ui/LCBLayout.java @@ -48,7 +48,7 @@ public class LCBLayout implements LayoutManager, Serializable { private static final long serialVersionUID = -2531780832406163833L; /** A constant for the number of columns in the layout. */ - private static final /*@IntVal(3)*/ int COLUMNS = 3; + private static final int COLUMNS = 3; /** Tracks the column widths. */ private int /*@ArrayLen(3)*/ [] colWidth; diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index c22d754de..7c062c0a1 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -52,7 +52,7 @@ public class AbstractObjectList implements Cloneable, Serializable { private static final long serialVersionUID = 7789833772597351595L; /** The default initial capacity of the list. */ - public static final /*@IntVal(8)*/ int DEFAULT_INITIAL_CAPACITY = 8; + public static final int DEFAULT_INITIAL_CAPACITY = 8; /** Storage for the objects. */ private transient Object[] objects; diff --git a/src/main/java/org/jfree/data/time/Year.java b/src/main/java/org/jfree/data/time/Year.java index 04bf27a01..a5cd1de27 100644 --- a/src/main/java/org/jfree/data/time/Year.java +++ b/src/main/java/org/jfree/data/time/Year.java @@ -80,14 +80,14 @@ public class Year extends RegularTimePeriod implements Serializable { * * @since 1.0.11 */ - public static final /*@IntVal(-9999)*/ int MINIMUM_YEAR = -9999; + public static final int MINIMUM_YEAR = -9999; /** * The maximum year value. * * @since 1.0.11 */ - public static final /*@IntVal(9999)*/ int MAXIMUM_YEAR = 9999; + public static final int MAXIMUM_YEAR = 9999; /** For serialization. */ private static final long serialVersionUID = -7659990929736074836L; From 446de1a22e73aee7084dd401c327a79437501150 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Mon, 29 Jan 2018 17:50:20 -0800 Subject: [PATCH 51/79] remove some unnecessary sws --- src/main/java/org/jfree/chart/date/SerialDate.java | 1 - src/main/java/org/jfree/chart/ui/NumberCellRenderer.java | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index f3823d118..a25b83aa0 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -277,7 +277,6 @@ public static String weekdayCodeToString(/*@IntRange(from=0, to=7)*/ int weekday * * @return an array of month names. */ - @SuppressWarnings({"index", "value"}) // DateFormatSymbols needs index annotations public static String /*@ArrayLen(13)*/ [] getMonths(boolean shortened) { if (shortened) { return DATE_FORMAT_SYMBOLS.getShortMonths(); diff --git a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java index 9f129a842..0b3aee726 100644 --- a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java +++ b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java @@ -64,8 +64,7 @@ public NumberCellRenderer() { * @return the component that can render the contents of the cell. */ @Override - // @SuppressWarnings("index") // DefaultTableCellRenderer needs index annotations - public Component getTableCellRendererComponent(JTable table, + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { From 6312c5e027672c3bfb8b4b6a454441f21d9f4cce Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Mon, 29 Jan 2018 17:54:23 -0800 Subject: [PATCH 52/79] a few more annotations --- src/main/java/org/jfree/chart/plot/ThermometerPlot.java | 2 +- src/main/java/org/jfree/chart/util/AbstractObjectList.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java index 4ff6510c1..f6eda90e0 100644 --- a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java +++ b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java @@ -169,7 +169,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, public static final int UNITS_FAHRENHEIT = 1; /** A constant for unit type 'Celcius'. */ - public static final int UNITS_CELCIUS = 2; + public static final /*@IndexFor("UNITS")*/ int UNITS_CELCIUS = 2; /** A constant for unit type 'Kelvin'. */ public static final int UNITS_KELVIN = 3; diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index 7c062c0a1..f430fce74 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -52,7 +52,7 @@ public class AbstractObjectList implements Cloneable, Serializable { private static final long serialVersionUID = 7789833772597351595L; /** The default initial capacity of the list. */ - public static final int DEFAULT_INITIAL_CAPACITY = 8; + public static final /*@NonNegative*/ int DEFAULT_INITIAL_CAPACITY = 8; /** Storage for the objects. */ private transient Object[] objects; From f71225ffe9264717cbc605bcadf7c5ff2f43509c Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Mon, 29 Jan 2018 18:25:36 -0800 Subject: [PATCH 53/79] apparently an annotation is required on protected fields --- src/main/java/org/jfree/chart/plot/ThermometerPlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java index f6eda90e0..aca932fd6 100644 --- a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java +++ b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java @@ -199,7 +199,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, protected static final int AXIS_GAP = 10; /** The unit strings. */ - protected static final String [] UNITS = {"", "\u00B0F", "\u00B0C", + protected static final String /*@ArrayLen(4)*/ [] UNITS = {"", "\u00B0F", "\u00B0C", "\u00B0K"}; /** Index for low value in subrangeInfo matrix. */ From c32ec435853f04b1ff3bafc4ced14b4a4e6a8082 Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Thu, 22 Feb 2018 12:59:21 -0800 Subject: [PATCH 54/79] readd lib files that CF needs apparently --- lib/hamcrest-core-1.3.jar | Bin 0 -> 45024 bytes lib/jfreesvg-3.2.jar | Bin 0 -> 44171 bytes lib/junit-4.11.jar | Bin 0 -> 245039 bytes lib/orsonpdf-1.7.jar | Bin 0 -> 68247 bytes lib/servlet.jar | Bin 0 -> 80054 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/hamcrest-core-1.3.jar create mode 100644 lib/jfreesvg-3.2.jar create mode 100644 lib/junit-4.11.jar create mode 100644 lib/orsonpdf-1.7.jar create mode 100644 lib/servlet.jar diff --git a/lib/hamcrest-core-1.3.jar b/lib/hamcrest-core-1.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..9d5fe16e3dd37ebe79a36f61f5d0e1a69a653a8a GIT binary patch literal 45024 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 UgpPtD2z>DYYp}SJr5?)v0beu;=l}o! literal 0 HcmV?d00001 diff --git a/lib/jfreesvg-3.2.jar b/lib/jfreesvg-3.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..cafda668002c68732f8c37870307c12ab64df702 GIT binary patch literal 44171 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

W)YUAu90Z%=b)gL5MeG`lZLFrbb_yX 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

^K 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 Zm9-%!eZV646_hI`4?(783XX*6{{TREv-ki2 literal 0 HcmV?d00001 diff --git a/lib/orsonpdf-1.7.jar b/lib/orsonpdf-1.7.jar new file mode 100644 index 0000000000000000000000000000000000000000..90892c7238b55c2364b8c79204d3aaff9e55d0d7 GIT binary patch literal 68247 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

r!(Z#&`(kh0qP(gYnnexcyzps}}H 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 literal 0 HcmV?d00001 diff --git a/lib/servlet.jar b/lib/servlet.jar new file mode 100644 index 0000000000000000000000000000000000000000..d368d0f6d370b346f5c7d63c93685c0f980b0030 GIT binary patch literal 80054 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%0D{1?lkqtV>;95-WakExwf>+9g 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

Z-K(vT2enq0={C*wU9*{uNZT#StFbB zdEOpP=TZ{f_H7EabMFk-szk{L*l*kMfK5;%|@`IBdYQqxvV#6r?VhR zdyWq68=FSGY$c3bXbL{gAKF{F=D-f(*HdVmd3MH9z0XNUFM6ZJ*MNy}FFwy@Cbi-* z--icykJ?9kekv~ZR+6dKBqLo++zvErvos{?(F!FeIb#Q*U&ry@6-`)TO&#%*^{bQ6 zI#Xj)83O}iT>I%NeBTulhwX_2;B@3F37ML+QJ8sPJMvOtphwR7znl6@<_;E@rqHcm z1kYGVJH-9NcwFT=<4-WLT)_MTf233!` zLD3#EnCd~U&~(S?#jJ7f?{QhJy7-u0yr5XGx!_o@X6m8HrQ_5b&=}CPtzI1>=A&H%k$o=wZ`u564NoryB#V3ul`6nV@{ch_^{sai6!!=I$eK;vlrucy=@)N#br>BA*`QKduApG|(25pPTAl7s z$a=bfRBV_t;W5t-rq3%8(W=n4S)I>9o=d>774dMGwPEZg-7uxKm z=pWXoMbDnX!BR!$Fl;=`K)wp`Fc^{61DVY!&&8%fO783oUAIi|1Sjsoq5HEU z25cjci!c~>OTC1~7@R1oIc+#!K z0_kRR_Pz^2tQJxSZBh>+(oJ?G&cy+O_24|z{GpJV-!j)17v#6Ld0sE>w-x90L zN!qedgX#nFrz{`!|B6*-?X(#(;GaG{|6@Ps@0f_czgGU&Ys>!%R^4tN8>j=FNd=N= z@SjycwF3O1Ex-uMip;CS@~7rB>ilv5-4<8SxrZ_nV|j(rNesG2YHr)0#@#TPJC_HD zZY{IrCl~q`?&oQeazkTmmpAF>?QL%7=WEU99V@}_0uL}BKxTS}NB z?$NtGi5Q72qb7;8bft9angRxoKTINbaYx1Jh-!7rn!B$gam8?tL5ph(Ogx=H1HBKG zjb;~TbPuh6@8smY^@Hvd}lLu4*Jrm>9Lo(RxX_ z_7_#+Mh$m<@6U4^b%wYBk#9P}jtp`(g%C?OkTlr50KZ!+l4LZLHlPvY<}#ftQrowA zW{tx~5+gi6FA2z_@!Ngi2m*r*kzE)r6KTZ7tpB0Qo=tpox zcL;8&fs4jWEZJLurUaIUS-Vr@vmh)>?uA?DGnXJlKf1Hv6)U4u*LESQd+sC1H(V!# z+iNOeXp+;y0zwNt;cn0qO|=uKZWzzw|1T^-i!d>YBz zV%L?MgUm0q=FA9dGq^hDLVpJ@z^McZmf(`v&bT0{wc{f0gaqw7sPsDgW=FRd&OH;( zsZBTZKw+gbV`~dqU{CMI!(BJz4sK*mH`DBbK)}+(T(U)B1*LpnAjRZ*%JWHIN*>9x zIPRCuSVrNRc|OZYRc!e6I)D_s?p}#RPAQI%XqljOh8_8Q34d67V}%Iw1g4}M_>Amk zk=Vs$Ay!@i#9pxfX3D(*JGu2a%QTotC<2^Pz+ile${atXCAx1CyJa>zf9}ZzFyo!} zjqG6p^!@R3BHbe;96dbc6yB69u9Yr`2``ArC1_Ofr-L`J%{2Zl70`|QzPS)TSwpGr zq9{XyLvT+)ds;|WmT$6yJz_molh0i@8jI%GcL1WrVhs%n_~#m=h;^J(X6qE1C@VRm z#fMPL8j)<;*D$_LwLX}Q29dc7RJl?#_BNRlaJ_7gST#M>!gLrpj~v?p?WrD@YlO&+ zfq+w@naF}W_{)nD;ugOmj1_zpRMd?rc|Npo6Xe|L1g6F@i?|?e)$o{eI z_;=vS|A@bTO!Pm{Ns)ihN$BYSYmj3sP+xK}W{PhxY3}{@%rv2*NZ4l(oK<-Z1#75Z z6Eh|FuqWTBc2;bRa-gz<7bcw7PrPb>>f4=vN?l|$z|n4rw~n__v9@N_*q=!%8MoIt zmRl`;9wSAO9OxpJ$Y^rR8TS0HnFkbN;OE4T2!s`^voc^ng`%h zkm%Z9nlyttndRhiBr~u%B1;|+{`xNUjQ2!BAK%3BAMr`-|KG0r->|a(<+(p5EkBy( z1D%nn8t?I*S10A|O-NI5{@X%SRPGyO-*uO4$x;FYw2=h9A(5X!CVc7c9fR5!^L|Ob z-aQ952m=P_1^5Q|b(I=UxahEq&%`T%Jaz~aNxhEvUyUG-+U@1)G&khuOr>O4rCGM> zs~A6C8&O`|g)C0Vt3Ccu?B&5taIb6}AK}Z+=OAOU0G~K(wbEtM94RF1is9RTaNCo3 z31k~N+g10@3V;}>SFPcwq3B=?1_kviP4tp1rJoXmvd3L#yE@v_T>xv-`NIxMSY<<= z`Y^~})T#g6EBHIz?SH$nu!XJh#|HcV@aPPsVY!_T7+A(QGJHVQI1?R^8@cwO52nu# z1s)1qSg4s-l9r7Hu_gl=<^d)Vj>zu|C^7TQ2P8YN$TsbBER)cXlDhi5*KJAZ%gfab zQWuG7tb{=snnT2>k#GwRLL6=ZwqcaZ5YCJ?l-f9p%_wym_XdWXM+&iC?TMv`W1)Rl zxBxjCZ4b&DP47&Z6j2(Xn-$0XxX*?l3+LgG!z3DpS#z^1hx|w;6LE$VQ_bHCnI0bBZrn%4|PnJXC!ZpiDHmBo|?+e zMUy1>j%~=)A)py_`2KxE!GK82q&e<*A6=CAVT|pu0#pW5V{zm70)z#bk`% zALkk=WR=<;DTANJML1qLCo?;#P3Dt0tk1WW{Av0A-?Fd(l}EoS@6Z?Qr8zGTqb-nW zx5&DYpK${a7CNy52{X)~db*UV3zC66R}??d^Qp#pRM>{4K8R_eCk+g73f)$!T1cOO z7D2!lbCM0x8Ho-H$+yrL%-`muk9N{mjDfg5e_o_0G%+uJefW#&M+*9%edZt2&p+Ys zUq18ihb&UQ753whrOzju*HzWl&G)QAEy9Ea8W1nhu{zmB-j4wSh#R#0slrp-X^+x`*g;*Ld*Rc}aIF|gXVUV)aBKXxm2 zBzokmUCVL28^~mFYDVCL^ibGFW4JEaAMjXt`B}O*H9RYnxa>{pSSG+C7mH@Dm`e<2 zFo?;jctnDHSuJCc9NE+L>25bu#GdIBT?>NNx|KWpAF{lGhIPPS94?H1JWKyL1og)* z|85YU=nr`07v#W=zMtmk)w5_J9A_YOuie5`(2Ijy=450wyfB{Ze?i;&bia0u7@BTg zwtKMt;gUr(L>EMNiHA=yTg$|nDUZioL^0u4L@DBABmi{_=#D-+DoL;OaB?$p#|@i{ z9Qd}ea^zfxJ3#^U4wA7XM*`lWtrD=eB5oJyDdFGDye-nUz9fh(>6JH%M+HuKNd}S? zd#+st9)tUvl^S;5lmyUNe#>y-EI;EVh@|{094nWwQZ{_p1NtBBLGqu&v8uC$wbQ>I z=F~mx(H02aGHn^Htiz${jM7N)8%$1uzDa{O^{0dW#1@IncDE_F@uPz|4f~Wo4oIW0 z5Egb4`s_zhyh0%>N#)-MGQ&#UzH%ewDPPFSPmyxB;VRYH7#j(~?atknNu(V?(Gyfo6X`fb^j6({tT z5o1UnCmN>!lajREQol%nN5KTsd%A!@eO${8RxYjIY)Y&xU@BE&Q%3|v)*yr;(Y4ygU0%n{9 zdtU;g;lSv+s+SN3(`vqCtEFexd7%pT|u^6iN zrVcxXD>7!hk?QWKz&ePFs8jeE9q!mmTgg;fUnKp|E@Ib}%mwG_#dmGB=v?kH+sG)l zD=h3%i6h)4kvq6Gx7k?!s1;&QUIFD%S<>{!=mEhLxjAAeJ!@ENc`A2T7X5LgsgwKj&<-!)?j2ZBS|US4t|IUBif;)@eTXgeChO|X@CXFYWpMf!~ktVBy@r?|4qO6fqkOs z5)b2C;`e%j!mHYo9n!B~B@Y=oJjSra5Bw8wT)WFZa=s3=)HPD1S+K{d7`g18L}nRM zCl)`DzU6J_Y7i?t3E4cB4AtG7%z33mUQ;R!OYZ_=ux9U5)uf zX4sGXs;h_alM#z_Ctu-X{2g0Mko}qddIvm_Q^JS?oW*w4@fOj17{hcg<#ZsQ9Mv;o zFj=qq3JlkHI=KR!_11TZo9|bBw|EN30!EJkQseRsQGTFXa9sGk`ruD)w^Vuj*GW+Lb%O3v}}R}gtsavHx<~WRko8($!jjA zk-md>OLnG<8mVe$IKyO}VFv8vf`>9Qn`P2TUmNeea8~oUo)CuN3A$+7h#APsnmwn} z$qdrkziPIotbl&baQ#Ue`2w-e#C>qb>%$=4xRD~(J(O9vd@h%J0iCE7p2N9`u=jY) zz|}HoB$eAPha)W1Rrql2J<@acJ?zIQ93^8X(dO^_Iwax^VjM760R@rIk!cMQN#5d& zNGd;Z0a-}CQTJDe0yz$X6xV4$8bVQSLSYOScd~&%5P~~shCAwaE`NTm zu+|Io{HT~?F1M&HZobGQd(c9MSo(KOJ?CI|AAURH^r0*Xf>F9>yKEHMK6e_%X;a8? zu~Nnyh;n#443|0}X^g&T^fL8U9@4!58qa|lM_Gi(Xo1L|Db|$;d0atDZ5G&6*EtfMzS|~M$?AzGBE?-!3xH`GY9RFNOm2Oe^Z^X zp}&H%Z)eJZXr<71NsxK3JEUFpqfwvvP57+yitVci`P)Qg|5pQ;x8XY9Xw4^q+n4av zH(A;DZn+mM2ape`C_c`~;byQZwUtYU9EC93Jd)Z!V3JkvaE%k=19VT z?6{UVd7srA;*FA$L6pb(PPa`@u$&wyO^A>aFn=Ah>`(61=?uT@ z-VS)ia+@2Gq4han#aIpE8)B3HT3PDo8Pla4qz+O1)t}ryoMNGVt~fzWOR=JjTdD{6 zk`=1VF37<}zuA~bsz46{<8DKq^AiyhLI`0W2hsP9u4ceV7-8V z{f^2?ZC{G6QAhrn7fe;>5DpHqMdV%@_r?dLlk zn7nAZRZX?S=}KzBz5{}dNeD5<8Mj|oz1&D*va82^?1glX|GU+vPL;8i1(NEHK_HUn zeB0^a!a`;g^TdKKW=&f|z>^wgU{TWedg)`O#->;A82-6RpXTvTmMT&G`AzHtPG*ks zPucrlDzg72dg}BqLDN4KpNyRm(E39K>!Z|j(zgUM*gM*NFk_u9Oq|B!rK6XbkO$8t zyn|!zqLhZNyMXo5M5s0>(b{=KeP~r2i&PE`mZiS;JVwIbP{|Mznl$1(9t8!XufQvl zt7#T~l*aFFV>wc}5dVh!pvzVpX;Cem^LO81bJ{)!eq+(3e`@E60x(M?c%mgsH1vwb zhpO384Kn@?Scd7$5d17j5o#m*$I&-iXs>{plSj-0%PIbFC2PFlfjt{u5~%h3E^>&MgJ_ zDOaXP8JKTdny=aNIeGHZ&fa0Vxxcm3*r6o*=&ydyDqR6m9o>Z>m!!d~xe+(5ml9Wb zN_<*?p_so6LaAg1?=u9>JHzr7w{Y(aGiIn=+e8E>M-giC% zv_j%0D{@vvZ{S>+a#6-T4`7aYD?wTGh{7aoD@n$1e!*e=k)06e@fd z>#JG2Y3PDr)tn&`)QMI%Boa0kT=w*1Yu~iipJ;yX=PL2itL`fb78Su}x$VMF(7Ryw z`=8x7k8%U=XpE&T%PLS=c7J_Q)U6Z9zcjhv|8Z9J??lwU#g>2jobpy5^>6>Va7XVq zw-`bxMs9T3_bgU z2mv7>-$4Dd0Mc-C&*jh~s^~%xmnVY`hZ0s;<%~-({I5Mkiuc^1 zhxE?gL(OOP3+rB|aYUV+zEDhI`!vhU+1pgM?73)-{Y*=uE7aAgwtW#zX&AkA{@fTP zRzBiodw34&WA~}m-<}OM(2ICs6Vdq;E)=>+Ax7b+BTQ_uHG|dzWqrgqWOtj}<96gM zmof@}yQIPo!q3_d;PhN(s|F3l*H7ReGGbHc(^;20cmecBrzKbX6Q-R?TWmtw-LM_> za6N)LXrj1n9alaY`Jy>x*KJ1HcGz0At0|N{P%Y(l4#6w%X4|NlBZsCO^(Tu#DY8iO zgeYl}$S9Isy5jX4fK;lwil+UNP3-2m2+hUqhBNHM6j!5SDyUw`$(Kz}g5poy-V4Bk z%I~O{;8xV#d*cY<+5Cj*xe6lgWq3gfQW;C*7dA0cdfl*xNwrjdQCWtuF7CAQjiKLG zYT^=-8g8|yXo+Dlm@3VRwTAy4k7zujJ%$5+yi!(u+uBPSk;{F$8IaKFZLy0ggar6jTHNhIu6^3h&c83 zkAMl!KozuMM)WsATxq2`WYCB2kf5B*YHITHm4!5E{#*Fvq-;Nv*1h=7p$ zgra9hPazWr;|FkmYB62 zORAkio|6UC&9i~Cg5hl!)ZxDWIpAWxVP9fCf@(PQKV6lie@oi_5{j4jV0=kA*(-eL zzyDV+E%3*<<%iTkKYjIKP6yC-leEq4_gt+BV^%0F?;eUJgSF|N9}fp|iUN^;y~*Y9DQ4OS zh82|*fm;4qLWTAG)i?KH0_}h7H~yXW`InLY%|QPLx=ZK^Dd!5w@FC9pq0C&i4LaF2 z_92jLiZIS32FdVwgS@^ekE#=O2xfwjUP{hobWGC3c=M8m0a`*vetuMnPTJV`2e=}} zQ-3kQgu9sh>5I*i0z?En=x6T#qquCGb(m8$@|~Csj}+_!$&1ViMljIVGt|}7HPZDd zZ|Mu0LOKE2L>I`PDK(^9Db&P|pV<2G_n%Xyzte^P^%DWMW)`+4lD4LH|MCQdZmHgn zH=5ak&;d&;6h0}t^58QlDoD;IVHD+_da^9XJkUifVi)6Xak*F_ZHbK`?AwJSatJY^~@0h zZvH9BP=%FQNw)Y*PZ{o^1Or=*Ag$0K(N%-68Y}0kP=Cf~-q7K{K7APSpXKELPR{#p zWByHY&UW_C>!5NP*FgT)nZ&Q;`TTi^B}n+;p2c4jAjr&Bn_3P>)@Z6pSEw--=w6?Tl_w{;wQP9`-1APEy#UZo0wQGx@++?;RkVwy0HHBV8 z?vQQ+)vE%_#xvM0xq0tTb#osT``}|g6_*COhlWvXE!|~aeh#P7xFez@@1{bgkMIn| zvSgIqWlebo+5Y-j(R(6p{zM`lRCZk8Ryig8#(0mY5bP@@0U!VAh)}_H$OxMj+O1oy zC}4|Xf%VB^=;A8_L|ZInzAV$=(I^{&@KxPhi`wr17B5!9VMD9e)a=F9OQypSv#_-E z6l;_3L|jGPd%KBXaGZ2yT<#&Ne!K6JLI$=vm3-PwS#-_wBI-oHw?;Qk$KQcGL~v>c zD`__(&?<{40A=(zX{}>tPnp)uGB=3JP=8o_Et_S({i1CMTczI-qV~+?z&Rk|A_=*b zY^6`&$VNcp&0YotU4#m^UoOtr(Kh?oZrMT}vw5Xe;{5?!1oPCqx(}!rcr<$*cP!Qv z&mMa`=~+Y0Wh8!QoVH8*ow`c1aBE%W6`E1!-`&);lyn?j&IOqbyo_H zhbB)ad3no!Nx#3BOh>JLM3#zw%x(XkWBtop#DGT5c8(tZI(JIa@*gXBZybwcd46Bq zF`z>R$qzw@xF8*}KPv(tQ2PAP@K~9nba-!Vkze6na0#Kv5MMs|s`PU$#VUa6xVoC{ zd7YdHy!yCkUbZD|(~+a7``QeNiaaJv^d% zQ%1pFzY)>5gMm*N83g_1>MREOSVA;2c~{BPFJ41vU!V}FgM&Z1C_h1Aap8PPVk(q&b`EoV_Y!_*Gk)m{zK(vWa}u);$|n-A>yjtRXCcm6N`hyul`&Z;T&oATSB zH5J|f13Z7e0R*9HWsoxMyo$)tuiN{W@2u!eR7|18a_Ix`>MY4Vm!0O=)8!xi+7B0S`bQV|f4_zQx_Z|Y7+S=ST7fE&5d$>8 z&(2E75*JLipUgxl>_IX3Hwt91Bo8Zymf+Fg#7+%w(wR;@<^BOTVKkgNA(pL9^OfMG z`^G3Xg>eqUmG5=yx!XqjdB?Nq)v> zSc(x~KsTxZJ~)>)cjQuG0A5_Obn&g4YU!F|VDYSl$fIekBpG?96rhT|( zx2a{<_Q*8BMTrL$hf|5uF2BxOcPNs;cupxbal%wCA_El?wRzQ(CuN9JHh?U^{WHwb zQ-^QSpzIn=Kl=hl*-UHzp+M4@=~Z!gTR;ewjDK6qjN?*-m@hC@PxfP{7fV&x><-hy z(;I}`xv(L&Sm%|y%~~U&DNs1i3*Rl-$DD<;<6LE%yS=YSf`QkS`ko5O@SwoqXWQ5!b-UVNzQHwQtG0>U zvu2^NS$CqAbVJ7ao_1J46kORhZeG}?5cp5A3mnxUQ;JyvDRGD7H2Yzb!Xwm-$oh)k zwZ?9Dn%%nFaD#72EaUl7#nb~b-}ZG%t?XG2znGj?05N=spR8RK1dIhn6%-UkY`B;p zWsBbO2+9>I>a+uG`$F{7r;(E58u*f~tG_B$v;^VEYtDn29>08{I%j$`DP>?+v}VYP zwB<@zY1m>(<3y2U-{bmC1#AIy?6)L5xZv_3c!&;t=gbM{)-afVh}HWlnQX0jr2;j> zPm|%C9#DLTsHgl(zGM0u>ID1lbn<6l=VFF^p;xU{yuZ{8+2=w(3QFIlHxoR{1?C#< zhG^$j?CyP0_)-J4$8y2eLTy0YW!R$^n;g>%y2?Uty{TH+u*t6 z)Nl*>?qZ}@0Xp!Nq|WQF2Kk0DR%=mPVj8%C+Fyy`?@4COE?AD z$3|?dkm%7@wM? zyt@aXLiMjMfiZY4ypfYX0&_(d+28r|28FNaB7wjc*vaXlIS6+`#*lX`#%=PNHW?0_ zjHU>6`@k~kI`p5q1Equ&&~0H0d@|5&dzWN-_e|vW7*?Q_r1Te%>&Q(}oDilzFp_&^ z{qUy1_Z*}*DQw|Zd$d6tEnYnnfy=WiO)?E`pw{Qx?VnaMO!2Dkv%Sc*FQk4E^IKM^ z531_7^Bmpg>=P^xfAy$84$YD=+FffNJ@rDp+sA1~~MzJ7)jev8-go~XF| zYeBC3W#R^Pu3!=D*O?`OJd7|B={wH9V&&>pnAgh3fC%6p#|Vi((yxDSGym(l zRCly+{%D`JPWieYzJV$tx^#Dtf^^O z9|o;@h4%{_XC5jVmhI|e?v&FxdXbJ%+y`mcZSrw~(@gI9c=H+QlX7x+78cSI@_-1C z5awDVnX+drfEjN+Y(V|_!(swQ&@Cb3Ar*m#v1!XUZ>)La|FtVuGJE$+&I-16>3Lx1~C!HNuH z%lLlOp@UfvvGp~l{}1A1bXk(-3|u=;3Vvg=LA_IqK4KFgQ!ZaQoLB56?aC(F zWfoo}1ltp+vZcL8vzC@za+ua0cdC_O5gObYOkKqAG;QnBaVOIZ4KH(>WnlaiBMkV$ zghX?&d+gDDw$afj{GfXmzd}kIU*U|4Jt1QYfWz+QqFBY%8MN1N5vOC^)O~qHhd|Ef z`h_t_E$7@1HWk3cVrYvVbX)RK8IZOI zHo+~5LM}^!PPdf2-)g|!*fc^hKQy#x`G3n@qy0LzQHpyu>${Sa z$#>KI^W#PjOEWiWwpRd)$FqLuM)xw_Tg>_DM66bd?a3(R?O$6c-084SI=_**`hS!b z{U<8=*HLi#zBafy(fy@V|NHjvKf6<9Y`?n=?+kW(gL!6l7!b)apdxmPL9b1I>{5SZ zTN7Vg-!FjN z;5W=^eF`WTHkDKiWoBZ9#Zg^Vd#ZqSOl4)2-^%LH3mcYgKF4lZDSkw5z4Tifbx-Gh zD7Shu2mNaho=Xk2Yz}-z;(QL=V%#S5lT1WZSkU9)TZhVpCvIL%Jsm>9m)H#DxS8#aYmymisOopC-pMahF$;p~79tUWJ<`W+pUvq~%`)_!5 z$C|Zmz!-xF`oN%zLRTETD(YBaiL!w*yS4UjqQf6GmK5Rkq-H8wf-;59xgiNTiA=k<`@IgIYf!g5F}tSSvM zP_t^MxLPg4cOyiNueh2`X6s{B`H;Ws1c*|ZUmn`QH8fW6?Vbv3D?LJNkG*^5BFc%pDUHX%Vdj!Z<~b?l$qy_9B9B_k-pS5#sL)`O zh3G9F)QDrl$M(9v9*x0RDJh1`cYGICdP#l+CVnTXIWf3!?uPw@MmX}AxiTEWwlXTA z!sy}5lTjp5?KTDFN#{7;Aow)TuvSr;?r1G))gFQmh?hfx-!eQ*!jH%Jl4_-0M$**@ zAe}{DT!LE(ANu(x2HNC8By@(b()z9b?)iGH;X%jD@}x^+s?|Fl8{sHpz>14>;$FOY z$9sYK%G#mHI3kD!^eR5I3X0JCtGYal8`I-k)uf7yf;{G72LWT%Hq1!Tb z$-R)9M&A6#=B>NTRMT0DIwM*d1o4pmV|KmKOpR)xY{y`u^%fAJvMaY;3m-m&ome?- zMF+M|?ndEdg_O=y*8PQG$v81g4_wPxjOec@5nv$=4d@h4B}4i&h=^g1mxNOZ1P2sm z(HNgM+JbG%ROYD=Vsu6E+;T;QsnVE8Y6tm>a)bCirNww==x?n*q2#?{G1{VG7I%{R zDt?iyN|n_qMx@Jb7%g;$6KdY)UU;sUplYGb&{PZG-)Iq*g6;0FHp$NRt0qW=^E z|6Agb_^!f#5Apx^*K?Nt`|I(rc^ArPS$adA%FfE%0TC89NftFiN%g6u6&s3&N{Ew^ z_$0SF?tncj>}F95!-F0E;X2B8#JhWW_yov}DIkSDPhVlGv)%nQi$jw+=0M-!uFdH> z?IxMakjE5RARQ)7Bb+(`DFq{FiNhr)SsdW@Ay}%d%{YgNQZ1c0%shXV`Mgn$(B57g*bL{!IzLF~k1azUXip_y zU`+b*KvHT^%}6uRj5*k5_EScOaorrv3z++H0Jza+-F}dDT@AA%tiNtQ?^wTi|5})x z^8NhZZ~lJ=3;yfK{Pzp@R@9Nh{NABO1l55L-lS@2`EiQ&yxrX*gA}nci%8NJe?JCI zPaxIYVdP5x4zl&S)bbe;+`{_|^sXQ?6In+x*9!M^`Mqc;%hUAmbmmIx$J@#TQN$5x zC;d(lM2&W*ivr51D=*u+DV{8B4`gUDe;KY=S#sRvxLrOY^$$O=s7rx~@agoChozK( zU=4V-%f~)3DI*E>1DH4@b;%@~i97?1s$xyOmNm>VM~(-jq|6Y>w*sg08Hztk?bL=k zVc}*gZ4}`tYue(#&!E#hQB?LBowT!<^gqv=)GW@NI;F zsO*qXDAOpZ4ov=Z_@E2>`Ot0u-UE1XpbGtcv#%vbQc{l=PvNvHF|Q`(2Y@?qo{=1G zw}Vn=CO8(z$n6*P){at|YRs27H_LYtrJO@#^T)+Ya^#D2yUsLj?}ba9jq4WlP8fKFU~GO$eEVNqe2@&5TG0%ChqWCI4R&&ZRb}d8DgrVBIsyUu)qAOQE;w3tTJ)7o(NS>>OFWm+uiD2W zfB4ZvV`753nZi0IV%O`fq^y_V6;mS8w%X{QHZjj*Wbva;mpBlYplm}2-ZpN+1uIg@WvX&{%yV)EPddEynR!oU z;wwdED`0=N>ns(lDFoIr+I4)k;t`WSmCcj{StbP*n!o?Rplg+vc z^15RVlnXd?MhsHT^KT&L@sMD$q;YN$DG8okz^A3I(TozF@ff^#`{~{k*nIw0e}MuD zNGpGbs^vf4RsU1k^l#z%AEBzc?ucZJ{N*i?z&tiDrCFWqS$0B`7pi%XU(~2b4gig; zbyF|XeA0Ykv$2_oDlF0&{q^hm6o_tGoemjU>?bz5`x3^M*OJ;+pQB5QM7j+{+St>@ zw}WTT9oO=H-$0HJKy0rmLZkt8;IdFFydRvc@b*ZCzSXc+lN*;{$0Xujr&0c>;7&;x zcr*UU1aU-pr}PculoW4Z8hASWSj2F|w3J_pt027~y-=+nIV3PteV$ozZ}Sd?yK1&n zdN@OdTIGJChPbAKY+6IS>A?m-d}h*}$Plu+trTfQa=ILD!jyy*?hF<2wo(Hi!x7`R z!Kl$1qjHo=0SMsfGE2lPaI>d6rw%Iqi%wdnReDvkdIi;zq(K#Io+=^nth#<#&Vd9& zX7+NW#E>GBu%qB&y|<<)1I;FTjb=h~Y;W1~9*+*ddbg^P#p^>Qp*&xug=9H9Q#HCN z2QfA@57CjBk{t=tSKyWurFY<{+LH6|%h#A=2ofkpwFlhe8lNzre38Qn6N9r(k~u^0&zY0F5P-aD&GduswUe z=@E!vaJ-sP!b+gb5a-3x$TUm;FfqtjkfU)H&JBwp8a|ScGTYf66;ucT5XVvXYEXH3 zC1-}di2cQFzJ`Vlw5F6Mk@ggzoaagvI|mDIkr6ftgUnBF_n?mDz*H)NW_S19A|#eX z3~yEY#eOO9#DgiR=`|kKTohAep~FdgEY2>0qT1lBqU`Ibi-V#N110Z_`6_{~Qe&y4 zzNCbu2vJcCvcl8V}`mC&+yB{UV$+rUi}j#>_oM15baXAd7Np9kt!%5)NHOUB`oXZ<=N6y z%*eN=B&MWRT4g>P)XIbP-IN=@i;&vm;!VXl1d|*U8D#3kHk2D?m=`mLdjlQ|&7*6u z%?%%w(X}97DRGfl<;WJ|S#V`1JesVDg%GzeCZ8&(F08{&D}>%5GM(<51^Xj=pBuhAEH$@NSO3$-Z{d z74XN0s0wq9?itQ`LrCq2XRt@;n)lQ&kE;~t1Gg^&d|u*+u%As{Ov~tg76y1wa3m%a zvatQ?PHMtgn5zSgpbq-tO#Gb_a1&~i%!c=M;&4gA605&ax3I;%{DtbcPvw3W6IO8* zx7eTOd(0L0XKq9xC${c!v-e&};6)IeVPQwgqwZ}(h|PzSWYw-mVxi6~?s02WyRB4l zz~fE|YvVq+9$$8m&Nc_PoMPq10p;8KPc?HNmAn&27S9WOs80SZG%55=+Tb1nb(mWj zkkBol{az&a7k3y!FsZl|xhHCrbNCkdpRgcb6hJ;DKe$VKA(Q*1Kac70K;!^PBd*ly(Z)Ll4`1{Zi!Ym4Z5@h+R5%gE}2FDom z28au>#C>sxLGPl_5k@TvHlSL_kCs3=BlAn`Uhq0H8=)3*T#=d3ORFa6!lv9%o5+zzO9LZHrr7 zB4kYzQWyy}AktV1tX)yuk*_o&In>PS$tj}Fa;n3^xWy$#b2kh^g1yJ}w-E{mRpVz% z&c%|NEwLXCx^zugYK?p(WL0UnBslgS^zaoSOv$x;AzQYtMV8>QZw0EO_d@$r$k%kl z^82~D4`yXMUS#jCfjzxO#43(DtzXEj4H89nc(?ZT*A1qw6D+v%yBxs6{L>BQKTY=j ztt9+KehBM3>Hin|CD$SQ%{phw(6Xj>iVNY)5hJ(3{g{J~jiu&?l=NjKb4)fAJ913i z$`{Pv26`qReEks?O=Hs7(9p0JGt=Vw14^3Ei2;%U)?ON%R@!`nB#$ej24c6|V?I#9 zO457T3eg%*MX{DKtU?*Z(pYBwE3}^{Bi#=3$fD%2e#u46jO@;XDr@}y&lp&7k;7>w z{bXYYO-qy(N5x{W9b?9uh&knpY44Jm3JdEZTQLvg^OSnyAuq5;;7Jb}gdv`8DPzKu zM70uG@$vPQwKKmpykT#a5$WNdRjT8m7@^_bh-G%Yb6+gGP;mG_BGult-j0yJ`DQ!i zHs1U1E?M^Z8AFtHA#&PW>MmKS@Q(7D)~Hv-&5~w`{l%01@2pww4Uwj-1B2 zp9&zH061N^3~^1;@Mu`tXt)oTsNAMKSCK7L^)$Z|wQ{BQ$G5y5kuUe{6U+zXdXp;v zXd0gdD#!8C-S-H4{j1yi1+$k|nmDd64%VudE!?YOG?!3FBEEn$n#3NP3_4RfA4p6Z znu^z8H*vQ_CX?YN3vni$ytLI3bQ%jCB@|f}qEPJU;>@MnpyS{@P|b1UHn;aQu3YQM zYB{5x3WfsS@uDK!y@xs$gT>u?UICJUNbh#h&cZ+Ep4qMJL;tR5&TaU_S1Y zTB!=dS({_2RWq?kqC-8dyuo6uT6&d5tP99^vSar*$g6Wb)=PV(PK`Jn-_M_;o-P`H zu5S}uUJ6Ivhl0tVF13^FBJ1ymnf+l_wbB2mIHeM^Zkbz;xr7|B>yNb`0Y#ZO2Btfm z?$Oj{MN&*QOF~GS($(ZvY=pyuYw78coM7x;D{cF9md7N_U!q6O-tu&0ss6#B7c2N2i5! z3Q9Tj|Ly&Nb0M{Z*ln7F3|nd@goFKHMbg^VYo5vVX6LH87!<|b@x_Bj>t2=;G32gs z%d6m>s_xHn4hctlcO&u!5O7M2_}K67om_AuaTJBV0J%X6|`=<5LFYoFhe zc4n(nHZc?2^=>Ht>1}1(V{^@Ksr+RRG=8>3~wi|ecuhG}7+_g2ogFV8t)&K1o2#(j^jS9UuY|9=# z1bk{A0v8tl@zhUf>K0>(ZxQR;u*vV9O6ThA>96GYEsaTV{icIO|8a)-AF;9TGyQM5 zQROe2HFTZ@DC-s|2MRV35&2^o$RVh45d=tP3iKj9XoyxCOATro^A;H1m)(r3*GN%! z@FR50myr5KQ-#v=5UWjw3JA?y=9;yN@6IaHJ%o$1OX-z(}t+rF}A= zE)j4o7wEBO2e5FLYxJW>1X#iDYoRbtR;@GgU+nj0w9HsK;lU+BQg;P$ZSXXrs!5%Q z;*@2=+xk{2QD*_r@%d*MG|3B#)Ix>?L?xDEy@~NUb4luoMTO-AG({&w&{LN|K?~&B z?w}Lu9va5%Xmg6E(l#{3Ciz}WrZOW*`_!TC%5-M<&Cd)wW z@$zi<{K^uMRPBQMsEXok)smCY(gkFbv%A%$SyBzRh!B10@(WKaoI%}?a8tV-QMKc%&_a{hm3`*PP9mBWXwJ`_4d>}ULDYA9vGOE&$I=& zFz;`rkznYC^yU+co!4XNU`+-W5=D%pvyN6>+kugqzZn{H7RkgI2bb!MIEyf&4q@*I zC(k&t^n1P6P9XoNaT+mcxb;7L6=~^~(lxXSswsl%K(^;sb;7rAl3qejxoEoP#SN2& z^Y#HUO)351q2D4n?R=x>*$jBWqSh)!iM!H+Qw{g#n={A#BN*{S1!67W7z-+8ho&N@ zo1va@rFVCAh12(2+7Jz!nHKRA(Vmy68J#mPA8Teu43LOf&H#lbaZz`cUvuW$vJ!Aj zJP$0zE)F+g)@yZ^Tc9q?B+T;hRa_&iNfiHNFrDbLli!xo2yKpJ*Akyvl-C(O)!QGa z*8R-7qt+G;pknZr3V;|*5gK3gK%1o*4l5qJKV64i7O;~-X_uVRejD>;Fv)4anqNi< zq!YB{*R7+g)PV%xHqF%4c%&mLKo%&z@7-+OU4H2c%&|zgd-s|6LE{&^YV*YxKpAms z_9PIi#D=Hx9uUji2qUdp+=Q_mN9csDolZ%PxE~eyc)rV?c86Uy^S)zRfeX+=^be1y zkF0#fazi}E2ckFsQyhH{2tq-_oL?}Xe>b=MG9r2!--osTAGcKeBOdyFSVi2N9Q6OE z_(sJ~$*%Jw2hFTRZ?*;#Hx?DW-;3pvmIb;dQBtzfh>I&|z`FxfNHEIaa7Y-#nY(!B z(Q1}~Lxl1EfKz#xUipQBZ^YE?c$9thha)?}*VGrlYPTo?Fd652F_r#eUwQxNXT1)bFdV>h->CeTWE%`-+Eu8`WfgJaI4iFM+qJzVgJz1Df~ z_<`h~L7Ae*>mMTNdZcRHD|W>wM>o*MDo0{ovky;NJafrQR35q@9`?||f(pvHsie7! zMOkt`i|ZehYPXQl-NY-Z5&*b0yBdEurY`3qj;B3$4bP{!!|r`|hn6=6nz3Oj%6U?DAAJ_w}2Iv?C{$x(cjLj4k<>#;KNU6(c_RcQC-aSX^k0=vM)#OV` z+#Ne(c&Q1?ul5yWQthWNzJDccy=z(jn(s^4)<4ei{9_!b>N}Y08(96@EM=79#P|Fk zGEc&a`_3#WGe6XUPI@azvAn9Xcx)i0A_{6){V^yK+ z#IYE`rL;C?k#6mETTI*0A4gNK`=dRwAI99H_yI}G^Xdn7Awp>Z!#lJgEU-`UtvQ37 zLiq}o%@!)4--eE=+9PmIWM*eBTaij)^o6)B*?eWzOIX|{gSo9srMKk6vDnADLR%~t zw^}^jxt7hBPE97;8nRCWLTk0oTX<;1uF~P$w=1jx=UA7xFJUkfb^c<|MY|`UB~0rN ziWvgstz3gytM%9ob6Xdwx>8pwf`OLDE?Q62xFHf0Zssr06Zz}ihZ%o*S%IpKuFU=Z zusi`>q{_SMwia?Ou$(~lcO8Zol};g-mt|6qP%Q3!><%GXr{*g=b`p~udnjQAbD|DM9U@k zip1OQssd|xFo}HPNa*%ofY)=&@P^};)J7VJ>mrfyv+@cHViHoo#c?7dxg~JxAlUIg zr<>W9%>iU34#GeDEs!$EBwUyK2IKVp{}XTD`RadC)u!5+lCm-SS66LH!-Rkni{lh9 zjWY*+;xb}gYZ-YxacLe(RuD)^a*zugc)m{6xrNIM(76d(iIbCkIYtRw)HL(-eOczG zpT(>8&#EK$nVs``Y}8U)?``*-r&~|jo+tO5hIhNS49g$o*WGxQvsVLMZs8)CLq8&b zBLq-|sIwo5!jLUNBlJ;;sH0ybB5yCzBldJ7-|E0WAZ4%J6#JOCc`LR#KxU}i1o|Q% zWnXR(Yq~18QJNhz`zpA*i?^L|x2|_(=>8z8tK-?6pId;pxG*=lI9-_AB7ryFpAmUD zYs=lMv|x>?=huklw(8TzG2RE-%g4Zpfh5cIIsd*mwXm|Vw6HG3&`7OcZLFy(Q0lcj z_O5#Up|3KJx$8k`EE_=>z+-6iCzKQ#z?XWC%dEW!BFidFB;Lb8I#+v`MKdd$RBTtF zpq-CJS>|o-`^Nz9lJqg=g2+N?+;4Zg|nWusT5Z}jdrRxu<7!?1o>c_*$9 zc&dl}7uac;aMlN4AlfhiJcH^IQq&06IJlw02{@VbYI}MuxH-hVnobyEh7^8_?pe~h z5GiU;M(*xre7F(d2(LfopRNeA#p-T0kuixFJR-am3Jh-{=pd4~Tp&0N!Nk#&Q7Ch^ z-Y5uwlzxgzk=OW%Zq8cXa*VliR^tLrs&dSeAK?^rcGV$2bgIYnrndz;q{fR&6xYAT zB;%#Ec@}pR(xK_%j&HryW2FX7pVmN`74dcq-O{j_I2}Pi9>%bC6mt9lB(hnX zY*t{98dX|n30X*7GFZ@fTvV*9%Bfm$kQ89B0u>h4TW$2O#=E?T zB0VY0WrUv!T=|33!fC4?s`S(X2TRsbz-73Rs9bTRT!(|QK3kFxc&4meuRfC>F2ZuD zWY5Q1x)Lg*o2hWaI$gdp>8Yh|Wqk7kSGf-Ff-=2MOoXZ*P%4Y45K{);(zwZ(@=sp} zG8F}DlHfW=OSSw6ArmudHs)6tM^JHsIEHB-kg7bGWb477JFy+c2&gm+fln*~O zg=tHh7k#z7n?kE*S!q5N#<>upk2#z2K^Dhyi`~^qc}K*14kQmbrHUzrP-@a5O790c<{N(A5`YL*(`JgZOJS@Wqg$}6>A!YAC}aOqm)S< z3MJ!+P$IC|wBEET?JHOm`(|5Hy{v>_#x9uO;+9Y_TP)NF8pD|(8^@U;n;y(t8*`~( zT2P%zcIN!EnL9OSGlCKCwL|ER=Sa6Zh+&q;@#;m06YK~;@Sr8#QnjPxHAm#b6$tes z5iv_*<>d9q>H=i1*mU*?xS_?X1QmNR$#n3WIOidYhQm4vRpneZ6!-Rd6!-4C7~4RZ zI20sNmDiwVh&X6U3wM_NyP3lqbNOIYpiqkx&QtGU6Jxo>1ibkre8nYvg(ZBYC42=X za!LyMiV}GX@cBx9^x#i|Kwe6n53Akl(n%slXArCr2U;WcvqI=+1lGz3u8qS-Y$6+q}$ysPa_>{3I(jdpBke)YE=B0~1o-S4AZs%v^i_!Yf2&qf~sg?qEkjI_q zk)U~PB1p?j0OI8>WUdnuy7qOCW7$PSB%vUYkD)`3Ci)US&m@l1Kz^W^H%4~*vo+~L?) z6um9v_B)JE4%XLz2xYVw!(?X$`{!PE&UL0c5 z+QfYV&o5cW9=qZXZ82cNA9IH(<{aqN-9=qJ(0unGQc|jl$xx! zH&u~s8;FuBXs}x@l6ZMxNCJJm7W82S2LFX!^yyHAS8JwVDrO(D=)GX{8IN~1nrdXP z81VM6s)l=v3jt*xLC-nUxE={cC~D}+&d7QGRpUy?%I-){T8V5X856d;ElCpZU%Z4H zVlm_BhX3+khB3|{P5r)?WBj9O`9Jcc-?dKK+`vKK!ToMlZE5+$|KW&xc^?ZfL!J*bh6`wm)35#yOLxZP70%9RwN`{92^Y#8sy8%_A~{q zLNaok<~jOv#og^ldUr7*ios83BPt(bsQ-JX6`m~cd+>^a;5Cq)W-tvr?2~@_+XSo+ zd|IE}|E?9jPefahzH*yU$Zl@;DGDXn%tH6)Qd6hysJT+JF|q>?^e4%L9{7q!_2{g< z9IwV)_=e`RqgDnTt%cK&nw7QYOcd&625?#Pov2HimdF4#z3}l=F#;_wJxxb0ogGFR zH$VWt@?fq4{W(GKnP*-VL!5hR_)}Dd<7!wJn^aQNsSmwUF#_*(3 zdR{O#;q%p#!prtfy#7twq-`{^gRE3Lm*EW#0PW+#*HW=ccv#T$p24ZY+#!@xA5BEwoc<7f6GZ+X zsX=QuzYd#QYuS>B{((7Sl&+Ive)AWDq%bFu{bO!7BV<%$arIFI3P+|7=&mc!#r@9G zLJO`Sf2>T&uWc=he6>@a>dpPru4)^X2i~#)r?nU$Ju`wcSg-4ZYN^Tq5|5>ADdOdA zUnyEV*!akKM|`1MQ~}$9Wc;dqb4R_xbpUrnV+MD`pqFDWa2y-VsK(X`$<7d8XC^m! z&Nk>$PPmO<&>=j1-IBE@5SRDBV3d6^JbgOZ+vSqiN^*8BWbEn?K8Fy|?*2)V*HUuy z-g>y(@+8kuWUXKlXz$^=5phpslHf5UJ%owWJ^WK#!ug9NrB;i4_n0zc$$KQf?-S+U zupu!jG3Kt!4YY=hVdp-)4jfoOtVF~FOq#_RTmDoI20RlJ zay{kr!-CCp!F=1%lhca=gWWT`XDm|njh6&;_sbxrX@@7z66YLJ4$Joa4PZo?ePENni~TC2l;NIeV2gYky_o1alz+!3e_+v7{8nZ*ehA42V7 zGZR_d4RdT6lk~9cDeS(+snbRuM=?gW=)JHb{=(9HaQfmXQ+{*mxLerN%L zW1p*IpC;-%1DY4ylVk7eGW4?&ty{o*2RLi}_DtKh3`^4k++RKTLu+9Y$ainU@sGXD zfBNnJ8>{p``Ce7u%G^l*TVM4rf+^{{6-N?)uhg(TA57(*r0PUEFyM-N>YpMKd!ykuIuO~70anrhl}57xX{Q#^z`e;4xfi%*U#jC?sL zFe>%DjjFHM(ym=CUaZIsJb+A=M_zf$`68_Kxp)?8q4ONxI$YkrJ43v#Bs7)EbOhp6 zdq%ZGMz!_|Y26VW)jG@`^oFEb zt=HhZ?1u+X?kHNl?VZJN>z)_K)tZ6Uvu9RvKWKH(R$(RGEeqq;I#L`sfxG|6ZM92a zE44l6#6^dWV#8mj*9-M{dq8J8RMs#O{j&de=o}Vw)~|oVH*5b0-~6X%>A!`}e+A69 zIkAkfqvJO_`LDo>AdgF|)Yn-XhV;eq1REIkj%?hy z&pv5V#tVF<_Th%JAA0x2^2Yfomq3Rk4Gj%RG)={FLU{&GvKisiiVZ}ER=ba&g(v#gpWy0jKY$Y8`imuqnvEuUVdB^07cgmOPBku&D0+x=2J4hy-ih z9x*=oV;2a&h;TGUx+G?9n(2+uf=cMG9f*ROF^`<_75HJ_eQv-!0N1Ew6@iJzW@}oW zH~r%klOP;`e{K0|jv*6-_QR&CiuUT?2?Xlf5Xy-#&&<%ZT}a^9w#8zPmdnF z6r6PVr(o2l6er`(y(UaZWn2yl z-DHelIbGBC`}B1653$Zc9J*AL4bG3(*Yp@pY#Ny0=^iGG>aWRn;8}qvT`@W+=>`d% z@?d4HMy{?7oRy{f7;&DxXmXBWhOFvGid#A8A-@~k;%n^bP(~4sv(y(1!pVhAS`;S#u-99&uFV`imBf_sr zs0t3jGafv*(Ue2;>hZdAa9lo2+!&w2vVf>myob~zfo@!Q30t}!J}-9%IhQ*lY&}1d z;VwNdJ9oJCZOsP3KW{FRjbL4PA2(~7-0@_?UiQ2b7um=Z2o;kS8usJXM&6#HlOw%` ziWn`=YQVT$`7&|2d%w;T*5*s3yQD<&(N^qR+#slwMY~N2RNgZ`u0K&CdES;kv-(B~ zEf-`)<=KG$kwJcf3|($hb3E*^1x+kKy=&v)3s7Q6V8c#lxoug=Y{avGng zB0t-n%G%fQ%tr%`2vuukgn>9{Nb#UEXSl#d@1yyO%8X90|HR!@2WOJLM$4|)pGW)} zNmx{-y301+t6PGfSpV4_Ssn_rN<9XK-VFD~@x^|L^ghs28rHj@UKmF#85<$Sn?{** z4hM>chV~I5<{c*s3g_zj1p4Lnar)b=R#iQfE1|Dj;dH&lj)4A${E^V^0W$A`<64Tw z#*+y1^XL8M4~&P*x;Oqlj2?%f@yr=U^S0pplRye!Inv*zG^Ta2BKW&0KgOU~i#1B^ zcIhz0ArqNK#r$rHy%H%@u~LQ(#G?=iFv&1S1pQzmp2G-ob3prN>=>Rv2zuGZ@<99G zSMXNP_|CB`o=w>g=G&2;ne*d8h^2b3N-2ma?)->X-DQsUu~@wM;U_&^E;psf zHu-BR&?uIjmfXviRVkuKR`4R@mEwW`Cch@VM9d-=JW9Eh;~3yDD&cZk8-ahB5(1F_ z403dcZkH{+icq%XEX{C02e|dqQ=CB{8k=`C8N*lW4)sGksEZ%$2i2C-7=Nu*FiqH) z6K4))O;UyBgd5vVFnVGH5)ePLtEEt+nBryPjoyfsPU!ECpKcb zC@gBq(FXInlkG@E|A04}V?vnZQBy$uZCVA0;14X`JIo#Y0M9EIR)|*bi0Yv_K(fOi z5yUS5YBXr(1sI+C6A^>3HL$;j7=?%v5CbwdDH*u2)v<_wqm{C_2GD{+8H6uE*$5)k z#!6upjvMjjx$4Ta%!RJwI%|6TN`o6w1N+wy47LV)D{H?D$O(dA7=Z371P z0vOL4Zu~3~|H59_QD~p!3@6kC#&fN=O^cR+Vr&(DQ)^5Tbbht@;HjjEo%7S>ZKx;7`u4SZmG2%w6n_)`0Y z#)M2!=UI3hZ_)|$E!({hRNuO`X7z2kEplPJUgrt}`f)BcS8JrK-3{YcV`>iLDPym^ z?bw&>?Un`Al(5TFUx3c^MXGfDR`KSHohRT===dFg-AhVuaPSkZcIh4*PX}npF@P+GMy4wZ`YM4MSpbUA!p_s=y? ztVn}umPJ3H-mgCkIZ7$oHXMwA^0p}z_$MJcqSToU%EpA14@BuBv90P$C7N8~J+rHZ z_M@f;2XAt0m*gjdSsN3a^>Ak5W8bvXurDdTn%3dVojXOTq{%4M8a@TaLnIUtsPzAt1FvPZ z7l3X000+UGP&^9rA_)@8A zXzu@6m@fY(S|o6FpZM}zHgYnuv5`aGK(Xu9!FBHzi)JFTrhj$p(iUX5gdoRB%N1?iCe~3e=-CftZ4iXX>|dVZ5+YHC?jZPNvW`dCB!u zqLWn|2l8-JucH!0$PDaQ0z(|copbh$Uv~@VUMx32gFbSkZt?>X#5%1+DW}};e2S+D z1D{pLJ~%8cS`Y5z@cyWE$6~4M7SGOc4NmQKIRGSoTo;ggYT)dS3^b56cLXsuC^PcI zbP|q~a1q&I`HApO^ltJnJ&BMNP^uF8l{v49A{DW!TeOG#+Qp@y`dY0~S5R8i&f8&z zn8=sNlj78_&w(VCTK|>#`a17!r-liO5fFj`zD4#n8~-LuJ2b<}ct!*qCIEq#=?+?r z=F)Mx6czD3iQrDdkRa=K0VK27Wk?52FF$HBG>zxsvTjFxd$s_PKYhv~I{+LU-s^9V z>$bR0kK-U4p0azGVOUFNv~X_Zh=FOrBvX?2TjGgl@75ga5&>+}P5OF4`qUOEznz?G z;-+|M`T?lR^7D3^K8;I84vpyoq%VH0Ozj*M}{G28*6n|8VxrFuDtZt%=8IB3mQ1I?5D)*HY!~gY?+VX zl3}U}H3wc6Ewv=2!pXK_T@JTec+tF}L=abmu#gsgD85quc635}b2`?u=g!{W+#=O7 z+$cdmIs72TTOKFB;~*ttWL$RadLmB{CclQV^@p#|4l&@2(-z zYyGszJ$M66e#o&DzA$%@lB&XR1cN9%qWV%4NWwUHA9EvhAhf`JnyLxF$r{;=Rgx3k z<_33y%abs%i7*R7h3(pyrvT%=F_&V=H_BI%|iDIYedF z8be~X)mR+6Q|~j1oBtPA{6Vx)+)+V6fj;j0b`%2ocV`K2)mada+-Cm{k|@%cKGPIR z*h98%!TDj!Hbb({iPtev4@_krudWc8g*W;;bPZ1*{mQNgk2-0RntJ|*wkI}TGsRaU z15i5!v9vkUdMs&mtMh#Z(v(TL!_xbcDNm&}y@fp zFR7i-*Poaa93D86HCjH0nhlCRvNt^|0|#6*flcD%e1Fb$)0^3i+nIIjQrOB^>sc3du2uMV;BB*? zIgCXxX6)Ohf;yYPD!CS#;h4eFGj8qrfO?O|Q-|i=lBi+W7KEqQ5RNZDBIPVNRa9Tw zmX5}CBOHqo3{Ty<(|NYcLfu%BSY1n+23gys^Xm5cdnT#XHAzW;I3H?{f~2lJERCj+gKlTnkJwe319{3kZhCtT*+(4|$; zDlg5MCa@G}t5kiZy&vF!ygZ^cQ-XL>VJ7;-=UX<>!(j@$jvtBujkxQGr~75w-kB|F zf=|tsVdPZuJmY&?k={{*V{&+#vLelUgsaz(ZIA}UfX%a@x(i}fEymAUDGV%|r9Xm{ zRt82pjrs$l#wVdLe7ZW(E7~UhQ%z%ST+NmT&qB&s?n_MqA&!ri=ic(-%)|j;nN@D2 zN~B57+9dub9Dl6weE)F#xe+1V+YW3YO^Vq&HE>}~)BWnV!YG*!1)e`+*h?E`c$%k? z7}wep`5ta3c9oxwklq*Ma3CFPZR!`4D3TW1peL%NmGN&xziA6xP2{+!Vov{bax)gv zl>kf^EaybQtIP%Nt>JP5@lGBSChv6a-)AMv8{3DG=y?>$00{t3@HrhX;-vU+7qw(F znO8YlRhoB-6@{t#eHvO=VLEPlfG1lOuHZS1L;TvsrNy21a`|W?#)T3jUuJA9(EgFF zW3h)kGlXEeltJ3#md0_&$M6bDwUKveoLsM7J5MOZVBrZ&!WozXTaO#BX_}Zn2wo0H zu`bU$?LgvCWhChFONPRS_?+RU_hhBc6~%n)rJW-%WCKNXQXwIc`9y=4-nKV@%!pG@ zv^wzONs?%c>AhBQY^G>5wkc7b@n=YPUbCGEH`&m=-$jqlx`Rlq-}HbYZ33Q9kIpe3Co$WNE-Mrrm(@ z22{Tep<{N`=J0MOnr`=jkx8MDN z8&#e`9%Fat$2D78_VmPh>P`3(*dfJ*OV*4EcY?slOVZ|I@gILa6!Sf;`;ZWhnPKqy zZtVu294XP}HG+ktf(BQGu@J1u_FgR>*K5$0J@ajauD`M+_!Wlnbsl#YW=$6bKVcHIMO2;O)I2Z z!Re!NgK7!W&oUOsCbb#;iI4qtZ_Xp4bhz)s!seu7YV1EktU%`^c;M16 zmDbtgF$dp*1AOcGQBX$WE~CI=vmA71BUgbyDYQ&OU#pV(zLR*$BdOQt)Cho26-<=@ z(y0*aqJBuVTSM8+_lZ@YhL3v6?4PqG=ww&lZ^ClOt;?k)FlYlU8WgvhjtUi8jKUD0 z66ON64<&jlsD-iH*KJf_QI8Hl*!MJ#jvbF6g+41{a~kH04TXzTxa9J?XXF; zDBQ8gJXhDQ6BhbJSM_~?!K=aWtL8S`*SQ2UHf)#Ws}@z&s@G0Y1xEd49oN2!CY=@% zN|dL-p^k9VXe8> z1Yaauh7-<$ldNe?%q$_H*)X*ZVMvxbl-QE#ZD}u=i|)f)`jf?VRZ4~El@VS5Fyg-{obnZ zgn8a|k|fIi9PZE#^5<*xtwpC0+C_F{td+k~P(Z%#x=2bTqp2wLnEWM$?_W3X^zrlV&&!KR z=5t-gWUcN;JSF9|%RhWTBlHyCmJq8)dDzG>#x=|GlY7@5`Hq|eZcb09zPG=(X+THi zWzjb|8DGg#$&!9CwdqPxNB#;OXOpTZlL40um4fk^M5Gr&3o&Sb{)Lq$RUWRziIS|z zlrUnCQd&EZ$uh>;cT8CuEmYqI&ZRN0376KCp&JAhZVO|Vz%#kMR3h*unssp?9g5y&c^#lxkJxel zbk_GRrJH?x`=Yhz>cvR5C@sk>Zyf|z3>IpkmFIj%RxlVn)|5#~H;ArbJP_j!GBvtynl5)R8 zrXzoH_$!InxvbiP<}9Kc-drJB~X3gp0zie6R-nWlwkec5w8Cz=@adU#c1rerIb?u*9|0p zdW9}oHd%tnUv?F62Q}qTiMDPFPW_=5Zf{2a*qi=8(g3eK_9@Bv8?@2gix4h$J8jbSd!%WCwaT1$|Q) zcm6|o5hXa*1!#6FrAuCpY)!4rz(`$%-1N1i#JMhOt2-Ohah`B{LRb^_S7ln9Re!9^ zF~WP9i#H->KK&X&*U&Ip?kd#dJrZ*!(8EFvFv*qr5DM)A0S9D=zl)npOUH!rPt+GzKDyZ-nA%V zhUYBOm*7asW8JgnP6ZxWC*d&k$g?PAX}b|AH+h26awLbDv*Isc`6#MSt4bY!q?>5d z@X-n{hT50v(M-wJ6Ze`$6rUEU7Sc9sKr*AcmfcE%P_cNH-@^52N2#T}cTV8U*3b>H zFHRiOO$wxgH11yx8&wa}%!)pp2neWIYH@?GCm-*Vt@s^1nV!!{x>5^u!I9 zrM2`d*A<%K8DciBJ4lCic*sx%XN^u(>cp4#6HvP!o>p%0iaVb7dRT@pU1fFXb3W@P zfsyX|ZVB~Mbe#G6J$Bx1uF>Q`#nNhy;RAu+v5MQ@o#bf^H`M8QVy$d@;g?c+v8~s! z^Jk*oXIsJf)%J4NIj62da^kk@t4f z*)OW#j~83$i62L=0&>Vmvgq>bC41dG-d6_yj(X~1X4}jkcKBWCGrz#p zt~WqTpBbOYvc-lGDV3Fq^oECHzELby37F4w`i3t7pmm{3umSeo&?|x5 zXwX{ej~^`5`R|wt@po+g#fi8z^)|MyuSJ-+k8^d>6S#trLEDR|!!BJnTD{&I>mI!)U$|Rjq#UY1l%3Ce<4r zj<{q7wau9~W)TQp>3WgQ)hXSlIE0%ViZE=)I4*_jP&ItGiIBL}8yP!{4@OJIsBnH> z@Agw_&8SzoHF)gJz4NjB3AnN>_OK*#nh-2@bV4~HBqx9@+IUl;k~7(PW56a>ZgsLh zy#%*!<)}5%pt$ACNk>NB?rl5UeMek7q)U*Q1aBx}%efLelFefjU9lOUQ!%8SK}NfX z(Rh-uOv&XtmW4r-(;9I5&{Tv^N~4A7q(620e?zfwLUR&hD}nd`OX8Q z0etj3$s%;;F3)}iZXkU?b&4oL4$O%v5eYtBw?WBwVvx&G}P`gwnPHM`?_-p;_f zz8{~B@9^->_>0eM-Brvli(}R5Ue+V=9D7IiE!jmxK>P<_4cFIf{kfc*XN81!0Li}s z0)=XA0NxWgz$$Jy5P0Mv=t=yiCyA&f5#kEXB)oYh5uYM&Hw9yY+v`k}{@-=1oZbnqZ z%L)aLka?PJUNBmSz9LO1FxmD=~ zF@#SZ# z{eRJE7-k!J&HjQ^`{jXk*3T-$tJJX<-30Fb-33xpEQ0VNm<^w_%CD`;Vgx=+dXlN{ zg~A3)QThlM7BVSh?vVylE>N9jl4;WnRdh{yr9dEN(c#DmC`S(FL_xETqp_bO{QgZZ zO1r}R94TZv&2UU`l0Gr6Hf%H~r->+pqCPSJ`sZY-#71M;F^(g-Px)4&*6o!<(e6h| zpC$54)Qew8Jiuif_r+r3XlQ@f1wqWoX}U+-x4TDkaz^MacI!sjaqMP#Ce7lq+9QVG z?BqKXe2%-iMW4cMG*Ae;skc6~HN4JwoRh|brcgd)QuQd+iTE0{EL}60UH-13zK%|! zUjHla>*(Ul;phF6z!o*`l;-1PMd`6|Ml{H3bro+PSk`~*iQ+n z9R~EUbJAGEQ*WCoLBmQ>`QpJe3i!o1g0#qZ*JXTFi65?e&I}P+pL$?bLy#xLlAX_j-^5jc@T{7ozJd^5c#t*uY;YQ(G?5JgHmN=K473!%0! zy$bhqYUKKP`)7Oi`@m$J8wa7k**NNAirO4gI0BJkJ$#*16#^$I7@IOM(~a@ z6H-?{;5sYX9=@Ftm(}}>|9lT^Vi*M0JhnQO^-x26Gn-LG`iRA>;0~YLX#9$7h455G zKUabW3NKsXMH3MuF_1FheH)9UG*BF$uX51{>9KBZz)H^fvRA&6Ae^5(*<9Ok$YUnE zayn`r4IJxY;>~sUN05?6YGa>mCj;D?>Z23zc#(M}22GE~PK)~smRPFb-h)~qcGd?I zY8rn*pzeP4#?@A)X{U9qdam=baQqbNESeB37Tu2;D*kSrQ*c6hLuQiSo0bh`i}ilkZgEO%Ctje1@Gy^J0} zj(dPw2$m%fx**{Z>9|et8CU%G^u zVCL)iA7Y>E{XuJkH=&YXKC6K+p@?zEz1dlNlfdJ~Z#aSJb zQ8>MSuY_sHb(G(^>TWy)zt85_>xGkIKYP0l`oR>D(=DZ>Etk^iTNmti>lQ)lEAV_( z5|1nmPYvjAcO07PmdLnjJv|G4t#n0<)fuuB+fzmqZU0VJqXn7#&X1;35;C0V08^Zy zdtZ&UuvdLfiNw~-ElJ8~cdz~X>@PgqQlrSeePC-P-i1mU;esOhpKnmGSJu_)K%3MZ z;feSq6PU~hb}p}_L8W(R5z^A;z77)iT0?jh<}DL~BWHAMfE^0n^<6;AH>>X9Ko9wH==pgM)@8w95XgRq zd3zQYX^TaH%NmNtUl4OOX`-t*VJ+;%kD53EY?QGk>X?Z{J zErfpmr_;Z&4ulT=wDX*`Qz?zFNa(JOrH*JXrNJkoaun8aKbwBhM@cQF0K}wY$+b;k zVHJLzrp0i;Yy^?{zFqG|K2s6eHO?$_15`e95RT3=T(1tetUn5r8CH(Q^#_yn?C&!0 zxk%-uFyTxY7ODzI&ifk$FCyy+l+o{d4gKpP7(NSWw?9jwY>(pKVj(1H-Z_4J*V;#2 zR@FXw;Yle=f3UkYjt!?2&HU&pJ~YkN$G+r)Ge*rxq^ma;zZHh~FfXV{UIjHTz2S|Y zp~x>TRwyr@bsn%x(%D=lUyR9T%~=IA(N8rSigCIwk~^z%lJMj#?{A2|8_-gig@w^G z5s_VaD7!?O)2mRwv6%`g54ukaEvIY=xS??N2FUcra7j=4p=(^YdbOr!x{6xM8DH*H zREOE zq1tdOVgfYr3`(mwVES^53OIqJqGsYzSL~g`gk$&~P)NQn`W3(1MAH~CC{m5_e;a4& zYh&y7aEYkLKNnEAwi;(t7NTf9s2=qCaH72b+O*qqGzm6$yLmS=iWfyD>Bo`Fh!tHx zPx%C?!dv6@xD0}M2qE5IwY<^v&OszbHm984gfkiXXCP?9JzcPKkk&<7Tjc|2Z8E{3D?L_w+!@|4sPt-zQ_5CCJ76 zhnM;i_8kFHCs8H8?pnaZ5gZHSq(NE#BnFZRIzKox`uTDvhAO}g;e0a|#t}qD6-yrI z1cLn~ z&P2{cV-nM@SP*79F_E_-_033%{8QhXkn!?uwunX2JOzy4TS_pqOV z&M@M@H%t?QSO5c~AY1D*d22onuT-v99-Dd->Qf!{v!42|3)hL{*AD*o%LV_w|Nc<_ zJM;GcyZSV8bTnW#VEGS@-r}=zIT%jOuciKqi2oGAjwm^n?4aJJ>fl7Sn1pf@E!lsa zASYZaVgv`m29P9>JQOp7;H?nKDQdo$C__uw&-nX`Ve-RYkg2(jx->5$wHlZBBw80ZqiDyKmj@ZAu8uHfN4 zUCVPydv>fD2r1Pyy^zZheT6mrGd@T@4wU1g#2zT|&oyv8s)Ltzl#ByN@&I*sGwOrZ zfMoI2i>|mCQNigg(M|@FHry%izMYn=d8>bc_nQIx<`!TsT0{~K$yJ47VX3k{rN8ZWG#R;Xh#M|G~5v>-9e(;=l+DNR) z7otXW{F7fBaGKA+pL5U~um_*6l%sfn#17<*_A4(ykQ=xdsIzFYxKvl-Z3e7PnqH%! ziW$On6XV4Qewa;|H<8VVHG?vwo@>@J8`wsY9Kd|}XzuBA4IicAkYtTNfz-gS+K^&r zIM*&3l%mcr?dgDr&)E=#Xt^Jr`5Q0{vJRqU)i4kOo$?Ubw`n>mcWZiwc%Z-DUtQ{( zBGtNQhqiqn8JJx|Ssuf?J*yuZyh_MCV8#wnR^k3b86>Pk93ErP>V!m+HsrC-t5a{* z6S+5}`n&ElMgi+qR(j(b-c$rgajF;4Tr?SoB2yp&iYuVBm^bFDhv+ojBGs>ho?I$PU6JV&WX3HpG%;>L`z)`=5kq3eObc4LF;>C1?<19A3s zKvGsbAK(@Ga_%rN_8J`doUn5dz`6RZ4f_1gAt15=8!Kp#?%l&GmWFSlHB9qZOLqJ) zqj`*}2@puAr9VPg-=>}$C~xTJ-2H2WlGg}^hg&R7oT=~PREb`ZjuNUn5TS1n_>k=k z9jjg$mxT+Q?$@B$U?*vmW1r?cg~Ajre&6e>BK}8~dApviic}--a2ypn|D!T$QoW0y zA(~ig=1PTuoy49H8B8+>D!D3<+WGSf(Hs@Zv>1zegc0I zgqxZR+z<3Tk_lMy&?!aqL6q1J@Qe##&zWDgI_lcclSb}Om`E6xkf)FV

FB7jvO6 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 Zm>YD&q{1RtAD!UG2%ZajDTAjM_&>4X3!VS~ literal 0 HcmV?d00001 From e78d4ced6a43f6c2515695682328731a057564bc Mon Sep 17 00:00:00 2001 From: Martin Kellogg Date: Thu, 22 Feb 2018 15:13:07 -0800 Subject: [PATCH 55/79] minor fix --- .../java/org/jfree/data/category/SlidingCategoryDataset.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index f7c188632..a5d109c33 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -177,8 +177,7 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { - /*@NonNegative*/ int result = index - this.firstCategoryIndex; - return result; + return index - this.firstCategoryIndex; } return -1; // we didn't find the key } From f19cea1ef6daccda17b9999264481c5b517861d8 Mon Sep 17 00:00:00 2001 From: David Gilbert Date: Fri, 23 Feb 2018 06:08:33 +0100 Subject: [PATCH 56/79] Fix test that fails in different timezones. --- .../data/time/TimeSeriesCollectionTest.java | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/test/java/org/jfree/data/time/TimeSeriesCollectionTest.java b/src/test/java/org/jfree/data/time/TimeSeriesCollectionTest.java index cee454dcd..1e8ba2615 100644 --- a/src/test/java/org/jfree/data/time/TimeSeriesCollectionTest.java +++ b/src/test/java/org/jfree/data/time/TimeSeriesCollectionTest.java @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2016, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2018, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,19 +27,11 @@ * ----------------------------- * TimeSeriesCollectionTest.java * ----------------------------- - * (C) Copyright 2003-2016, by Object Refinery Limited. + * (C) Copyright 2003-2018, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * - * Changes - * ------- - * 01-May-2003 : Version 1 (DG); - * 04-Dec-2003 : Added a test for the getSurroundingItems() method (DG); - * 08-May-2007 : Added testIndexOf() method (DG); - * 18-May-2009 : Added testFindDomainBounds() (DG); - * 08-Jan-2012 : Added testBug3445507() (DG); - * */ package org.jfree.data.time; @@ -58,7 +50,6 @@ import java.util.Locale; import java.util.TimeZone; import org.jfree.chart.TestUtils; - import org.jfree.data.Range; import org.jfree.data.general.DatasetUtils; import org.junit.Test; @@ -309,6 +300,10 @@ public void testIndexOf() { */ @Test public void testFindDomainBounds() { + // store the current time zone + TimeZone saved = TimeZone.getDefault(); + TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris")); + TimeSeriesCollection dataset = new TimeSeriesCollection(); List visibleSeriesKeys = new java.util.ArrayList(); Range r = DatasetUtils.findDomainBounds(dataset, visibleSeriesKeys, @@ -321,10 +316,6 @@ public void testFindDomainBounds() { r = DatasetUtils.findDomainBounds(dataset, visibleSeriesKeys, true); assertNull(r); - // store the current time zone - TimeZone saved = TimeZone.getDefault(); - TimeZone.setDefault(TimeZone.getTimeZone("Europe/Paris")); - s1.add(new Year(2008), 8.0); r = DatasetUtils.findDomainBounds(dataset, visibleSeriesKeys, true); assertEquals(1199142000000.0, r.getLowerBound(), EPSILON); From 6eaddd4f1f17f36a0e293ba571c86b45d4c31794 Mon Sep 17 00:00:00 2001 From: David Gilbert Date: Fri, 23 Feb 2018 08:39:50 +0100 Subject: [PATCH 57/79] Fix for bug #75 - add same outline options as XYLineAndShapeRenderer. --- .../chart/renderer/xy/XYBlockRenderer.java | 95 +++++++++++++++---- 1 file changed, 79 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 2a72a137f..418e79864 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2017, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2018, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,27 +27,15 @@ * -------------------- * XYBlockRenderer.java * -------------------- - * (C) Copyright 2006-2017, by Object Refinery Limited. + * (C) Copyright 2006-2018, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * - * Changes - * ------- - * 05-Jul-2006 : Version 1 (DG); - * 02-Feb-2007 : Added getPaintScale() method (DG); - * 09-Mar-2007 : Fixed cloning (DG); - * 03-Aug-2007 : Fix for bug 1766646 (DG); - * 07-Apr-2008 : Added entity collection code (DG); - * 22-Apr-2008 : Implemented PublicCloneable (DG); - * 03-Jul-2013 : Use ParamChecks (DG); - * 20-Feb-2017 : Add update for crosshairs (DG); - * */ package org.jfree.chart.renderer.xy; -import java.awt.BasicStroke; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.geom.Rectangle2D; @@ -109,6 +97,15 @@ public class XYBlockRenderer extends AbstractXYItemRenderer /** The paint scale. */ private PaintScale paintScale; + + /** A flag that controls whether outlines are drawn for blocks. */ + private boolean drawOutlines; + + /** + * A flag that controls whether the outline paint is used for drawing block + * outlines. + */ + private boolean useOutlinePaint; /** * Creates a new {@code XYBlockRenderer} instance with default @@ -117,6 +114,8 @@ public class XYBlockRenderer extends AbstractXYItemRenderer public XYBlockRenderer() { updateOffsets(); this.paintScale = new LookupPaintScale(); + this.drawOutlines = true; + this.useOutlinePaint = false; // use item paint by default } /** @@ -234,6 +233,59 @@ public void setPaintScale(PaintScale scale) { fireChangeEvent(); } + /** + * Returns {@code true} if outlines should be drawn for blocks, and + * {@code false} otherwise. The default value is {@code true}. + * + * @return A boolean. + * + * @see #setDrawOutlines(boolean) + */ + public boolean getDrawOutlines() { + return this.drawOutlines; + } + + /** + * Sets the flag that controls whether outlines are drawn for + * blocks, and sends a {@link RendererChangeEvent} to all registered + * listeners. + * + * @param flag the flag. + * + * @see #getDrawOutlines() + */ + public void setDrawOutlines(boolean flag) { + this.drawOutlines = flag; + fireChangeEvent(); + } + + /** + * Returns {@code true} if the renderer should use the outline paint + * setting to draw block outlines, and {@code false} if it should just + * use the regular item paint. + * + * @return A boolean. + * + * @see #setUseOutlinePaint(boolean) + */ + public boolean getUseOutlinePaint() { + return this.useOutlinePaint; + } + + /** + * Sets the flag that controls whether the outline paint is used to draw + * block outlines, and sends a {@link RendererChangeEvent} to all + * registered listeners. + * + * @param flag the flag. + * + * @see #getUseOutlinePaint() + */ + public void setUseOutlinePaint(boolean flag) { + this.useOutlinePaint = flag; + fireChangeEvent(); + } + /** * Updates the offsets to take into account the block width, height and * anchor. @@ -381,8 +433,13 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } g2.setPaint(p); g2.fill(block); - g2.setStroke(new BasicStroke(1.0f)); - g2.draw(block); + if (getDrawOutlines()) { + if (getUseOutlinePaint()) { + g2.setPaint(getItemOutlinePaint(series, item)); + } + g2.setStroke(lookupSeriesOutlineStroke(series)); + g2.draw(block); + } if (isItemLabelVisible(series, item)) { drawItemLabel(g2, orientation, dataset, series, item, @@ -440,6 +497,12 @@ public boolean equals(Object obj) { if (!this.paintScale.equals(that.paintScale)) { return false; } + if (this.drawOutlines != that.drawOutlines) { + return false; + } + if (this.useOutlinePaint != that.useOutlinePaint) { + return false; + } return super.equals(obj); } From 4752f0dc162c4dba9bbeda92d11480cec5d0a86f Mon Sep 17 00:00:00 2001 From: David Gilbert Date: Mon, 26 Feb 2018 19:11:54 +0100 Subject: [PATCH 58/79] Update Javadocs for overlays. --- .../jfree/chart/panel/AbstractOverlay.java | 9 +--- .../jfree/chart/panel/CrosshairOverlay.java | 21 ++++------ .../java/org/jfree/chart/panel/Overlay.java | 41 ++++++++++++------- .../java/org/jfree/chart/panel/package.html | 3 +- .../java/org/jfree/chart/plot/Crosshair.java | 22 ++++++---- 5 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/main/java/org/jfree/chart/panel/AbstractOverlay.java b/src/main/java/org/jfree/chart/panel/AbstractOverlay.java index 07aba8729..87111c870 100644 --- a/src/main/java/org/jfree/chart/panel/AbstractOverlay.java +++ b/src/main/java/org/jfree/chart/panel/AbstractOverlay.java @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2016, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2018, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,16 +27,11 @@ * -------------------- * AbstractOverlay.java * -------------------- - * (C) Copyright 2009-2016, by Object Refinery Limited. + * (C) Copyright 2009-2018, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * - * Changes: - * -------- - * 09-Apr-2009 : Version 1 (DG); - * 02-Jul-2013 : Use ParamChecks (DG); - * */ package org.jfree.chart.panel; diff --git a/src/main/java/org/jfree/chart/panel/CrosshairOverlay.java b/src/main/java/org/jfree/chart/panel/CrosshairOverlay.java index 738f8bff3..dea1edd3a 100644 --- a/src/main/java/org/jfree/chart/panel/CrosshairOverlay.java +++ b/src/main/java/org/jfree/chart/panel/CrosshairOverlay.java @@ -32,13 +32,6 @@ * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): John Matthews; * - * Changes: - * -------- - * 09-Apr-2009 : Version 1 (DG); - * 19-May-2009 : Fixed FindBugs warnings, patch by Michal Wozniak (DG); - * 02-Jul-2013 : Use ParamChecks (DG); - * 05-Mar-2016 : Fix label outline stroke (DG); - * */ package org.jfree.chart.panel; @@ -56,7 +49,6 @@ import java.beans.PropertyChangeListener; import java.io.Serializable; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; @@ -74,7 +66,9 @@ import org.jfree.chart.util.PublicCloneable; /** - * An overlay for a {@link ChartPanel} that draws crosshairs on a plot. + * An overlay for a {@link ChartPanel} that draws crosshairs on a chart. If + * you are using the JavaFX extensions for JFreeChart, then you should use + * the {@code CrosshairOverlayFX} class. * * @since 1.0.13 */ @@ -88,7 +82,7 @@ public class CrosshairOverlay extends AbstractOverlay implements Overlay, protected List yCrosshairs; /** - * Default constructor. + * Creates a new overlay that initially contains no crosshairs. */ public CrosshairOverlay() { super(); @@ -97,7 +91,7 @@ public CrosshairOverlay() { } /** - * Adds a crosshair against the domain axis and sends an + * Adds a crosshair against the domain axis (x-axis) and sends an * {@link OverlayChangeEvent} to all registered listeners. * * @param crosshair the crosshair ({@code null} not permitted). @@ -217,7 +211,10 @@ public void propertyChange(PropertyChangeEvent e) { } /** - * Paints the crosshairs in the layer. + * Renders the crosshairs in the overlay on top of the chart that has just + * been rendered in the specified {@code chartPanel}. This method is + * called by the JFreeChart framework, you won't normally call it from + * user code. * * @param g2 the graphics target. * @param chartPanel the chart panel. diff --git a/src/main/java/org/jfree/chart/panel/Overlay.java b/src/main/java/org/jfree/chart/panel/Overlay.java index c4d4163f5..191e36192 100644 --- a/src/main/java/org/jfree/chart/panel/Overlay.java +++ b/src/main/java/org/jfree/chart/panel/Overlay.java @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2016, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2018, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,16 +27,13 @@ * ------------ * Overlay.java * ------------ - * (C) Copyright 2009, by Object Refinery Limited. + * (C) Copyright 2009-2018, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * - * Changes: - * -------- - * 09-Apr-2009 : Version 1 (DG); - * */ + package org.jfree.chart.panel; import java.awt.Graphics2D; @@ -44,32 +41,48 @@ import org.jfree.chart.event.OverlayChangeListener; /** - * Defines the interface for an overlay that can be added to a - * {@link ChartPanel}. + * An {@code Overlay} is anything that can be drawn over top of a chart to add + * additional information to the chart. This interface defines the operations + * that must be supported for an overlay that can be added to a + * {@link ChartPanel} in Swing. + *

+ * Note: if you are using JavaFX rather than Swing, then you need to look at + * the {@code OverlayFX} interface in the JFreeChart-FX project. * * @since 1.0.13 */ public interface Overlay { /** - * Paints the crosshairs in the layer. + * Paints the visual representation of the overlay. This method will be + * called by the {@link ChartPanel} after the underlying chart has been + * fully rendered. When implementing this method, the {@code chartPanel} + * argument can be used to get state information from the chart (you can, + * for example, extract the axis ranges for the chart). * - * @param g2 the graphics target. - * @param chartPanel the chart panel. + * @param g2 the graphics target (never {@code null}). + * @param chartPanel the chart panel (never {@code null}). */ public void paintOverlay(Graphics2D g2, ChartPanel chartPanel); /** - * Registers a change listener with the overlay. + * Registers a change listener with the overlay. Typically this method + * not be called by user code, it exists so that the {@link ChartPanel} + * can register and receive notification of changes to the overlay (such + * changes will trigger an automatic repaint of the chart). * - * @param listener the listener. + * @param listener the listener ({@code null} not permitted). + * + * @see #removeChangeListener(org.jfree.chart.event.OverlayChangeListener) */ public void addChangeListener(OverlayChangeListener listener); /** * Deregisters a listener from the overlay. * - * @param listener the listener. + * @param listener the listener ({@code null} not permitted). + * + * @see #addChangeListener(org.jfree.chart.event.OverlayChangeListener) */ public void removeChangeListener(OverlayChangeListener listener); diff --git a/src/main/java/org/jfree/chart/panel/package.html b/src/main/java/org/jfree/chart/panel/package.html index 550eadb30..1538e8aa9 100644 --- a/src/main/java/org/jfree/chart/panel/package.html +++ b/src/main/java/org/jfree/chart/panel/package.html @@ -1,6 +1,7 @@ -Classes related to the {@link org.jfree.chart.ChartPanel} class. +Classes that provide Swing-specific support related to the +{@link org.jfree.chart.ChartPanel} class. diff --git a/src/main/java/org/jfree/chart/plot/Crosshair.java b/src/main/java/org/jfree/chart/plot/Crosshair.java index 9125bb159..25a18dd9e 100644 --- a/src/main/java/org/jfree/chart/plot/Crosshair.java +++ b/src/main/java/org/jfree/chart/plot/Crosshair.java @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2017, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2018, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,16 +27,11 @@ * -------------- * Crosshair.java * -------------- - * (C) Copyright 2009-2017, by Object Refinery Limited. + * (C) Copyright 2009-2018, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * - * Changes: - * -------- - * 13-Feb-2009 : Version 1 (DG); - * 02-Jul-2013 : Use ParamChecks (DG); - * */ package org.jfree.chart.plot; @@ -55,6 +50,7 @@ import org.jfree.chart.HashUtils; import org.jfree.chart.labels.CrosshairLabelGenerator; import org.jfree.chart.labels.StandardCrosshairLabelGenerator; +import org.jfree.chart.panel.CrosshairOverlay; import org.jfree.chart.ui.RectangleAnchor; import org.jfree.chart.util.PaintUtils; import org.jfree.chart.util.Args; @@ -62,7 +58,17 @@ import org.jfree.chart.util.SerialUtils; /** - * A crosshair for display on a plot. + * A {@code Crosshair} represents a value on a chart and is usually displayed + * as a line perpendicular to the x or y-axis (and sometimes including a label + * that shows the crosshair value as text). Instances of this class are used + * to store the cross hair value plus the visual characteristics of the line + * that will be rendered once the instance is added to a + * {@link CrosshairOverlay} (or {@code CrosshairOverlaydFX} if you are using + * the JavaFX extensions for JFreeChart). + *

+ * Crosshairs support a property change mechanism which is used by JFreeChart + * to automatically repaint the overlay whenever a crosshair attribute is + * updated. * * @since 1.0.13 */ From 893f9b150212790041c1f5019ea5c04d3904a713 Mon Sep 17 00:00:00 2001 From: David Gilbert Date: Mon, 26 Feb 2018 19:24:57 +0100 Subject: [PATCH 59/79] Add generics for subtitles list. --- src/main/java/org/jfree/chart/JFreeChart.java | 149 ++---------------- 1 file changed, 14 insertions(+), 135 deletions(-) diff --git a/src/main/java/org/jfree/chart/JFreeChart.java b/src/main/java/org/jfree/chart/JFreeChart.java index 0a6201898..d1fb5b188 100644 --- a/src/main/java/org/jfree/chart/JFreeChart.java +++ b/src/main/java/org/jfree/chart/JFreeChart.java @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2017, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2018, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,7 +27,7 @@ * --------------- * JFreeChart.java * --------------- - * (C) Copyright 2000-2016, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2018, by Object Refinery Limited and Contributors. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Andrzej Porebski; @@ -42,115 +42,6 @@ * contributed to this source file (JFreeChart.java) - for a list of ALL * contributors to the project, please see the README.txt file. * - * Changes (from 20-Jun-2001) - * -------------------------- - * 20-Jun-2001 : Modifications submitted by Andrzej Porebski for legend - * placement; - * 21-Jun-2001 : Removed JFreeChart parameter from Plot constructors (DG); - * 22-Jun-2001 : Multiple titles added (original code by David Berry, with - * reworkings by DG); - * 18-Sep-2001 : Updated header (DG); - * 15-Oct-2001 : Moved data source classes into new package - * com.jrefinery.data.* (DG); - * 18-Oct-2001 : New factory method for creating VerticalXYBarChart (DG); - * 19-Oct-2001 : Moved series paint and stroke methods to the Plot class (DG); - * Moved static chart creation methods to new ChartFactory - * class (DG); - * 22-Oct-2001 : Renamed DataSource.java --> Dataset.java etc. (DG); - * Fixed bug where chart isn't registered with the dataset (DG); - * 07-Nov-2001 : Fixed bug where null title in constructor causes - * exception (DG); - * Tidied up event notification code (DG); - * 17-Nov-2001 : Added getLegendItemCount() method (DG); - * 21-Nov-2001 : Set clipping in draw method to ensure that nothing gets drawn - * outside the chart area (DG); - * 11-Dec-2001 : Added the createBufferedImage() method, taken from the - * JFreeChartServletDemo class (DG); - * 13-Dec-2001 : Added tooltips (DG); - * 16-Jan-2002 : Added handleClick() method (DG); - * 22-Jan-2002 : Fixed bug correlating legend labels with pie data (DG); - * 05-Feb-2002 : Removed redundant tooltips code (DG); - * 19-Feb-2002 : Added accessor methods for the backgroundImage and - * backgroundImageAlpha attributes (DG); - * 21-Feb-2002 : Added static fields for INFO, COPYRIGHT, LICENCE, CONTRIBUTORS - * and LIBRARIES. These can be used to display information about - * JFreeChart (DG); - * 06-Mar-2002 : Moved constants to JFreeChartConstants interface (DG); - * 18-Apr-2002 : PieDataset is no longer sorted (oldman); - * 23-Apr-2002 : Moved dataset to the Plot class (DG); - * 13-Jun-2002 : Added an extra draw() method (DG); - * 25-Jun-2002 : Implemented the Drawable interface and removed redundant - * imports (DG); - * 26-Jun-2002 : Added another createBufferedImage() method (DG); - * 18-Sep-2002 : Fixed issues reported by Checkstyle (DG); - * 23-Sep-2002 : Added new contributor (DG); - * 28-Oct-2002 : Created main title and subtitle list to replace existing title - * list (DG); - * 08-Jan-2003 : Added contributor (DG); - * 17-Jan-2003 : Added new constructor (DG); - * 22-Jan-2003 : Added ChartColor class by Cameron Riley, and background image - * alignment code by Christian W. Zuckschwerdt (DG); - * 11-Feb-2003 : Added flag to allow suppression of chart change events, based - * on a suggestion by Klaus Rheinwald (DG); - * 04-Mar-2003 : Added small fix for suppressed chart change events (see bug id - * 690865) (DG); - * 10-Mar-2003 : Added Benoit Xhenseval to contributors (DG); - * 26-Mar-2003 : Implemented Serializable (DG); - * 15-Jul-2003 : Added an optional border for the chart (DG); - * 11-Sep-2003 : Took care of listeners while cloning (NB); - * 16-Sep-2003 : Changed ChartRenderingInfo --> PlotRenderingInfo (DG); - * 22-Sep-2003 : Added nullpointer checks. - * 25-Sep-2003 : Added nullpointer checks too (NB). - * 03-Dec-2003 : Legends are now registered by this class instead of using the - * old constructor way (TM); - * 03-Dec-2003 : Added anchorPoint to draw() method (DG); - * 08-Jan-2004 : Reworked title code, introducing line wrapping (DG); - * 09-Feb-2004 : Created additional createBufferedImage() method (DG); - * 05-Apr-2004 : Added new createBufferedImage() method (DG); - * 27-May-2004 : Moved constants from JFreeChartConstants.java back to this - * class (DG); - * 25-Nov-2004 : Updates for changes to Title class (DG); - * 06-Jan-2005 : Change lookup for default background color (DG); - * 31-Jan-2005 : Added Don Elliott to contributors (DG); - * 02-Feb-2005 : Added clearSubtitles() method (DG); - * 03-Feb-2005 : Added Mofeed Shahin to contributors (DG); - * 08-Feb-2005 : Updated for RectangleConstraint changes (DG); - * 28-Mar-2005 : Renamed Legend --> OldLegend (DG); - * 12-Apr-2005 : Added methods to access legend(s) in subtitle list (DG); - * 13-Apr-2005 : Added removeLegend() and removeSubtitle() methods (DG); - * 20-Apr-2005 : Modified to collect chart entities from titles and - * subtitles (DG); - * 26-Apr-2005 : Removed LOGGER (DG); - * 06-Jun-2005 : Added addLegend() method and padding attribute, fixed equals() - * method (DG); - * 24-Nov-2005 : Removed OldLegend and related code - don't want to support - * this in 1.0.0 final (DG); - * ------------- JFREECHART 1.0.x --------------------------------------------- - * 27-Jan-2006 : Updated version number (DG); - * 07-Dec-2006 : Added some missing credits (DG); - * 17-Jan-2007 : Added Darren Jung to contributor list (DG); - * 05-Mar-2007 : Added Sergei Ivanov to the contributor list (DG); - * 16-Mar-2007 : Modified initial legend border (DG); - * 22-Mar-2007 : New methods for text anti-aliasing (DG); - * 16-May-2007 : Fixed argument check in getSubtitle(), copy list in - * get/setSubtitles(), and added new addSubtitle(int, Title) - * method (DG); - * 05-Jun-2007 : Add change listener to default legend (DG); - * 04-Dec-2007 : In createBufferedImage() methods, make the default image type - * BufferedImage.TYPE_INT_ARGB (thanks to Klaus Rheinwald) (DG); - * 05-Dec-2007 : Fixed bug 1749124 (not registering as listener with - * TextTitle) (DG); - * 23-Apr-2008 : Added new contributor (Diego Pierangeli) (DG); - * 16-May-2008 : Added new contributor (Michael Siemer) (DG); - * 19-Sep-2008 : Check for title visibility (DG); - * 18-Dec-2008 : Use ResourceBundleWrapper - see patch 1607918 by - * Jess Thrysoee (DG); - * 19-Mar-2009 : Added entity support - see patch 2603321 by Peter Kolb (DG); - * 19-May-2009 : Fixed FindBugs warnings, patch by Michal Wozniak (DG); - * 29-Jun-2009 : Check visibility flag in main title (DG); - * 02-Jul-2013 : Use ParamChecks class (DG); - * 21-Jun-2014 : Set default hint value for stroke control (DG); - * */ package org.jfree.chart; @@ -176,7 +67,6 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.UIManager; @@ -185,7 +75,6 @@ import org.jfree.chart.block.BlockParams; import org.jfree.chart.block.EntityBlockResult; import org.jfree.chart.block.LengthConstraintType; -import org.jfree.chart.block.LineBorder; import org.jfree.chart.block.RectangleConstraint; import org.jfree.chart.entity.EntityCollection; import org.jfree.chart.entity.JFreeChartEntity; @@ -304,7 +193,7 @@ public boolean isCompatibleValue(Object val) { * The chart subtitles (zero, one or many). This field should never be * {@code null}. */ - private List subtitles; + private List subtitles; /** Draws the visual representation of the data. */ private Plot plot; @@ -419,7 +308,7 @@ public JFreeChart(String title, Font titleFont, Plot plot, this.plot = plot; plot.addChangeListener(this); - this.subtitles = new ArrayList(); + this.subtitles = new ArrayList<Title>(); // create a legend, if requested... if (createLegend) { @@ -716,9 +605,7 @@ public LegendTitle getLegend() { */ public LegendTitle getLegend(int index) { int seen = 0; - Iterator iterator = this.subtitles.iterator(); - while (iterator.hasNext()) { - Title subtitle = (Title) iterator.next(); + for (Title subtitle : this.subtitles) { if (subtitle instanceof LegendTitle) { if (seen == index) { return (LegendTitle) subtitle; @@ -742,13 +629,13 @@ public void removeLegend() { } /** - * Returns the list of subtitles for the chart. + * Returns a new list containing all the subtitles for the chart. * * @return The subtitle list (possibly empty, but never {@code null}). * * @see #setSubtitles(List) */ - public List getSubtitles() { + public List<Title> getSubtitles() { return new ArrayList(this.subtitles); } @@ -762,15 +649,11 @@ public List getSubtitles() { * * @see #getSubtitles() */ - public void setSubtitles(List subtitles) { - if (subtitles == null) { - throw new NullPointerException("Null 'subtitles' argument."); - } + public void setSubtitles(List<Title> subtitles) { + Args.nullNotPermitted(subtitles, "subtitles"); setNotify(false); clearSubtitles(); - Iterator iterator = subtitles.iterator(); - while (iterator.hasNext()) { - Title t = (Title) iterator.next(); + for (Title t: subtitles) { if (t != null) { addSubtitle(t); } @@ -802,7 +685,7 @@ public Title getSubtitle(int index) { if ((index < 0) || (index >= getSubtitleCount())) { throw new IllegalArgumentException("Index out of range."); } - return (Title) this.subtitles.get(index); + return this.subtitles.get(index); } /** @@ -847,9 +730,7 @@ public void addSubtitle(int index, Title subtitle) { * @see #addSubtitle(Title) */ public void clearSubtitles() { - Iterator iterator = this.subtitles.iterator(); - while (iterator.hasNext()) { - Title t = (Title) iterator.next(); + for (Title t : this.subtitles) { t.removeChangeListener(this); } this.subtitles.clear(); @@ -1264,9 +1145,7 @@ public void draw(Graphics2D g2, Rectangle2D chartArea, Point2D anchor, } } - Iterator iterator = this.subtitles.iterator(); - while (iterator.hasNext()) { - Title currentTitle = (Title) iterator.next(); + for (Title currentTitle : this.subtitles) { if (currentTitle.isVisible()) { EntityCollection e = drawTitle(currentTitle, g2, nonTitleArea, (entities != null)); @@ -1750,7 +1629,7 @@ public Object clone() throws CloneNotSupportedException { chart.title.addChangeListener(chart); } - chart.subtitles = new ArrayList(); + chart.subtitles = new ArrayList<Title>(); for (int i = 0; i < getSubtitleCount(); i++) { Title subtitle = (Title) getSubtitle(i).clone(); chart.subtitles.add(subtitle); From 520a4be69ba932061ab9b89f328842caf152e1d9 Mon Sep 17 00:00:00 2001 From: David Gilbert <dave@jfree.org> Date: Sat, 14 Apr 2018 08:14:28 +0200 Subject: [PATCH 60/79] Don't use buffering in ChartPanel. --- src/main/java/org/jfree/chart/ChartFrame.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jfree/chart/ChartFrame.java b/src/main/java/org/jfree/chart/ChartFrame.java index cbd07b751..d1579a589 100644 --- a/src/main/java/org/jfree/chart/ChartFrame.java +++ b/src/main/java/org/jfree/chart/ChartFrame.java @@ -2,7 +2,7 @@ * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * - * (C) Copyright 2000-2016, by Object Refinery Limited and Contributors. + * (C) Copyright 2000-2018, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * @@ -27,17 +27,11 @@ * --------------- * ChartFrame.java * --------------- - * (C) Copyright 2001-2008, by Object Refinery Limited and Contributors. + * (C) Copyright 2001-2018, by Object Refinery Limited and Contributors. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * - * Changes - * ------- - * 22-Nov-2001 : Version 1 (DG); - * 08-Jan-2001 : Added chartPanel attribute (DG); - * 24-May-2002 : Renamed JFreeChartFrame --> ChartFrame (DG); - * */ package org.jfree.chart; @@ -75,7 +69,7 @@ public ChartFrame(String title, JFreeChart chart) { public ChartFrame(String title, JFreeChart chart, boolean scrollPane) { super(title); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - this.chartPanel = new ChartPanel(chart); + this.chartPanel = new ChartPanel(chart, false); if (scrollPane) { setContentPane(new JScrollPane(this.chartPanel)); } From fb40637ee2a12b7e7a51f8d4ef61aa906a71a2f9 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Tue, 1 May 2018 15:33:11 -0700 Subject: [PATCH 61/79] fix build --- ant/build.xml | 333 ------------------ pom.xml | 92 ++++- src/main/java/org/jfree/chart/ChartColor.java | 6 +- src/main/java/org/jfree/chart/JFreeChart.java | 8 +- src/main/java/org/jfree/chart/LegendItem.java | 18 +- .../org/jfree/chart/LegendItemCollection.java | 6 +- .../java/org/jfree/chart/PolarChartPanel.java | 6 +- .../annotations/AbstractXYAnnotation.java | 6 +- .../jfree/chart/annotations/XYAnnotation.java | 4 +- .../chart/annotations/XYBoxAnnotation.java | 4 +- .../annotations/XYDataImageAnnotation.java | 4 +- .../annotations/XYDrawableAnnotation.java | 4 +- .../chart/annotations/XYImageAnnotation.java | 4 +- .../chart/annotations/XYLineAnnotation.java | 4 +- .../annotations/XYPointerAnnotation.java | 4 +- .../annotations/XYPolygonAnnotation.java | 4 +- .../chart/annotations/XYShapeAnnotation.java | 4 +- .../chart/annotations/XYTextAnnotation.java | 4 +- .../chart/annotations/XYTitleAnnotation.java | 4 +- .../org/jfree/chart/axis/CompassFormat.java | 10 +- .../jfree/chart/axis/CyclicNumberAxis.java | 20 +- .../java/org/jfree/chart/axis/DateAxis.java | 4 +- .../org/jfree/chart/axis/DateTickUnit.java | 20 +- .../jfree/chart/axis/DateTickUnitType.java | 8 +- .../org/jfree/chart/axis/MonthDateFormat.java | 14 +- .../java/org/jfree/chart/axis/PeriodAxis.java | 14 +- .../jfree/chart/axis/QuarterDateFormat.java | 18 +- .../java/org/jfree/chart/axis/TickUnits.java | 4 +- .../java/org/jfree/chart/axis/ValueAxis.java | 12 +- .../jfree/chart/block/ColumnArrangement.java | 4 +- .../jfree/chart/block/FlowArrangement.java | 4 +- .../jfree/chart/block/GridArrangement.java | 8 +- .../java/org/jfree/chart/date/SerialDate.java | 71 ++-- .../org/jfree/chart/date/SpreadsheetDate.java | 52 +-- .../jfree/chart/entity/EntityCollection.java | 4 +- .../jfree/chart/entity/PieSectionEntity.java | 6 +- .../entity/StandardEntityCollection.java | 4 +- .../chart/entity/XYAnnotationEntity.java | 6 +- .../org/jfree/chart/entity/XYItemEntity.java | 14 +- .../AbstractCategoryItemLabelGenerator.java | 14 +- .../labels/AbstractPieItemLabelGenerator.java | 10 +- .../labels/AbstractXYItemLabelGenerator.java | 14 +- .../labels/BoxAndWhiskerToolTipGenerator.java | 10 +- .../BoxAndWhiskerXYToolTipGenerator.java | 14 +- .../labels/BubbleXYItemLabelGenerator.java | 18 +- .../labels/CategoryItemLabelGenerator.java | 8 +- .../labels/CategorySeriesLabelGenerator.java | 6 +- .../labels/CategoryToolTipGenerator.java | 4 +- .../labels/CustomXYToolTipGenerator.java | 12 +- .../labels/HighLowItemLabelGenerator.java | 12 +- .../IntervalCategoryItemLabelGenerator.java | 8 +- .../IntervalCategoryToolTipGenerator.java | 8 +- .../labels/IntervalXYItemLabelGenerator.java | 16 +- .../labels/IntervalXYToolTipGenerator.java | 16 +- .../MultipleXYSeriesLabelGenerator.java | 16 +- .../StandardCategoryItemLabelGenerator.java | 4 +- .../StandardCategorySeriesLabelGenerator.java | 12 +- .../StandardCategoryToolTipGenerator.java | 4 +- .../labels/StandardXYItemLabelGenerator.java | 8 +- .../StandardXYSeriesLabelGenerator.java | 12 +- .../labels/StandardXYToolTipGenerator.java | 8 +- .../labels/StandardXYZToolTipGenerator.java | 16 +- .../labels/SymbolicXYItemLabelGenerator.java | 10 +- .../chart/labels/XYItemLabelGenerator.java | 8 +- .../chart/labels/XYSeriesLabelGenerator.java | 6 +- .../chart/labels/XYToolTipGenerator.java | 8 +- .../chart/labels/XYZToolTipGenerator.java | 8 +- .../plot/AbstractPieLabelDistributor.java | 6 +- .../chart/plot/CategoryCrosshairState.java | 6 +- .../org/jfree/chart/plot/CategoryPlot.java | 216 ++++++------ .../org/jfree/chart/plot/CompassPlot.java | 24 +- .../org/jfree/chart/plot/CrosshairState.java | 14 +- .../chart/plot/DefaultDrawingSupplier.java | 16 +- .../org/jfree/chart/plot/FastScatterPlot.java | 14 +- .../java/org/jfree/chart/plot/PiePlot.java | 12 +- src/main/java/org/jfree/chart/plot/Plot.java | 6 +- .../jfree/chart/plot/PlotRenderingInfo.java | 8 +- .../java/org/jfree/chart/plot/PolarPlot.java | 38 +- .../java/org/jfree/chart/plot/RingPlot.java | 4 +- .../org/jfree/chart/plot/SpiderWebPlot.java | 22 +- .../org/jfree/chart/plot/ThermometerPlot.java | 18 +- .../java/org/jfree/chart/plot/XYPlot.java | 228 ++++++------ .../org/jfree/chart/plot/dial/DialPlot.java | 24 +- .../jfree/chart/plot/dial/DialPointer.java | 14 +- .../chart/plot/dial/DialValueIndicator.java | 10 +- .../chart/plot/dial/StandardDialRange.java | 8 +- .../chart/renderer/AbstractRenderer.java | 156 ++++---- .../renderer/DefaultPolarItemRenderer.java | 24 +- .../chart/renderer/LookupPaintScale.java | 8 +- .../org/jfree/chart/renderer/OutlierList.java | 4 +- .../chart/renderer/PolarItemRenderer.java | 14 +- .../jfree/chart/renderer/RendererUtils.java | 36 +- .../chart/renderer/WaferMapRenderer.java | 4 +- .../AbstractCategoryItemRenderer.java | 62 ++-- .../chart/renderer/category/AreaRenderer.java | 10 +- .../chart/renderer/category/BarPainter.java | 6 +- .../chart/renderer/category/BarRenderer.java | 28 +- .../category/BoxAndWhiskerRenderer.java | 14 +- .../category/CategoryItemRenderer.java | 150 ++++---- .../category/CategoryItemRendererState.java | 10 +- .../category/CategoryStepRenderer.java | 10 +- .../renderer/category/GanttRenderer.java | 18 +- .../renderer/category/GradientBarPainter.java | 18 +- .../category/GroupedStackedBarRenderer.java | 10 +- .../category/IntervalBarRenderer.java | 8 +- .../renderer/category/LayeredBarRenderer.java | 16 +- .../renderer/category/LevelRenderer.java | 16 +- .../category/LineAndShapeRenderer.java | 36 +- .../category/MinMaxCategoryRenderer.java | 4 +- .../renderer/category/ScatterRenderer.java | 16 +- .../category/StackedAreaRenderer.java | 20 +- .../renderer/category/StackedBarRenderer.java | 10 +- .../renderer/category/StandardBarPainter.java | 10 +- .../category/StatisticalBarRenderer.java | 16 +- .../StatisticalLineAndShapeRenderer.java | 4 +- .../category/WaterfallBarRenderer.java | 4 +- .../renderer/xy/AbstractXYItemRenderer.java | 36 +- .../renderer/xy/CandlestickRenderer.java | 12 +- .../renderer/xy/ClusteredXYBarRenderer.java | 8 +- .../renderer/xy/CyclicXYItemRenderer.java | 34 +- .../chart/renderer/xy/DeviationRenderer.java | 22 +- .../renderer/xy/GradientXYBarPainter.java | 18 +- .../chart/renderer/xy/HighLowRenderer.java | 10 +- .../renderer/xy/SamplingXYLineRenderer.java | 16 +- .../renderer/xy/StackedXYAreaRenderer.java | 16 +- .../renderer/xy/StackedXYAreaRenderer2.java | 30 +- .../renderer/xy/StackedXYBarRenderer.java | 12 +- .../renderer/xy/StandardXYBarPainter.java | 10 +- .../renderer/xy/StandardXYItemRenderer.java | 32 +- .../chart/renderer/xy/VectorRenderer.java | 10 +- .../chart/renderer/xy/WindItemRenderer.java | 10 +- .../chart/renderer/xy/XYAreaRenderer.java | 18 +- .../chart/renderer/xy/XYAreaRenderer2.java | 18 +- .../jfree/chart/renderer/xy/XYBarPainter.java | 6 +- .../chart/renderer/xy/XYBarRenderer.java | 16 +- .../chart/renderer/xy/XYBlockRenderer.java | 12 +- .../renderer/xy/XYBoxAndWhiskerRenderer.java | 24 +- .../chart/renderer/xy/XYBubbleRenderer.java | 16 +- .../renderer/xy/XYDifferenceRenderer.java | 52 +-- .../chart/renderer/xy/XYDotRenderer.java | 14 +- .../chart/renderer/xy/XYErrorRenderer.java | 10 +- .../chart/renderer/xy/XYItemRenderer.java | 136 +++---- .../renderer/xy/XYItemRendererState.java | 18 +- .../renderer/xy/XYLineAndShapeRenderer.java | 56 +-- .../chart/renderer/xy/XYShapeRenderer.java | 16 +- .../chart/renderer/xy/XYSplineRenderer.java | 10 +- .../chart/renderer/xy/XYStepAreaRenderer.java | 10 +- .../chart/renderer/xy/XYStepRenderer.java | 10 +- .../chart/renderer/xy/YIntervalRenderer.java | 16 +- .../org/jfree/chart/text/G2TextMeasurer.java | 6 +- .../java/org/jfree/chart/text/TextBlock.java | 6 +- .../org/jfree/chart/text/TextMeasurer.java | 4 +- .../java/org/jfree/chart/text/TextUtils.java | 20 +- .../chart/title/LegendItemBlockContainer.java | 8 +- .../java/org/jfree/chart/ui/LCBLayout.java | 18 +- .../jfree/chart/ui/NumberCellRenderer.java | 4 +- .../chart/urls/CategoryURLGenerator.java | 8 +- .../urls/CustomCategoryURLGenerator.java | 12 +- .../chart/urls/CustomPieURLGenerator.java | 16 +- .../chart/urls/CustomXYURLGenerator.java | 12 +- .../org/jfree/chart/urls/PieURLGenerator.java | 4 +- .../urls/StandardCategoryURLGenerator.java | 8 +- .../chart/urls/StandardXYURLGenerator.java | 6 +- .../chart/urls/StandardXYZURLGenerator.java | 6 +- .../chart/urls/TimeSeriesURLGenerator.java | 8 +- .../org/jfree/chart/urls/XYURLGenerator.java | 8 +- .../org/jfree/chart/urls/XYZURLGenerator.java | 6 +- .../jfree/chart/util/AbstractObjectList.java | 26 +- .../org/jfree/chart/util/AttrStringUtils.java | 8 +- .../org/jfree/chart/util/BooleanList.java | 6 +- .../chart/util/DefaultShadowGenerator.java | 12 +- .../java/org/jfree/chart/util/ObjectList.java | 14 +- .../java/org/jfree/chart/util/PaintAlpha.java | 6 +- .../java/org/jfree/chart/util/PaintList.java | 8 +- .../java/org/jfree/chart/util/ShapeList.java | 6 +- .../org/jfree/chart/util/StringUtils.java | 4 +- .../java/org/jfree/chart/util/StrokeList.java | 8 +- .../jfree/data/ComparableObjectSeries.java | 22 +- src/main/java/org/jfree/data/DataUtils.java | 22 +- .../org/jfree/data/DefaultKeyedValues.java | 20 +- .../org/jfree/data/DefaultKeyedValues2D.java | 30 +- .../java/org/jfree/data/KeyToGroupMap.java | 12 +- .../java/org/jfree/data/KeyedObjects.java | 14 +- .../java/org/jfree/data/KeyedObjects2D.java | 22 +- src/main/java/org/jfree/data/KeyedValues.java | 8 +- .../java/org/jfree/data/KeyedValues2D.java | 12 +- src/main/java/org/jfree/data/Values.java | 6 +- src/main/java/org/jfree/data/Values2D.java | 14 +- .../data/category/CategoryToPieDataset.java | 18 +- .../data/category/DefaultCategoryDataset.java | 28 +- .../DefaultIntervalCategoryDataset.java | 60 ++-- .../category/IntervalCategoryDataset.java | 8 +- .../data/category/SlidingCategoryDataset.java | 44 +-- .../data/gantt/GanttCategoryDataset.java | 20 +- .../gantt/SlidingGanttCategoryDataset.java | 66 ++-- src/main/java/org/jfree/data/gantt/Task.java | 6 +- .../java/org/jfree/data/gantt/TaskSeries.java | 6 +- .../data/gantt/TaskSeriesCollection.java | 70 ++-- .../org/jfree/data/gantt/XYTaskDataset.java | 48 +-- .../data/general/AbstractSeriesDataset.java | 14 +- .../org/jfree/data/general/DatasetUtils.java | 76 ++-- .../data/general/DefaultHeatMapDataset.java | 38 +- .../jfree/data/general/DefaultPieDataset.java | 16 +- .../jfree/data/general/HeatMapDataset.java | 20 +- .../org/jfree/data/general/HeatMapUtils.java | 8 +- .../java/org/jfree/data/general/Series.java | 4 +- .../org/jfree/data/general/SeriesDataset.java | 14 +- .../jfree/data/general/WaferMapDataset.java | 22 +- src/main/java/org/jfree/data/io/CSV.java | 10 +- .../org/jfree/data/jdbc/JDBCXYDataset.java | 20 +- .../statistics/BoxAndWhiskerCalculator.java | 6 +- .../BoxAndWhiskerCategoryDataset.java | 20 +- .../statistics/BoxAndWhiskerXYDataset.java | 24 +- .../DefaultBoxAndWhiskerCategoryDataset.java | 54 +-- .../DefaultBoxAndWhiskerXYDataset.java | 36 +- .../DefaultMultiValueCategoryDataset.java | 24 +- .../DefaultStatisticalCategoryDataset.java | 32 +- .../jfree/data/statistics/HistogramBin.java | 6 +- .../data/statistics/HistogramDataset.java | 42 +-- .../statistics/MultiValueCategoryDataset.java | 4 +- .../org/jfree/data/statistics/Regression.java | 46 +-- .../data/statistics/SimpleHistogramBin.java | 8 +- .../statistics/SimpleHistogramDataset.java | 36 +- .../StatisticalCategoryDataset.java | 6 +- .../org/jfree/data/statistics/Statistics.java | 30 +- src/main/java/org/jfree/data/time/Day.java | 12 +- .../time/DynamicTimeSeriesCollection.java | 116 +++--- src/main/java/org/jfree/data/time/Hour.java | 16 +- .../java/org/jfree/data/time/Millisecond.java | 16 +- src/main/java/org/jfree/data/time/Minute.java | 14 +- src/main/java/org/jfree/data/time/Month.java | 10 +- .../org/jfree/data/time/MovingAverage.java | 14 +- .../java/org/jfree/data/time/Quarter.java | 24 +- .../jfree/data/time/RegularTimePeriod.java | 4 +- src/main/java/org/jfree/data/time/Second.java | 16 +- .../org/jfree/data/time/SimpleTimePeriod.java | 4 +- .../java/org/jfree/data/time/TimePeriod.java | 4 +- .../org/jfree/data/time/TimePeriodValue.java | 4 +- .../org/jfree/data/time/TimePeriodValues.java | 52 +-- .../data/time/TimePeriodValuesCollection.java | 30 +- .../java/org/jfree/data/time/TimeSeries.java | 38 +- .../jfree/data/time/TimeSeriesCollection.java | 38 +- .../jfree/data/time/TimeSeriesTableModel.java | 16 +- .../jfree/data/time/TimeTableXYDataset.java | 38 +- src/main/java/org/jfree/data/time/Week.java | 16 +- src/main/java/org/jfree/data/time/Year.java | 8 +- .../org/jfree/data/time/ohlc/OHLCSeries.java | 8 +- .../data/time/ohlc/OHLCSeriesCollection.java | 42 +-- .../java/org/jfree/data/xml/KeyHandler.java | 6 +- .../java/org/jfree/data/xml/RootHandler.java | 6 +- .../java/org/jfree/data/xml/ValueHandler.java | 6 +- .../data/xy/AbstractIntervalXYDataset.java | 14 +- .../org/jfree/data/xy/AbstractXYDataset.java | 10 +- .../org/jfree/data/xy/AbstractXYZDataset.java | 8 +- .../jfree/data/xy/CategoryTableXYDataset.java | 28 +- .../jfree/data/xy/DefaultHighLowDataset.java | 59 ++-- .../data/xy/DefaultIntervalXYDataset.java | 74 ++-- .../org/jfree/data/xy/DefaultOHLCDataset.java | 38 +- .../jfree/data/xy/DefaultTableXYDataset.java | 32 +- .../org/jfree/data/xy/DefaultWindDataset.java | 26 +- .../org/jfree/data/xy/DefaultXYDataset.java | 44 +-- .../org/jfree/data/xy/DefaultXYZDataset.java | 50 +-- .../org/jfree/data/xy/IntervalXYDataset.java | 22 +- .../org/jfree/data/xy/IntervalXYDelegate.java | 16 +- .../org/jfree/data/xy/IntervalXYZDataset.java | 18 +- .../java/org/jfree/data/xy/MatrixSeries.java | 22 +- .../jfree/data/xy/MatrixSeriesCollection.java | 18 +- .../jfree/data/xy/NormalizedMatrixSeries.java | 8 +- .../java/org/jfree/data/xy/OHLCDataset.java | 26 +- .../org/jfree/data/xy/TableXYDataset.java | 4 +- .../java/org/jfree/data/xy/VectorSeries.java | 14 +- .../jfree/data/xy/VectorSeriesCollection.java | 30 +- .../org/jfree/data/xy/VectorXYDataset.java | 10 +- .../java/org/jfree/data/xy/WindDataset.java | 10 +- .../org/jfree/data/xy/XIntervalSeries.java | 12 +- .../data/xy/XIntervalSeriesCollection.java | 34 +- .../java/org/jfree/data/xy/XYBarDataset.java | 36 +- .../java/org/jfree/data/xy/XYDataset.java | 16 +- .../jfree/data/xy/XYDatasetTableModel.java | 14 +- .../org/jfree/data/xy/XYIntervalSeries.java | 16 +- .../data/xy/XYIntervalSeriesCollection.java | 38 +- .../java/org/jfree/data/xy/XYItemKey.java | 4 +- src/main/java/org/jfree/data/xy/XYSeries.java | 32 +- .../org/jfree/data/xy/XYSeriesCollection.java | 32 +- .../java/org/jfree/data/xy/XYZDataset.java | 10 +- .../java/org/jfree/data/xy/XisSymbolic.java | 8 +- .../org/jfree/data/xy/YIntervalSeries.java | 12 +- .../data/xy/YIntervalSeriesCollection.java | 34 +- .../java/org/jfree/data/xy/YisSymbolic.java | 6 +- .../java/org/jfree/chart/GanttChartTest.java | 2 +- .../category/BoxAndWhiskerRendererTest.java | 4 +- .../general/TestIntervalCategoryDataset.java | 26 +- 292 files changed, 2953 insertions(+), 3222 deletions(-) delete mode 100644 ant/build.xml diff --git a/ant/build.xml b/ant/build.xml deleted file mode 100644 index 37a19e554..000000000 --- a/ant/build.xml +++ /dev/null @@ -1,333 +0,0 @@ -<!-- An ANT build file for JFreeChart --> - -<!-- Written by David Gilbert. --> - -<!-- Tested recently with Ant 1.8.2 --> -<!-- To run this script, you need to make sure the libraries used by --> -<!-- JFreeChart are copied to the ../lib directory (or edit the --> -<!-- initialise task to point to the appropriate jar files). --> - -<!-- This script will create temporary directories ../build and --> -<!-- ../distribution, as working areas. A ../javadoc directory will --> -<!-- be created for the Javadoc HTML pages. --> - -<!-- If you have comments about this script, please post a message --> -<!-- on the JFreeChart developers mailing list. --> - -<project name="jfreechart" default="all" basedir=".."> - - <!-- Initialisation. --> - <target name="initialise" description="Initialise required settings."> - <tstamp /> - <property name="jfreechart.name" value="jfreechart" /> - <property name="jfreechart.version" value="1.5.0" /> - <property name="jfreesvg.name" value="jfreesvg" /> - <property name="jfreesvg.version" value="3.2" /> - <property name="orsonpdf.name" value="orsonpdf" /> - <property name="orsonpdf.version" value="1.7" /> - <property name="orsoncharts.version" value="1.6" /> - <property name="builddir" value="${basedir}/build" /> - <property name="servlet.jar" value="${basedir}/lib/servlet.jar"/> - <property name="junit.jar" value="${basedir}/lib/junit-4.11.jar"/> - <property name="hamcrest.jar" value="${basedir}/lib/hamcrest-core-1.3.jar"/> - <property name="src.version" value="1.8"/> - <property name="target.version" value="1.8"/> - <path id="build.classpath"> - <fileset dir="${basedir}/lib/"> - <include name="servlet.jar"/> - </fileset> - </path> - </target> - - <!-- Compile the JFreeChart classes --> - <target name="compile" depends="initialise" - description="Compile the JFreeChart source code."> - - <!-- create a temp build directory --> - <mkdir dir="${basedir}/build" /> - - <!-- compile the source --> - <javac srcdir="${basedir}/src/main/java" - destdir="${basedir}/build" - debug="on" - deprecation="false" - source="${src.version}" - target="${target.version}" - includeantruntime="false"> - <classpath refid="build.classpath" /> - <include name="org/jfree/**"/> - </javac> - - <!-- copy across .properties files --> - <copy todir="${basedir}/build/org/jfree/chart/"> - <fileset dir="${basedir}/src/main/resources/org/jfree/chart"> - <include name="*.properties" /> - </fileset> - </copy> - <copy todir="${basedir}/build/org/jfree/chart/plot"> - <fileset dir="${basedir}/src/main/resources/org/jfree/chart/plot"> - <include name="*.properties" /> - </fileset> - </copy> - <copy todir="${basedir}/build/org/jfree/chart/editor"> - <fileset dir="${basedir}/src/main/resources/org/jfree/chart/editor"> - <include name="*.properties" /> - </fileset> - </copy> - - <!-- make the jar --> - <jar jarfile="${basedir}/lib/${jfreechart.name}-${jfreechart.version}.jar" - basedir="${basedir}/build" > - <manifest> - <attribute name="Specification-Title" value="JFreeChart" /> - <attribute name="Specification-Version" value="${jfreechart.version}" /> - <attribute name="Specification-Vendor" value="jfree.org" /> - <attribute name="Implementation-Title" value="JFreeChart" /> - <attribute name="Implementation-Version" value="${jfreechart.version}" /> - <attribute name="Implementation-Vendor" value="jfree.org" /> - </manifest> - </jar> - - <!-- delete the temp directory --> - <delete dir="${basedir}/build" /> - - </target> - - <property environment="env"/> - - <property name="checkerframework" value="${env.CHECKERFRAMEWORK}" /> - - <!-- On Mac/Linux, use the javac shell script; on Windows, use javac.bat --> - <condition property="cfJavac" value="javac.bat" else="javac"> - <os family="windows" /> - </condition> - - <presetdef name="jsr308.javac"> - <javac fork="yes" executable="${checkerframework}/checker/bin-devel/${cfJavac}" > - <!-- JSR-308-related compiler arguments --> - <!--compilerarg value="-version"/--> - <compilerarg value="-implicit:class"/> - </javac> - </presetdef> - - <!-- Compile the JFreeChart classes --> - <target name="check-index" depends="initialise" - description="Compile the JFreeChart source code."> - - <!-- create a temp build directory --> - <mkdir dir="${basedir}/build" /> - - <echo message="[checkerframework]: ${checkerframework}"/> - - <!-- type-check the source --> - <jsr308.javac srcdir="${basedir}/src/main/java" - destdir="${basedir}/build" - debug="on" - deprecation="false" - source="${src.version}" - target="${target.version}" - includeantruntime="false"> - <compilerarg line="-processor org.checkerframework.checker.index.IndexChecker,org.checkerframework.common.util.count.JavaCodeStatistics,org.checkerframework.common.util.count.AnnotationStatistics"/> - <compilerarg line="-Anolocations"/> - <compilerarg line="-Xmaxerrs 10000"/> - <compilerarg line="-Xbootclasspath/p:${checkerframework}/checker/dist/jdk8.jar"/> - <classpath refid="build.classpath" /> - <include name="org/jfree/**"/> - <exclude name="org/jfree/chart/fx/**"/> - </jsr308.javac> - - <!-- delete the temp directory > - <delete dir="${basedir}/build" /--> - - </target> - - <!-- Generate the JFreeChart source code jar --> - <target name="source-jar" depends="initialise" - description="Package the JFreeChart source code in a jar"> - - <!-- create a temp build directory --> - <mkdir dir="${basedir}/source-jar"/> - - <!-- copy source code --> - <copy todir="${basedir}/source-jar/"> - <fileset dir="${basedir}/src/main/java"/> - </copy> - - <!-- make the jar --> - <jar jarfile="${basedir}/lib/${jfreechart.name}-${jfreechart.version}-src.jar" - basedir="${basedir}/source-jar"> - </jar> - - <!-- delete the temp directory --> - <delete dir="${basedir}/source-jar"/> - - </target> - - <!-- Generate the JFreeChart API HTML pages --> - <target name="javadoc" - description="Generate the Javadoc HTML pages." - depends="initialise"> - <delete dir="${basedir}/javadoc" /> - <mkdir dir="${basedir}/javadoc" /> - <javadoc destdir="${basedir}/javadoc" - windowtitle="JFreeChart Class Library (version ${jfreechart.version})" - overview="${basedir}/src/main/javadoc/overview.html" - use="yes" - linksource="yes" - splitindex="yes"> - <classpath refid="build.classpath" /> - <packageset dir="${basedir}/src/main/java" defaultexcludes="yes"> - <include name="org/jfree/**"/> - </packageset> - </javadoc> - <!-- copy across .png files --> - <copy todir="${basedir}/javadoc/images"> - <fileset dir="${basedir}/src/main/javadoc/images"> - <include name="*.png" /> - </fileset> - </copy> - </target> - - - <!-- Create zip file containing the API HTML pages. --> - <target name="zip-javadocs" - description="Create ZIP file containing Javadoc HTML pages." - depends="javadoc"> - <!-- make the zip file --> - <zip zipfile="${basedir}/${jfreechart.name}-${jfreechart.version}-javadocs.zip"> - <zipfileset dir="${basedir}/javadoc" - prefix="${jfreechart.name}-${jfreechart.version}-javadocs" /> - </zip> - </target> - - - <!-- Fill the 'distribution' directory. --> - <target name="fill-distribution" depends="compile"> - - <!-- delete the temporary distribution directory, if there is one --> - <delete dir="${basedir}/distribution" /> - - <!-- make a temporary distribution directory --> - <mkdir dir="${basedir}/distribution" /> - - <!-- copy across README and CHANGELOG --> - <copy file="${basedir}/README.txt" tofile="${basedir}/distribution/README.txt" /> - <copy file="${basedir}/pom.xml" tofile="${basedir}/distribution/pom.xml" /> - - <!-- copy across LICENCE --> - <copy file="${basedir}/licence-LGPL.txt" tofile="${basedir}/distribution/licence-LGPL.txt" /> - - <!-- copy across runtime jar file and demo jar file --> - <copy file="${basedir}/lib/${jfreechart.name}-${jfreechart.version}.jar" tofile="${basedir}/distribution/lib/${jfreechart.name}-${jfreechart.version}.jar" /> - <copy file="${basedir}/${jfreechart.name}-${jfreechart.version}-demo.jar" tofile="${basedir}/distribution/${jfreechart.name}-${jfreechart.version}-demo.jar" failonerror="false" /> - - <!-- copy across source files --> - <copy todir="${basedir}/distribution/src"> - <fileset dir="${basedir}/src"> - </fileset> - </copy> - - <copy todir="${basedir}/distribution/jsfreechart"> - <fileset dir="${basedir}/jsfreechart"> - </fileset> - </copy> - - <copy todir="${basedir}/distribution/svg"> - <fileset dir="${basedir}/svg"> - </fileset> - </copy> - - <!-- copy across lib files --> - <copy file="${servlet.jar}" tofile="${basedir}/distribution/lib/servlet.jar" /> - <copy file="${junit.jar}" tofile="${basedir}/distribution/lib/junit-4.11.jar" /> - <copy file="${hamcrest.jar}" tofile="${basedir}/distribution/lib/hamcrest-core-1.3.jar" /> - <copy file="${basedir}/lib/${jfreesvg.name}-${jfreesvg.version}.jar" tofile="${basedir}/distribution/lib/${jfreesvg.name}-${jfreesvg.version}.jar" /> - <copy file="${basedir}/lib/${orsonpdf.name}-${orsonpdf.version}.jar" tofile="${basedir}/distribution/lib/${orsonpdf.name}-${orsonpdf.version}.jar" /> - <copy file="${basedir}/lib/orsoncharts-${orsoncharts.version}.jar" tofile="${basedir}/distribution/lib/orsoncharts-${orsoncharts.version}.jar" failonerror="false" /> - - <!-- copy across ant build files --> - <copy file="${basedir}/ant/build.xml" tofile="${basedir}/distribution/ant/build.xml" /> - - <!-- convert end-of-line characters in text files --> - <fixcrlf srcdir="${basedir}/distribution/src" - eol="crlf" eof="remove" - excludes="**/*.jpg" /> - </target> - - <!-- Make .zip distribution for JFreeChart --> - <target name="zip" depends="fill-distribution"> - - <!-- make the zip file --> - <zip zipfile="${basedir}/${jfreechart.name}-${jfreechart.version}.zip"> - <zipfileset dir="${basedir}/distribution" - prefix="${jfreechart.name}-${jfreechart.version}" /> - </zip> - - </target> - - <!-- COMPILE THE JUNIT TESTS. --> - <target name="compile-tests" - depends="compile" - description="Compile the test code"> - - <mkdir dir="${basedir}/build-tests"/> - <javac srcdir="${basedir}/src/test/java" - destdir="${basedir}/build-tests" - source="1.6" - target="1.6" - debug="true" - deprecation="false" - optimize="false" - includeantruntime="false"> - <classpath> - <path refid="build.classpath"/> - <pathelement location="${junit.jar}"/> - <pathelement location="${hamcrest.jar}"/> - <pathelement location="${basedir}/lib/${jfreechart.name}-${jfreechart.version}.jar"/> - <pathelement location="${basedir}/build-tests"/> - </classpath> - </javac> - - </target> - - - <!-- RUN THE JUNIT TESTS. --> - <target name="test" - depends="compile-tests" - description="Run the test cases"> - - <mkdir dir="${basedir}/build-tests-reports"/> - - <junit printSummary="yes" - haltonerror="false" - haltonfailure="false" - fork="false" - dir="."> - - <sysproperty key="basedir" value="."/> - <formatter type="plain" usefile="false"/> - <classpath> - <path refid="build.classpath"/> - <pathelement location="${junit.jar}"/> - <pathelement location="${hamcrest.jar}"/> - <pathelement location="${basedir}/lib/${jfreechart.name}-${jfreechart.version}.jar"/> - <pathelement location="${basedir}/build-tests"/> - </classpath> - <batchtest todir="${basedir}/build-tests-reports"> - <fileset dir="${basedir}/tests"> - <include name="**/*Test.java"/> - </fileset> - </batchtest> - </junit> - </target> - - <!-- ALL --> - <target name="all" - depends="compile,zip-javadocs,zip,source-jar" - description="Compiles JFreeChart, builds the jar files, generates the Javadoc HTML pages and creates distribution files (.zip and .tar.gz)."> - - <!-- delete the temporary distribution directory --> - <delete dir="${basedir}/distribution" /> - </target> - -</project> diff --git a/pom.xml b/pom.xml index c4b1e71a9..e74f716d5 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,22 @@ <version>4.11</version> <scope>test</scope> </dependency> + <!-- Annotations from the Checker Framework: nullness, interning, locking, ... --> + <dependency> + <groupId>org.checkerframework</groupId> + <artifactId>checker-qual</artifactId> + <version>2.5.0</version> + </dependency> + <!--dependency> + <groupId>org.checkerframework</groupId> + <artifactId>compiler</artifactId> + <version>2.4.0</version> + </dependency--> + <dependency> + <groupId>org.checkerframework</groupId> + <artifactId>jdk8</artifactId> + <version>2.5.0</version> + </dependency> </dependencies> <distributionManagement> @@ -66,24 +82,67 @@ <id>ossrh</id> <url>https://oss.sonatype.org/content/repositories/snapshots</url> </snapshotRepository> - </distributionManagement> - + </distributionManagement> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.source.level>1.8</project.source.level> + <project.target.level>1.8</project.target.level> + <!-- These properties will be set by the Maven Dependency plugin --> + <annotatedJdk>${org.checkerframework:jdk8:jar}</annotatedJdk> + <!-- Uncomment to use the Type Annotations compiler. --> + <!--typeAnnotationsJavac>${org.checkerframework:compiler:jar}</typeAnnotationsJavac--> + </properties> + <build> <testSourceDirectory>src/test/java</testSourceDirectory> <plugins> <plugin> - <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.7.0</version> + <version>3.6.1</version> <configuration> - <source>${project.source.level}</source> - <target>${project.target.level}</target> - <encoding>${project.build.sourceEncoding}</encoding> + <source>1.8</source> + <target>1.8</target> + <compilerArguments> + <Xmaxerrs>10000</Xmaxerrs> + <Xmaxwarns>10000</Xmaxwarns> + </compilerArguments> + <annotationProcessorPaths> + <path> + <groupId>org.checkerframework</groupId> + <artifactId>checker</artifactId> + <version>2.5.0</version> + </path> + </annotationProcessorPaths> + <annotationProcessors> + <!-- Add all the checkers you want to enable here --> + <annotationProcessor>org.checkerframework.checker.index.IndexChecker</annotationProcessor> + </annotationProcessors> + <compilerArgs> + <arg>-AprintErrorStack</arg> + <!-- location of the annotated JDK, which comes from a Maven dependency --> + <arg>-Xbootclasspath/p:${annotatedJdk}</arg> + <!-- Uncomment the following line to turn type-checking warnings into errors. --> + <!-- <arg>-Awarns</arg> --> + </compilerArgs> </configuration> </plugin> + <plugin> + <!-- This plugin will set properties values using dependency information --> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>properties</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> @@ -154,12 +213,6 @@ </plugins> </reporting> - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <project.source.level>1.6</project.source.level> - <project.target.level>1.6</project.target.level> - </properties> - <profiles> <profile> <id>release</id> @@ -225,6 +278,19 @@ </executions> </plugin> + <plugin> + <!-- This plugin will set properties values using dependency information --> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>properties</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> </build> </profile> diff --git a/src/main/java/org/jfree/chart/ChartColor.java b/src/main/java/org/jfree/chart/ChartColor.java index 3c945566e..cc9bb1c31 100644 --- a/src/main/java/org/jfree/chart/ChartColor.java +++ b/src/main/java/org/jfree/chart/ChartColor.java @@ -44,8 +44,8 @@ */ package org.jfree.chart; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.awt.Color; import java.awt.Paint; @@ -148,7 +148,7 @@ public ChartColor(int r, int g, int b) { * * @return An array of objects with the {@code Paint} interface. */ - public static Paint /*@ArrayLen(34)*/ [] createDefaultPaintArray() { + public static Paint @ArrayLen(34) [] createDefaultPaintArray() { return new Paint[] { new Color(0xFF, 0x55, 0x55), diff --git a/src/main/java/org/jfree/chart/JFreeChart.java b/src/main/java/org/jfree/chart/JFreeChart.java index 9d783d1e7..adc36ef86 100644 --- a/src/main/java/org/jfree/chart/JFreeChart.java +++ b/src/main/java/org/jfree/chart/JFreeChart.java @@ -154,7 +154,7 @@ */ package org.jfree.chart; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -715,7 +715,7 @@ public LegendTitle getLegend() { * * @see #addLegend(LegendTitle) */ - public LegendTitle getLegend(/*@NonNegative*/ int index) { + public LegendTitle getLegend(@NonNegative int index) { int seen = 0; Iterator iterator = this.subtitles.iterator(); while (iterator.hasNext()) { @@ -799,7 +799,7 @@ public int getSubtitleCount() { * * @see #addSubtitle(Title) */ - public Title getSubtitle(/*@NonNegative*/ int index) { + public Title getSubtitle(@NonNegative int index) { if ((index < 0) || (index >= getSubtitleCount())) { throw new IllegalArgumentException("Index out of range."); } @@ -830,7 +830,7 @@ public void addSubtitle(Title subtitle) { * * @since 1.0.6 */ - public void addSubtitle(/*@NonNegative*/ int index, Title subtitle) { + public void addSubtitle(@NonNegative int index, Title subtitle) { if (index < 0 || index > getSubtitleCount()) { throw new IllegalArgumentException( "The 'index' argument is out of range."); diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index 99fadd618..f602ca2b2 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -64,9 +64,9 @@ package org.jfree.chart; -/*>>> + import org.checkerframework.checker.index.qual.*; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -119,10 +119,10 @@ public class LegendItem implements Cloneable, Serializable { private Comparable seriesKey; /** The dataset index. */ - private /*@NonNegative*/ int datasetIndex; + private @NonNegative int datasetIndex; /** The series index. */ - private /*@NonNegative*/ int series; + private @NonNegative int series; /** The label. */ private String label; @@ -520,7 +520,7 @@ private String characterIteratorToString(CharacterIterator iterator) { char c = iterator.first(); while (c != CharacterIterator.DONE) { @SuppressWarnings("index") // Correctness depends on the Character Iterator having count elements before supplying CharacterIterator.DONE - /*@IndexFor("chars")*/ int index = i; + @IndexFor("chars") int index = i; chars[index] = c; i++; c = iterator.next(); @@ -562,7 +562,7 @@ public void setDataset(Dataset dataset) { * @see #setDatasetIndex(int) * @see #getDataset() */ - public /*@NonNegative*/ int getDatasetIndex() { + public @NonNegative int getDatasetIndex() { return this.datasetIndex; } @@ -575,7 +575,7 @@ public void setDataset(Dataset dataset) { * * @see #getDatasetIndex() */ - public void setDatasetIndex(/*@NonNegative*/ int index) { + public void setDatasetIndex(@NonNegative int index) { this.datasetIndex = index; } @@ -610,7 +610,7 @@ public void setSeriesKey(Comparable key) { * * @since 1.0.2 */ - public /*@NonNegative*/ int getSeriesIndex() { + public @NonNegative int getSeriesIndex() { return this.series; } @@ -621,7 +621,7 @@ public void setSeriesKey(Comparable key) { * * @since 1.0.2 */ - public void setSeriesIndex(/*@NonNegative*/ int index) { + public void setSeriesIndex(@NonNegative int index) { this.series = index; } diff --git a/src/main/java/org/jfree/chart/LegendItemCollection.java b/src/main/java/org/jfree/chart/LegendItemCollection.java index 0614ee1b8..55ee05c32 100644 --- a/src/main/java/org/jfree/chart/LegendItemCollection.java +++ b/src/main/java/org/jfree/chart/LegendItemCollection.java @@ -44,7 +44,7 @@ */ package org.jfree.chart; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Iterator; @@ -95,7 +95,7 @@ public void addAll(LegendItemCollection collection) { * * @return The legend item. */ - public LegendItem get(/*@NonNegative*/ int index) { + public LegendItem get(@NonNegative int index) { return (LegendItem) this.items.get(index); } @@ -104,7 +104,7 @@ public LegendItem get(/*@NonNegative*/ int index) { * * @return The item count. */ - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.items.size(); } diff --git a/src/main/java/org/jfree/chart/PolarChartPanel.java b/src/main/java/org/jfree/chart/PolarChartPanel.java index 6aa7c2891..c4e384500 100644 --- a/src/main/java/org/jfree/chart/PolarChartPanel.java +++ b/src/main/java/org/jfree/chart/PolarChartPanel.java @@ -43,8 +43,8 @@ */ package org.jfree.chart; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.awt.Component; import java.awt.event.ActionEvent; @@ -248,7 +248,7 @@ private void checkChart(JFreeChart chart) { * * @return The item index. */ - private /*@GTENegativeOne*/ int getPopupMenuItem(JPopupMenu menu, String text) { + private @GTENegativeOne int getPopupMenuItem(JPopupMenu menu, String text) { int index = -1; for (int i = 0; (index == -1) && (i < menu.getComponentCount()); i++) { Component comp = menu.getComponent(i); diff --git a/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java b/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java index 5b8681996..b6e56a3b1 100644 --- a/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java @@ -42,7 +42,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.Shape; @@ -139,7 +139,7 @@ public void setURL(String url) { @Override public abstract void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, + @NonNegative int rendererIndex, PlotRenderingInfo info); /** @@ -153,7 +153,7 @@ public abstract void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, * @param urlText the URL text. */ protected void addEntity(PlotRenderingInfo info, - Shape hotspot, /*@NonNegative*/ int rendererIndex, + Shape hotspot, @NonNegative int rendererIndex, String toolTipText, String urlText) { if (info == null) { return; diff --git a/src/main/java/org/jfree/chart/annotations/XYAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYAnnotation.java index b7ca275a4..f22891845 100644 --- a/src/main/java/org/jfree/chart/annotations/XYAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYAnnotation.java @@ -46,7 +46,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -77,6 +77,6 @@ public interface XYAnnotation extends Annotation { */ public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info); + @NonNegative int rendererIndex, PlotRenderingInfo info); } diff --git a/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java index 211b9d632..db1e26bc7 100644 --- a/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; import java.awt.Color; @@ -163,7 +163,7 @@ public XYBoxAnnotation(double x0, double y0, double x1, double y1, @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { + @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); RectangleEdge domainEdge = Plot.resolveDomainAxisLocation( diff --git a/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java index da97c872a..2af2dbe9d 100644 --- a/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.Image; @@ -244,7 +244,7 @@ public Range getYRange() { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, + @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java index a5787eeab..8df7069bc 100644 --- a/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java @@ -43,7 +43,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; @@ -146,7 +146,7 @@ public XYDrawableAnnotation(double x, double y, double displayWidth, @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, + @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java index e6de5f1e8..3f787b623 100644 --- a/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java @@ -48,7 +48,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.Image; @@ -194,7 +194,7 @@ public RectangleAnchor getImageAnchor() { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, + @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java index 159053f88..1adbb2ae5 100644 --- a/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java @@ -50,7 +50,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; import java.awt.Color; @@ -162,7 +162,7 @@ public XYLineAnnotation(double x1, double y1, double x2, double y2, @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, + @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java index 2a0ee465d..8f19614d1 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java @@ -54,7 +54,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; import java.awt.Color; @@ -377,7 +377,7 @@ public void setArrowPaint(Paint paint) { */ @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, - ValueAxis domainAxis, ValueAxis rangeAxis, /*@NonNegative*/ int rendererIndex, + ValueAxis domainAxis, ValueAxis rangeAxis, @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java index fba454781..552f46799 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; import java.awt.Color; @@ -208,7 +208,7 @@ public Paint getOutlinePaint() { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { + @NonNegative int rendererIndex, PlotRenderingInfo info) { // if we don't have at least 2 (x, y) coordinates, just return if (this.polygon.length < 4) { diff --git a/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java index 16ff77f49..c4b27dc86 100644 --- a/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java @@ -54,7 +54,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; import java.awt.Color; @@ -161,7 +161,7 @@ public XYShapeAnnotation(Shape shape, Stroke stroke, Paint outlinePaint, @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, + @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java index 224923559..b4dd030b5 100644 --- a/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java @@ -54,7 +54,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; import java.awt.Color; @@ -516,7 +516,7 @@ public void setOutlineVisible(boolean visible) { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { + @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); RectangleEdge domainEdge = Plot.resolveDomainAxisLocation( diff --git a/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java index 8727c247c..a19d0413e 100644 --- a/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java @@ -45,7 +45,7 @@ */ package org.jfree.chart.annotations; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.geom.Point2D; @@ -245,7 +245,7 @@ public void setMaxHeight(double max) { @Override public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, - /*@NonNegative*/ int rendererIndex, PlotRenderingInfo info) { + @NonNegative int rendererIndex, PlotRenderingInfo info) { PlotOrientation orientation = plot.getOrientation(); AxisLocation domainAxisLocation = plot.getDomainAxisLocation(); diff --git a/src/main/java/org/jfree/chart/axis/CompassFormat.java b/src/main/java/org/jfree/chart/axis/CompassFormat.java index 5620e6ca9..c0990a3aa 100644 --- a/src/main/java/org/jfree/chart/axis/CompassFormat.java +++ b/src/main/java/org/jfree/chart/axis/CompassFormat.java @@ -42,10 +42,10 @@ package org.jfree.chart.axis; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; - */ + import java.text.FieldPosition; import java.text.NumberFormat; @@ -58,7 +58,7 @@ public class CompassFormat extends NumberFormat { /** The directions. */ - public final String /*@ArrayLen(16)*/ [] directions; + public final String @ArrayLen(16) [] directions; /** * Creates a new formatter using English identifiers. @@ -93,7 +93,7 @@ public CompassFormat(String n, String e, String s, String w) { * * @since 1.0.18 */ - public CompassFormat(String /*@ArrayLen(16)*/ [] directions) { + public CompassFormat(String @ArrayLen(16) [] directions) { super(); Args.nullNotPermitted(directions, "directions"); if (directions.length != 16) { @@ -116,7 +116,7 @@ public String getDirectionCode(double direction) { direction = direction + 360.0; } @SuppressWarnings({"index", "value"}) // Math.floor needs annotations? - /*@IntRange(from = 0, to = 15)*/ int index = ((int) Math.floor(direction / 11.25) + 1) / 2; + @IntRange(from = 0, to = 15) int index = ((int) Math.floor(direction / 11.25) + 1) / 2; return directions[index]; } diff --git a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java index 569906cb0..f31e433a0 100644 --- a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java +++ b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java @@ -50,10 +50,10 @@ package org.jfree.chart.axis; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -389,7 +389,7 @@ public CycleBoundTick(boolean mapToLastCycle, Number number, * @return The anchor point. */ @Override - protected float /*@ArrayLen(2)*/ [] calculateAnchorPoint(ValueTick tick, double cursor, + protected float @ArrayLen(2) [] calculateAnchorPoint(ValueTick tick, double cursor, Rectangle2D dataArea, RectangleEdge edge) { if (tick instanceof CycleBoundTick) { boolean mapsav = this.boundMappedToLastCycle; @@ -482,7 +482,7 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, anchor = isInverted() ? TextAnchor.TOP_RIGHT : TextAnchor.BOTTOM_RIGHT; @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - /*@NonNegative*/ int lastTickIndex = result.size() - 1; + @NonNegative int lastTickIndex = result.size() - 1; result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), @@ -503,7 +503,7 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.BOTTOM_RIGHT; @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - /*@NonNegative*/ int lastTickIndex = result.size() - 1; + @NonNegative int lastTickIndex = result.size() - 1; result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), @@ -523,7 +523,7 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, anchor = isInverted() ? TextAnchor.TOP_LEFT : TextAnchor.TOP_RIGHT; @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - /*@NonNegative*/ int lastTickIndex = result.size() - 1; + @NonNegative int lastTickIndex = result.size() - 1; result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), @@ -636,7 +636,7 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.BOTTOM_RIGHT; @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - /*@NonNegative*/ int lastTickIndex = result.size() - 1; + @NonNegative int lastTickIndex = result.size() - 1; result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), @@ -657,7 +657,7 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, anchor = isInverted() ? TextAnchor.BOTTOM_RIGHT : TextAnchor.BOTTOM_LEFT; @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - /*@NonNegative*/ int lastTickIndex = result.size() - 1; + @NonNegative int lastTickIndex = result.size() - 1; result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), @@ -680,7 +680,7 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, anchor = isInverted() ? TextAnchor.BOTTOM_RIGHT : TextAnchor.TOP_RIGHT; @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - /*@NonNegative*/ int lastTickIndex = result.size() - 1; + @NonNegative int lastTickIndex = result.size() - 1; result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), @@ -700,7 +700,7 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.TOP_LEFT; @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - /*@NonNegative*/ int lastTickIndex = result.size() - 1; + @NonNegative int lastTickIndex = result.size() - 1; result.remove(lastTickIndex); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), diff --git a/src/main/java/org/jfree/chart/axis/DateAxis.java b/src/main/java/org/jfree/chart/axis/DateAxis.java index 778a31fd7..64758b02b 100644 --- a/src/main/java/org/jfree/chart/axis/DateAxis.java +++ b/src/main/java/org/jfree/chart/axis/DateAxis.java @@ -138,7 +138,7 @@ package org.jfree.chart.axis; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Font; import java.awt.FontMetrics; @@ -1008,7 +1008,7 @@ else if (this.tickMarkPosition == DateTickMarkPosition.MIDDLE) { } else if (DateTickUnitType.MONTH.equals(unit.getUnitType())) { @SuppressWarnings("index") // if this is a month, then current >= 1, so the below is safe - /*@NonNegative*/ int valueTmp = count * ((current + 1) / count) - 1; + @NonNegative int valueTmp = count * ((current + 1) / count) - 1; value = valueTmp; years = calendar.get(Calendar.YEAR); calendar.clear(Calendar.MILLISECOND); diff --git a/src/main/java/org/jfree/chart/axis/DateTickUnit.java b/src/main/java/org/jfree/chart/axis/DateTickUnit.java index be13d8984..ee1960a7e 100644 --- a/src/main/java/org/jfree/chart/axis/DateTickUnit.java +++ b/src/main/java/org/jfree/chart/axis/DateTickUnit.java @@ -55,7 +55,7 @@ */ package org.jfree.chart.axis; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; import java.text.DateFormat; @@ -82,7 +82,7 @@ public class DateTickUnit extends TickUnit implements Serializable { private DateTickUnitType unitType; /** The unit count. */ - private /*@Positive*/ int count; + private @Positive int count; /** * The roll unit type. @@ -92,7 +92,7 @@ public class DateTickUnit extends TickUnit implements Serializable { private DateTickUnitType rollUnitType; /** The roll count. */ - private /*@Positive*/ int rollCount; + private @Positive int rollCount; /** The date formatter. */ private DateFormat formatter; @@ -105,7 +105,7 @@ public class DateTickUnit extends TickUnit implements Serializable { * * @since 1.0.13 */ - public DateTickUnit(DateTickUnitType unitType, /*@Positive*/ int multiple) { + public DateTickUnit(DateTickUnitType unitType, @Positive int multiple) { this(unitType, multiple, DateFormat.getDateInstance(DateFormat.SHORT)); } @@ -118,7 +118,7 @@ public DateTickUnit(DateTickUnitType unitType, /*@Positive*/ int multiple) { * * @since 1.0.13 */ - public DateTickUnit(DateTickUnitType unitType, /*@Positive*/ int multiple, + public DateTickUnit(DateTickUnitType unitType, @Positive int multiple, DateFormat formatter) { this(unitType, multiple, unitType, multiple, formatter); } @@ -134,8 +134,8 @@ public DateTickUnit(DateTickUnitType unitType, /*@Positive*/ int multiple, * * @since 1.0.13 */ - public DateTickUnit(DateTickUnitType unitType, /*@Positive*/ int multiple, - DateTickUnitType rollUnitType, /*@Positive*/ int rollMultiple, + public DateTickUnit(DateTickUnitType unitType, @Positive int multiple, + DateTickUnitType rollUnitType, @Positive int rollMultiple, DateFormat formatter) { super(DateTickUnit.getMillisecondCount(unitType, multiple)); Args.nullNotPermitted(formatter, "formatter"); @@ -168,7 +168,7 @@ public DateTickUnitType getUnitType() { * * @return The unit multiple (always > 0). */ - public /*@Positive*/ int getMultiple() { + public @Positive int getMultiple() { return this.count; } @@ -190,7 +190,7 @@ public DateTickUnitType getRollUnitType() { * * @since 1.0.13 */ - public /*@Positive*/ int getRollMultiple() { + public @Positive int getRollMultiple() { return this.rollCount; } @@ -280,7 +280,7 @@ public Date rollDate(Date base, TimeZone zone) { * * @return The field code. */ - public /*@NonNegative*/ int getCalendarField() { + public @NonNegative int getCalendarField() { return this.unitType.getCalendarField(); } diff --git a/src/main/java/org/jfree/chart/axis/DateTickUnitType.java b/src/main/java/org/jfree/chart/axis/DateTickUnitType.java index deaef5f59..f4f422350 100644 --- a/src/main/java/org/jfree/chart/axis/DateTickUnitType.java +++ b/src/main/java/org/jfree/chart/axis/DateTickUnitType.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.axis; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.io.ObjectStreamException; import java.io.Serializable; @@ -87,7 +87,7 @@ public class DateTickUnitType implements Serializable { private String name; /** The corresponding field value in Java's Calendar class. */ - private /*@NonNegative*/ int calendarField; + private @NonNegative int calendarField; /** * Private constructor. @@ -95,7 +95,7 @@ public class DateTickUnitType implements Serializable { * @param name the name. * @param calendarField the calendar field. */ - private DateTickUnitType(String name, /*@NonNegative*/ int calendarField) { + private DateTickUnitType(String name, @NonNegative int calendarField) { this.name = name; this.calendarField = calendarField; } @@ -105,7 +105,7 @@ private DateTickUnitType(String name, /*@NonNegative*/ int calendarField) { * * @return The calendar field. */ - public /*@NonNegative*/ int getCalendarField() { + public @NonNegative int getCalendarField() { return this.calendarField; } diff --git a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java index f8cd721de..fe466184f 100644 --- a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java @@ -41,10 +41,10 @@ package org.jfree.chart.axis; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; - */ + import java.text.DateFormat; import java.text.DateFormatSymbols; @@ -69,10 +69,10 @@ public class MonthDateFormat extends DateFormat { /** The symbols used for the months. */ - private String /*@ArrayLen(12)*/ [] months; + private String @ArrayLen(12) [] months; /** Flags that control which months will have the year appended. */ - private boolean /*@ArrayLen(13)*/ [] showYear; + private boolean @ArrayLen(13) [] showYear; /** The year formatter. */ private DateFormat yearFormatter; @@ -168,14 +168,14 @@ public MonthDateFormat(TimeZone zone, Locale locale, int chars, * @param yearFormatter the year formatter. */ public MonthDateFormat(TimeZone zone, Locale locale, int chars, - boolean /*@ArrayLen(13)*/ [] showYear, DateFormat yearFormatter) { + boolean @ArrayLen(13) [] showYear, DateFormat yearFormatter) { Args.nullNotPermitted(locale, "locale"); DateFormatSymbols dfs = new DateFormatSymbols(locale); String[] monthsFromLocale = dfs.getMonths(); this.months = new String[12]; for (int i = 0; i < 12; i++) { @SuppressWarnings({"index", "value"}) // https://github.com/typetools/checker-framework/issues/1669 - /*@IntRange(from = 0, to = 11)*/ int i1 = i; + @IntRange(from = 0, to = 11) int i1 = i; if (chars > 0) { this.months[i1] = monthsFromLocale[i1].substring(0, Math.min(chars, monthsFromLocale[i1].length())); @@ -208,7 +208,7 @@ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { this.calendar.setTime(date); @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation - /*@IntRange(from=0, to=11)*/ int month = this.calendar.get(Calendar.MONTH); + @IntRange(from=0, to=11) int month = this.calendar.get(Calendar.MONTH); toAppendTo.append(this.months[month]); if (this.showYear[month]) { toAppendTo.append(this.yearFormatter.format(date)); diff --git a/src/main/java/org/jfree/chart/axis/PeriodAxis.java b/src/main/java/org/jfree/chart/axis/PeriodAxis.java index 5ecac2b93..265c552bd 100644 --- a/src/main/java/org/jfree/chart/axis/PeriodAxis.java +++ b/src/main/java/org/jfree/chart/axis/PeriodAxis.java @@ -65,10 +65,10 @@ package org.jfree.chart.axis; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntVal; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -184,7 +184,7 @@ public class PeriodAxis extends ValueAxis private transient Paint minorTickMarkPaint = Color.BLACK; /** Info for each labeling band. */ - private PeriodAxisLabelInfo /*@ArrayLen(2)*/ [] labelInfo; + private PeriodAxisLabelInfo @ArrayLen(2) [] labelInfo; /** * Creates a new axis. @@ -515,7 +515,7 @@ public void setMinorTickMarkOutsideLength(float length) { * * @return An array. */ - public PeriodAxisLabelInfo /*@ArrayLen(2)*/ [] getLabelInfo() { + public PeriodAxisLabelInfo @ArrayLen(2) [] getLabelInfo() { return this.labelInfo; } @@ -525,7 +525,7 @@ public void setMinorTickMarkOutsideLength(float length) { * * @param info the info. */ - public void setLabelInfo(PeriodAxisLabelInfo /*@ArrayLen(2)*/ [] info) { + public void setLabelInfo(PeriodAxisLabelInfo @ArrayLen(2) [] info) { this.labelInfo = info; fireChangeEvent(); } @@ -805,7 +805,7 @@ protected void drawTickMarksVertical(Graphics2D g2, AxisState state, * * @return The updated axis state. */ - protected AxisState drawTickLabels(/*@IntVal({0, 1})*/ int band, Graphics2D g2, AxisState state, + protected AxisState drawTickLabels(@IntVal({0, 1}) int band, Graphics2D g2, AxisState state, Rectangle2D dataArea, RectangleEdge edge) { // work out the initial gap @@ -1147,7 +1147,7 @@ public int hashCode() { public Object clone() throws CloneNotSupportedException { PeriodAxis clone = (PeriodAxis) super.clone(); clone.timeZone = (TimeZone) this.timeZone.clone(); - clone.labelInfo = (PeriodAxisLabelInfo /*@ArrayLen(2)*/ []) this.labelInfo.clone(); + clone.labelInfo = (PeriodAxisLabelInfo @ArrayLen(2) []) this.labelInfo.clone(); return clone; } diff --git a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java index 2d7991121..3282d66f6 100644 --- a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java @@ -46,10 +46,10 @@ package org.jfree.chart.axis; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -74,11 +74,11 @@ public class QuarterDateFormat extends DateFormat private static final long serialVersionUID = -6738465248529797176L; /** Symbols for regular quarters. */ - public static final String /*@ArrayLen(4)*/ [] REGULAR_QUARTERS = new String[] {"1", "2", + public static final String @ArrayLen(4) [] REGULAR_QUARTERS = new String[] {"1", "2", "3", "4"}; /** Symbols for roman numbered quarters. */ - public static final String /*@ArrayLen(4)*/ [] ROMAN_QUARTERS = new String[] {"I", "II", + public static final String @ArrayLen(4) [] ROMAN_QUARTERS = new String[] {"I", "II", "III", "IV"}; /** @@ -86,11 +86,11 @@ public class QuarterDateFormat extends DateFormat * * @since 1.0.6 */ - public static final String /*@ArrayLen(4)*/ [] GREEK_QUARTERS = new String[] {"\u0391", + public static final String @ArrayLen(4) [] GREEK_QUARTERS = new String[] {"\u0391", "\u0392", "\u0393", "\u0394"}; /** The strings. */ - private String /*@ArrayLen(4)*/ [] quarters = REGULAR_QUARTERS; + private String @ArrayLen(4) [] quarters = REGULAR_QUARTERS; /** A flag that controls whether the quarter or the year goes first. */ private boolean quarterFirst; @@ -117,7 +117,7 @@ public QuarterDateFormat(TimeZone zone) { * @param zone the time zone ({@code null} not permitted). * @param quarterSymbols the quarter symbols. */ - public QuarterDateFormat(TimeZone zone, String /*@ArrayLen(4)*/ [] quarterSymbols) { + public QuarterDateFormat(TimeZone zone, String @ArrayLen(4) [] quarterSymbols) { this(zone, quarterSymbols, false); } @@ -131,7 +131,7 @@ public QuarterDateFormat(TimeZone zone, String /*@ArrayLen(4)*/ [] quarterSymbol * * @since 1.0.6 */ - public QuarterDateFormat(TimeZone zone, String /*@ArrayLen(4)*/ [] quarterSymbols, + public QuarterDateFormat(TimeZone zone, String @ArrayLen(4) [] quarterSymbols, boolean quarterFirst) { Args.nullNotPermitted(zone, "zone"); this.calendar = new GregorianCalendar(zone); @@ -160,7 +160,7 @@ public StringBuffer format(Date date, StringBuffer toAppendTo, this.calendar.setTime(date); int year = this.calendar.get(Calendar.YEAR); @SuppressWarnings({"index", "value"}) // calendar get: calendar.get is a combined getter for various calendar fields, and therefore has no sensical annotation - /*@IntRange(from=0, to=11)*/ int month = this.calendar.get(Calendar.MONTH); + @IntRange(from=0, to=11) int month = this.calendar.get(Calendar.MONTH); int quarter = month / 3; if (this.quarterFirst) { toAppendTo.append(this.quarters[quarter]); diff --git a/src/main/java/org/jfree/chart/axis/TickUnits.java b/src/main/java/org/jfree/chart/axis/TickUnits.java index ba9503edf..69a970539 100644 --- a/src/main/java/org/jfree/chart/axis/TickUnits.java +++ b/src/main/java/org/jfree/chart/axis/TickUnits.java @@ -54,7 +54,7 @@ */ package org.jfree.chart.axis; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; import java.text.NumberFormat; @@ -115,7 +115,7 @@ public int size() { * * @return The tickunit. */ - public TickUnit get(/*@NonNegative*/ int pos) { + public TickUnit get(@NonNegative int pos) { return (TickUnit) this.tickUnits.get(pos); } diff --git a/src/main/java/org/jfree/chart/axis/ValueAxis.java b/src/main/java/org/jfree/chart/axis/ValueAxis.java index c4734a4fd..895277c4e 100644 --- a/src/main/java/org/jfree/chart/axis/ValueAxis.java +++ b/src/main/java/org/jfree/chart/axis/ValueAxis.java @@ -113,12 +113,12 @@ */ package org.jfree.chart.axis; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; + -/*>>> import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.dataflow.qual.Pure; - */ + import java.awt.Font; import java.awt.FontMetrics; @@ -634,7 +634,7 @@ protected void drawAxisLine(Graphics2D g2, double cursor, * * @return The x and y coordinates of the anchor point. */ - protected float /*@ArrayLen(2)*/ [] calculateAnchorPoint(ValueTick tick, double cursor, + protected float @ArrayLen(2) [] calculateAnchorPoint(ValueTick tick, double cursor, Rectangle2D dataArea, RectangleEdge edge) { RectangleInsets insets = getTickLabelInsets(); @@ -1477,7 +1477,7 @@ public void setMinorTickCount(int count) { * * @see #java2DToValue(double, Rectangle2D, RectangleEdge) */ - /*@Pure*/ + @Pure public abstract double valueToJava2D(double value, Rectangle2D area, RectangleEdge edge); @@ -1660,7 +1660,7 @@ protected int getAutoTickIndex() { * * @see #getAutoTickIndex() */ - protected void setAutoTickIndex(/*@NonNegative*/ int index) { + protected void setAutoTickIndex(@NonNegative int index) { this.autoTickIndex = index; } diff --git a/src/main/java/org/jfree/chart/block/ColumnArrangement.java b/src/main/java/org/jfree/chart/block/ColumnArrangement.java index f5fc36bb6..3e899ff8e 100644 --- a/src/main/java/org/jfree/chart/block/ColumnArrangement.java +++ b/src/main/java/org/jfree/chart/block/ColumnArrangement.java @@ -41,9 +41,9 @@ package org.jfree.chart.block; -/*>>> + import org.checkerframework.checker.index.qual.SameLen; - */ + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; diff --git a/src/main/java/org/jfree/chart/block/FlowArrangement.java b/src/main/java/org/jfree/chart/block/FlowArrangement.java index 746ed3f71..c07f3dd91 100644 --- a/src/main/java/org/jfree/chart/block/FlowArrangement.java +++ b/src/main/java/org/jfree/chart/block/FlowArrangement.java @@ -42,9 +42,9 @@ package org.jfree.chart.block; -/*>>> + import org.checkerframework.checker.index.qual.SameLen; - */ + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; diff --git a/src/main/java/org/jfree/chart/block/GridArrangement.java b/src/main/java/org/jfree/chart/block/GridArrangement.java index e488fc38d..6e357eaf9 100644 --- a/src/main/java/org/jfree/chart/block/GridArrangement.java +++ b/src/main/java/org/jfree/chart/block/GridArrangement.java @@ -41,7 +41,7 @@ */ package org.jfree.chart.block; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -59,10 +59,10 @@ public class GridArrangement implements Arrangement, Serializable { private static final long serialVersionUID = -2563758090144655938L; /** The rows. */ - private /*@NonNegative*/ int rows; + private @NonNegative int rows; /** The columns. */ - private /*@NonNegative*/ int columns; + private @NonNegative int columns; /** * Creates a new grid arrangement. @@ -70,7 +70,7 @@ public class GridArrangement implements Arrangement, Serializable { * @param rows the row count. * @param columns the column count. */ - public GridArrangement(/*@NonNegative*/ int rows, /*@NonNegative*/ int columns) { + public GridArrangement(@NonNegative int rows, @NonNegative int columns) { this.rows = rows; this.columns = columns; } diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index 8ee620f3b..8412fd27f 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -28,12 +28,11 @@ package org.jfree.chart.date; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; import org.checkerframework.common.value.qual.IntVal; import org.checkerframework.checker.index.qual.SameLen; - */ import java.io.Serializable; import java.text.DateFormatSymbols; @@ -111,25 +110,25 @@ public abstract class SerialDate implements Comparable, Serializable, public static final int SUNDAY = Calendar.SUNDAY; /** The number of days in each month in non leap years. */ - static final /*@IntRange(from = 0, to = 31)*/ int /*@ArrayLen(13)*/ [] LAST_DAY_OF_MONTH = + static final @IntRange(from = 0, to = 31) int @ArrayLen(13) [] LAST_DAY_OF_MONTH = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /** The number of days in a (non-leap) year up to the end of each month. */ - static final int /*@ArrayLen(13)*/ [] AGGREGATE_DAYS_TO_END_OF_MONTH = + static final int @ArrayLen(13) [] AGGREGATE_DAYS_TO_END_OF_MONTH = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; /** The number of days in a year up to the end of the preceding month. */ - static final /*@IntRange(from = 0, to = 365)*/ int /*@ArrayLen(14)*/ [] AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH = + static final @IntRange(from = 0, to = 365) int @ArrayLen(14) [] AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; /** The number of days in a leap year up to the end of each month. */ - static final int /*@ArrayLen(13)*/ [] LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_MONTH = + static final int @ArrayLen(13) [] LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_MONTH = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; /** * The number of days in a leap year up to the end of the preceding month. */ - static final /*@IntRange(from = 0, to = 366)*/ int /*@ArrayLen(14)*/ [] + static final @IntRange(from = 0, to = 366) int @ArrayLen(14) [] LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH = {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}; @@ -226,7 +225,7 @@ public static int stringToWeekdayCode(String s) { final String[] shortWeekdayNames = DATE_FORMAT_SYMBOLS.getShortWeekdays(); @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/179 - final String /*@SameLen("shortWeekdayNames")*/ [] weekDayNames = DATE_FORMAT_SYMBOLS.getWeekdays(); + final String @SameLen("shortWeekdayNames") [] weekDayNames = DATE_FORMAT_SYMBOLS.getWeekdays(); int result = -1; s = s.trim(); @@ -253,8 +252,8 @@ public static int stringToWeekdayCode(String s) { * * @return a string representing the supplied day-of-the-week. */ - public static String weekdayCodeToString(/*@IntRange(from=0, to=7)*/ int weekday) { - final String /*@ArrayLen(8)*/ [] weekdays = DATE_FORMAT_SYMBOLS.getWeekdays(); + public static String weekdayCodeToString(@IntRange(from=0, to=7) int weekday) { + final String @ArrayLen(8) [] weekdays = DATE_FORMAT_SYMBOLS.getWeekdays(); return weekdays[weekday]; } @@ -263,7 +262,7 @@ public static String weekdayCodeToString(/*@IntRange(from=0, to=7)*/ int weekday * * @return an array of month names. */ - public static String /*@ArrayLen(13)*/ [] getMonths() { + public static String @ArrayLen(13) [] getMonths() { return getMonths(false); @@ -277,7 +276,7 @@ public static String weekdayCodeToString(/*@IntRange(from=0, to=7)*/ int weekday * * @return an array of month names. */ - public static String /*@ArrayLen(13)*/ [] getMonths(boolean shortened) { + public static String @ArrayLen(13) [] getMonths(boolean shortened) { if (shortened) { return DATE_FORMAT_SYMBOLS.getShortMonths(); } @@ -323,7 +322,7 @@ public static boolean isValidMonthCode(int code) { * * @return the quarter that the month belongs to. */ - public static /*@IntVal({1,2,3,4})*/ int monthCodeToQuarter(/*@IntRange(from = 1, to = 12)*/ int code) { + public static @IntVal({1,2,3,4}) int monthCodeToQuarter(@IntRange(from = 1, to = 12) int code) { switch(code) { case JANUARY: @@ -354,7 +353,7 @@ public static boolean isValidMonthCode(int code) { * * @return a string representing the supplied month. */ - public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month) { + public static String monthCodeToString(@IntRange(from=1, to=12) int month) { return monthCodeToString(month, false); } @@ -369,7 +368,7 @@ public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month) { * * @return a string representing the supplied month. */ - public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month, boolean shortened) { + public static String monthCodeToString(@IntRange(from=1, to=12) int month, boolean shortened) { // check arguments... if (!isValidMonthCode(month)) { @@ -377,7 +376,7 @@ public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month, b "SerialDate.monthCodeToString: month outside valid range."); } - final String /*@ArrayLen(13)*/ [] months; + final String @ArrayLen(13) [] months; if (shortened) { final String[] monthsTmp = DATE_FORMAT_SYMBOLS.getShortMonths(); @@ -404,11 +403,11 @@ public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month, b * @return {@code -1} if the string is not parseable, the month of the * year otherwise. */ - public static /*@IntRange(from = -1, to = 12)*/ int stringToMonthCode(String s) { + public static @IntRange(from = -1, to = 12) int stringToMonthCode(String s) { final String[] shortMonthNames = DATE_FORMAT_SYMBOLS.getShortMonths(); @SuppressWarnings("index") // Need annotations on Date Format Symbols - final String /*@SameLen("shortMonthNames")*/ [] monthNames = DATE_FORMAT_SYMBOLS.getMonths(); + final String @SameLen("shortMonthNames") [] monthNames = DATE_FORMAT_SYMBOLS.getMonths(); int result = -1; s = s.trim(); @@ -435,7 +434,7 @@ public static String monthCodeToString(/*@IntRange(from=1, to=12)*/ int month, b } } @SuppressWarnings({"index", "value"}) // the loop above only ensures that 1 <= result <= 12 if s is an actual month name - /*@IntRange(from = 1, to =12)*/ int toReturn = result; + @IntRange(from = 1, to =12) int toReturn = result; return toReturn; @@ -467,7 +466,7 @@ public static boolean isValidWeekInMonthCode(int code) { * * @return {@code true} if the specified year is a leap year. */ - public static boolean isLeapYear(/*@IntRange(from = 1900, to = 9999)*/ int yyyy) { + public static boolean isLeapYear(@IntRange(from = 1900, to = 9999) int yyyy) { if ((yyyy % 4) != 0) { return false; @@ -495,7 +494,7 @@ else if ((yyyy % 100) == 0) { * @return the number of leap years from 1900 to the specified year (if year is 9999, 1964 leap years). */ @SuppressWarnings({"index", "value"}) // imprecision wrt ranges - public static /*@IntRange(from = 0, to = 1964)*/ int leapYearCount(/*@IntRange(from = 1900, to = 9999)*/int yyyy) { + public static @IntRange(from = 0, to = 1964) int leapYearCount(@IntRange(from = 1900, to = 9999)int yyyy) { int leap4 = (yyyy - 1896) / 4; int leap100 = (yyyy - 1800) / 100; int leap400 = (yyyy - 1600) / 400; @@ -512,7 +511,7 @@ else if ((yyyy % 100) == 0) { * @return the number of the last day of the month. */ @SuppressWarnings({"index", "value"}) // February has 28 days, so 1 is only added to 28, not 31. - public static /*@IntRange(from = 28, to = 31)*/ int lastDayOfMonth(/*@IntRange(from=1, to=12)*/ int month, int yyyy) { + public static @IntRange(from = 28, to = 31) int lastDayOfMonth(@IntRange(from=1, to=12) int month, int yyyy) { final int result = LAST_DAY_OF_MONTH[month]; if (month != FEBRUARY) { @@ -563,7 +562,7 @@ public static SerialDate addMonths(int months, SerialDate base) { int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1; int lastDayOfMonth = SerialDate.lastDayOfMonth(mm, yy); @SuppressWarnings({"index", "value"}) // https://github.com/typetools/checker-framework/issues/1687 - /*@IntRange(from = 1, to = 31)*/ int dd = Math.min(base.getDayOfMonth(), + @IntRange(from = 1, to = 31) int dd = Math.min(base.getDayOfMonth(), lastDayOfMonth); return SerialDate.createInstance(dd, mm, yy); } @@ -601,7 +600,7 @@ public static SerialDate addYears(int years, SerialDate base) { * @return the latest date that falls on the specified day-of-the-week and * is BEFORE the base date. */ - public static SerialDate getPreviousDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetWeekday, + public static SerialDate getPreviousDayOfWeek(@IntRange(from = 1, to = 7) int targetWeekday, SerialDate base) { // check arguments... @@ -632,7 +631,7 @@ public static SerialDate getPreviousDayOfWeek(/*@IntRange(from = 1, to = 7)*/ in * @return the earliest date that falls on the specified day-of-the-week * and is AFTER the base date. */ - public static SerialDate getFollowingDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetWeekday, + public static SerialDate getFollowingDayOfWeek(@IntRange(from = 1, to = 7) int targetWeekday, SerialDate base) { // check arguments... @@ -664,7 +663,7 @@ public static SerialDate getFollowingDayOfWeek(/*@IntRange(from = 1, to = 7)*/ i * @return the date that falls on the specified day-of-the-week and is * CLOSEST to the base date. */ - public static SerialDate getNearestDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetDOW, SerialDate base) { + public static SerialDate getNearestDayOfWeek(@IntRange(from = 1, to = 7) int targetDOW, SerialDate base) { // check arguments... if (!SerialDate.isValidWeekdayCode(targetDOW)) { @@ -749,7 +748,7 @@ public static String relativeToString(int relative) { * * @return An instance of {@link SerialDate}. */ - public static SerialDate createInstance(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int yyyy) { + public static SerialDate createInstance(@IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1900, to = 9999) int yyyy) { return new SpreadsheetDate(day, month, yyyy); } @@ -761,7 +760,7 @@ public static SerialDate createInstance(/*@IntRange(from = 1, to = 31)*/ int day * * @return a instance of SerialDate. */ - public static SerialDate createInstance(/*@IntRange(from = 2, to = 2958465)*/ int serial) { + public static SerialDate createInstance(@IntRange(from = 2, to = 2958465) int serial) { return new SpreadsheetDate(serial); } @@ -789,7 +788,7 @@ public static SerialDate createInstance(java.util.Date date) { * * @return the serial number for the date. */ - public abstract /*@IntRange(from = 2, to = 2958465)*/ int toSerial(); + public abstract @IntRange(from = 2, to = 2958465) int toSerial(); /** * Returns a java.util.Date. Since java.util.Date has more precision than @@ -835,28 +834,28 @@ public String toString() { * * @return the year. */ - public abstract /*@IntRange(from=1900, to=9999)*/ int getYYYY(); + public abstract @IntRange(from=1900, to=9999) int getYYYY(); /** * Returns the month (January = 1, February = 2, March = 3). * * @return the month of the year. */ - public abstract /*@IntRange(from=1, to=12)*/ int getMonth(); + public abstract @IntRange(from=1, to=12) int getMonth(); /** * Returns the day of the month. * * @return the day of the month. */ - public abstract /*@IntRange(from = 1, to = 31)*/ int getDayOfMonth(); + public abstract @IntRange(from = 1, to = 31) int getDayOfMonth(); /** * Returns the day of the week. * * @return the day of the week. */ - public abstract /*@IntRange(from = 1, to = 7)*/ int getDayOfWeek(); + public abstract @IntRange(from = 1, to = 7) int getDayOfWeek(); /** * Returns the difference (in days) between this date and the specified @@ -962,7 +961,7 @@ public abstract boolean isInRange(SerialDate d1, SerialDate d2, * @return the latest date that falls on the specified day-of-the-week and * is BEFORE this date. */ - public SerialDate getPreviousDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetDOW) { + public SerialDate getPreviousDayOfWeek(@IntRange(from = 1, to = 7) int targetDOW) { return getPreviousDayOfWeek(targetDOW, this); } @@ -975,7 +974,7 @@ public SerialDate getPreviousDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targe * @return the earliest date that falls on the specified day-of-the-week * and is AFTER this date. */ - public SerialDate getFollowingDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetDOW) { + public SerialDate getFollowingDayOfWeek(@IntRange(from = 1, to = 7) int targetDOW) { return getFollowingDayOfWeek(targetDOW, this); } @@ -986,7 +985,7 @@ public SerialDate getFollowingDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targ * * @return the nearest date that falls on the specified day-of-the-week. */ - public SerialDate getNearestDayOfWeek(/*@IntRange(from = 1, to = 7)*/ int targetDOW) { + public SerialDate getNearestDayOfWeek(@IntRange(from = 1, to = 7) int targetDOW) { return getNearestDayOfWeek(targetDOW, this); } diff --git a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java index 63755d9a0..f9ab66cbc 100644 --- a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java +++ b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java @@ -28,11 +28,11 @@ package org.jfree.chart.date; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; import org.checkerframework.checker.index.qual.*; - */ + import java.util.Calendar; import java.util.Date; @@ -64,16 +64,16 @@ public class SpreadsheetDate extends SerialDate { * The day number (1-Jan-1900 = 2, 2-Jan-1900 = 3, ..., 31-Dec-9999 = * 2958465). */ - private final /*@IntRange(from = 2, to = 2958465)*/ int serial; + private final @IntRange(from = 2, to = 2958465) int serial; /** The day of the month (1 to 28, 29, 30 or 31 depending on the month). */ - private final /*@IntRange(from = 1, to = 31)*/ int day; + private final @IntRange(from = 1, to = 31) int day; /** The month of the year (1 to 12). */ - private final /*@IntRange(from = 1, to = 12)*/ int month; + private final @IntRange(from = 1, to = 12) int month; /** The year (1900 to 9999). */ - private final /*@IntRange(from = 1900, to = 9999)*/ int year; + private final @IntRange(from = 1900, to = 9999) int year; /** * Creates a new date instance. @@ -82,7 +82,7 @@ public class SpreadsheetDate extends SerialDate { * @param month the month (in the range 1 to 12). * @param year the year (in the range 1900 to 9999). */ - public SpreadsheetDate(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1, to = 9999)*/ int year) { + public SpreadsheetDate(@IntRange(from = 1, to = 31) int day, /*@IntRange(from = 1, to = 12)*/ int month, @IntRange(from = 1, to = 9999) int year) { if ((year >= 1900) && (year <= 9999)) { this.year = year; @@ -117,7 +117,7 @@ public SpreadsheetDate(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(fro * * @param serial the serial number for the day (range: 2 to 2958465). */ - public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { + public SpreadsheetDate(@IntRange(from = 2, to = 2958465) int serial) { if ((serial >= SERIAL_LOWER_BOUND) && (serial <= SERIAL_UPPER_BOUND)) { this.serial = serial; @@ -132,22 +132,22 @@ public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { final int days = this.serial - SERIAL_LOWER_BOUND; // overestimated because we ignored leap days @SuppressWarnings({"index", "value"}) // not really true, but gets this to typecheck. Safety is assured by checks later in this method - final /*@IntRange(from = 1900, to = 9999)*/ int overestimatedYYYY = 1900 + (days / 365); + final @IntRange(from = 1900, to = 9999) int overestimatedYYYY = 1900 + (days / 365); final int leaps = SerialDate.leapYearCount(overestimatedYYYY); final int nonleapdays = days - leaps; // underestimated because we overestimated years @SuppressWarnings({"index", "value"}) // not really true, but gets this to typecheck. Safety is assured by checks later in this method - /*@IntRange(from = 1900, to = 9999)*/ int underestimatedYYYY = 1900 + (nonleapdays / 365); + @IntRange(from = 1900, to = 9999) int underestimatedYYYY = 1900 + (nonleapdays / 365); if (underestimatedYYYY == overestimatedYYYY) { this.year = underestimatedYYYY; } else { int ss1 = calcSerial(1, 1, underestimatedYYYY); @SuppressWarnings({"index", "value"}) // Necessary for typechecking the modified code below. - /*@IntRange(from = 1901, to = 10000)*/ int underestimatedYYYY2 = underestimatedYYYY; + @IntRange(from = 1901, to = 10000) int underestimatedYYYY2 = underestimatedYYYY; while (ss1 <= this.serial) { @SuppressWarnings({"index", "value"}) // This code rolls the year up to one higher than the correct one. - /*@IntRange(from = 1901, to = 10000)*/ int underestimatedYYYYTmp = underestimatedYYYY2 + 1; + @IntRange(from = 1901, to = 10000) int underestimatedYYYYTmp = underestimatedYYYY2 + 1; underestimatedYYYY2 = underestimatedYYYYTmp; @SuppressWarnings({"index", "value"}) // this call to calcSerial could technically happen with a year that's 10000. The result would still be correct. int ss1tmp = calcSerial(1, 1, underestimatedYYYY2); @@ -158,7 +158,7 @@ public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { final int ss2 = calcSerial(1, 1, this.year); - /*@IntRange(from = 0, to = 366)*/ int /*@ArrayLen(14)*/ [] daysToEndOfPrecedingMonth + @IntRange(from = 0, to = 366) int @ArrayLen(14) [] daysToEndOfPrecedingMonth = AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH; if (isLeapYear(this.year)) { @@ -167,21 +167,21 @@ public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { } // get the month from the serial date - /*@IntRange(from = 1, to = 13)*/ int mm = 1; + @IntRange(from = 1, to = 13) int mm = 1; int sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1; while (sss < this.serial) { @SuppressWarnings({"index", "value"}) // this loop cannot go around more than 12 times - /*@IntRange(from=2, to=13)*/ int mm1 = mm + 1; + @IntRange(from=2, to=13) int mm1 = mm + 1; mm = mm1; sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1; } @SuppressWarnings({"index", "value"}) // previous loop always goes around at least once - /*@IntRange(from = 1, to = 12)*/ int newMonth = mm - 1; + @IntRange(from = 1, to = 12) int newMonth = mm - 1; this.month = newMonth; // what's left is d(+1); @SuppressWarnings({"index", "value"}) // date math - /*@IntRange(from = 1, to = 31)*/ int newDay = this.serial - ss2 + @IntRange(from = 1, to = 31) int newDay = this.serial - ss2 - daysToEndOfPrecedingMonth[this.month] + 1; this.day = newDay; @@ -195,7 +195,7 @@ public SpreadsheetDate(/*@IntRange(from = 2, to = 2958465)*/ int serial) { * @return The serial number of this date. */ @Override - public /*@IntRange(from = 2, to = 2958465)*/ int toSerial() { + public @IntRange(from = 2, to = 2958465) int toSerial() { return this.serial; } @@ -217,7 +217,7 @@ public Date toDate() { * @return The year. */ @Override - public /*@IntRange(from = 1900, to = 9999)*/ int getYYYY() { + public @IntRange(from = 1900, to = 9999) int getYYYY() { return this.year; } @@ -227,7 +227,7 @@ public Date toDate() { * @return The month of the year. */ @Override - public /*@IntRange(from = 1, to = 12)*/ int getMonth() { + public @IntRange(from = 1, to = 12) int getMonth() { return this.month; } @@ -237,7 +237,7 @@ public Date toDate() { * @return The day of the month. */ @Override - public /*@IntRange(from = 1, to = 31)*/ int getDayOfMonth() { + public @IntRange(from = 1, to = 31) int getDayOfMonth() { return this.day; } @@ -252,7 +252,7 @@ public Date toDate() { * @return A code representing the day of the week. */ @Override - public /*@IntRange(from = 1, to = 7)*/ int getDayOfWeek() { + public @IntRange(from = 1, to = 7) int getDayOfWeek() { return (this.serial + 6) % 7 + 1; } @@ -445,21 +445,21 @@ else if (include == SerialDate.INCLUDE_SECOND) { * * @return the serial number from the day, month and year. */ - private /*@IntRange(from = 2, to = 2958465)*/ int calcSerial(/*@IntRange(from = 1, to = 31)*/ int d, /*@IntRange(from=1,to=12)*/ int m, /*@IntRange(from = 1900, to = 9999)*/ int y) { + private @IntRange(from = 2, to = 2958465) int calcSerial(/*@IntRange(from = 1, to = 31)*/ int d, /*@IntRange(from=1,to=12)*/ int m, @IntRange(from = 1900, to = 9999) int y) { @SuppressWarnings({"index", "value"}) // Though passing y - 1 is technically incorrect iff y = 1900, leapYearCount returns zero if passed 1899 (same as 1900). int yy = ((y - 1900) * 365) + SerialDate.leapYearCount(y - 1); @SuppressWarnings({"index", "value"}) // Preceding month can't be December - month must be 1 - 12 (12 -> current month is december). - /*@IntRange(from = 0, to = 336)*/ int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m]; + @IntRange(from = 0, to = 336) int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m]; if (m > MonthConstants.FEBRUARY) { if (SerialDate.isLeapYear(y)) { @SuppressWarnings({"index", "value"}) // Adding leap day doesn't change this value's range - /*@IntRange(from = 0, to = 336)*/ int mm1 = mm + 1; + @IntRange(from = 0, to = 336) int mm1 = mm + 1; mm = mm1; } } int dd = d; @SuppressWarnings("value") // Imprecision due to presence or absence of leap days (checker thinks it may be two higher) - /*@IntRange(from = 2, to = 2958465)*/ int result = yy + mm + dd + 1; + @IntRange(from = 2, to = 2958465) int result = yy + mm + dd + 1; return result; } diff --git a/src/main/java/org/jfree/chart/entity/EntityCollection.java b/src/main/java/org/jfree/chart/entity/EntityCollection.java index a031d139b..1febb4e11 100644 --- a/src/main/java/org/jfree/chart/entity/EntityCollection.java +++ b/src/main/java/org/jfree/chart/entity/EntityCollection.java @@ -46,7 +46,7 @@ */ package org.jfree.chart.entity; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.util.Collection; import java.util.Iterator; @@ -93,7 +93,7 @@ public interface EntityCollection { * * @return An entity. */ - public ChartEntity getEntity(/*@NonNegative*/ int index); + public ChartEntity getEntity(@NonNegative int index); /** * Returns the entity count. diff --git a/src/main/java/org/jfree/chart/entity/PieSectionEntity.java b/src/main/java/org/jfree/chart/entity/PieSectionEntity.java index fdc9b8fa1..ed8ac9202 100644 --- a/src/main/java/org/jfree/chart/entity/PieSectionEntity.java +++ b/src/main/java/org/jfree/chart/entity/PieSectionEntity.java @@ -53,7 +53,7 @@ */ package org.jfree.chart.entity; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Shape; import java.io.Serializable; @@ -150,7 +150,7 @@ public int getPieIndex() { * * @see #getPieIndex() */ - public void setPieIndex(/*@NonNegative*/ int index) { + public void setPieIndex(@NonNegative int index) { this.pieIndex = index; } @@ -172,7 +172,7 @@ public int getSectionIndex() { * * @see #getSectionIndex() */ - public void setSectionIndex(/*@NonNegative*/ int index) { + public void setSectionIndex(@NonNegative int index) { this.sectionIndex = index; } diff --git a/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java b/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java index 8732629dd..bd47a7367 100644 --- a/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java +++ b/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java @@ -49,7 +49,7 @@ */ package org.jfree.chart.entity; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Collection; @@ -99,7 +99,7 @@ public int getEntityCount() { * @see #add(ChartEntity) */ @Override - public ChartEntity getEntity(/*@NonNegative*/ int index) { + public ChartEntity getEntity(@NonNegative int index) { return (ChartEntity) this.entities.get(index); } diff --git a/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java b/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java index f35c879fb..05902c0cd 100644 --- a/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.entity; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Shape; import java.io.Serializable; @@ -65,7 +65,7 @@ public class XYAnnotationEntity extends ChartEntity * @param toolTipText the tool tip text. * @param urlText the URL text for HTML image maps. */ - public XYAnnotationEntity(Shape hotspot, /*@NonNegative*/ int rendererIndex, + public XYAnnotationEntity(Shape hotspot, @NonNegative int rendererIndex, String toolTipText, String urlText) { super(hotspot, toolTipText, urlText); this.rendererIndex = rendererIndex; @@ -85,7 +85,7 @@ public int getRendererIndex() { * * @param index the item index (zero-based). */ - public void setRendererIndex(/*@NonNegative*/ int index) { + public void setRendererIndex(@NonNegative int index) { this.rendererIndex = index; } diff --git a/src/main/java/org/jfree/chart/entity/XYItemEntity.java b/src/main/java/org/jfree/chart/entity/XYItemEntity.java index cb2d224c9..04a759aea 100644 --- a/src/main/java/org/jfree/chart/entity/XYItemEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYItemEntity.java @@ -50,9 +50,9 @@ package org.jfree.chart.entity; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Shape; @@ -71,7 +71,7 @@ public class XYItemEntity extends ChartEntity { private transient XYDataset dataset; /** The series. */ - private /*@NonNegative*/ int series; + private @NonNegative int series; /** The item. */ private int item; @@ -87,7 +87,7 @@ public class XYItemEntity extends ChartEntity { * @param urlText the URL text for HTML image maps. */ public XYItemEntity(Shape area, - XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item, + XYDataset dataset, @NonNegative int series, @NonNegative int item, String toolTipText, String urlText) { super(area, toolTipText, urlText); this.dataset = dataset; @@ -118,7 +118,7 @@ public void setDataset(XYDataset dataset) { * * @return The series index. */ - public /*@NonNegative*/ int getSeriesIndex() { + public @NonNegative int getSeriesIndex() { return this.series; } @@ -127,7 +127,7 @@ public void setDataset(XYDataset dataset) { * * @param series the series index (zero-based). */ - public void setSeriesIndex(/*@NonNegative*/ int series) { + public void setSeriesIndex(@NonNegative int series) { this.series = series; } @@ -145,7 +145,7 @@ public int getItem() { * * @param item the item index (zero-based). */ - public void setItem(/*@NonNegative*/ int item) { + public void setItem(@NonNegative int item) { this.item = item; } diff --git a/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java index 4d01796e1..b76caf80e 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java @@ -45,8 +45,8 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.MinLen; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.MinLen; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.text.DateFormat; @@ -160,7 +160,7 @@ protected AbstractCategoryItemLabelGenerator(String labelFormat, * * @return The label. */ - public String generateRowLabel(CategoryDataset dataset, /*@NonNegative*/ int row) { + public String generateRowLabel(CategoryDataset dataset, @NonNegative int row) { return dataset.getRowKey(row).toString(); } @@ -172,7 +172,7 @@ public String generateRowLabel(CategoryDataset dataset, /*@NonNegative*/ int row * * @return The label. */ - public String generateColumnLabel(CategoryDataset dataset, /*@NonNegative*/ int column) { + public String generateColumnLabel(CategoryDataset dataset, @NonNegative int column) { return dataset.getColumnKey(column).toString(); } @@ -213,7 +213,7 @@ public DateFormat getDateFormat() { * @return The label (possibly {@code null}). */ protected String generateLabelString(CategoryDataset dataset, - /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @NonNegative int row, @NonNegative int column) { Args.nullNotPermitted(dataset, "dataset"); String result; Object[] items = createItemArray(dataset, row, column); @@ -232,8 +232,8 @@ protected String generateLabelString(CategoryDataset dataset, * * @return The items (never {@code null}). */ - protected Object /*@MinLen(4)*/ [] createItemArray(CategoryDataset dataset, - /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + protected Object @MinLen(4) [] createItemArray(CategoryDataset dataset, + @NonNegative int row, @NonNegative int column) { Object[] result = new Object[4]; result[0] = dataset.getRowKey(row).toString(); result[1] = dataset.getColumnKey(column).toString(); diff --git a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java index 94d9eabe7..6038d2c98 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java @@ -44,12 +44,12 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.common.value.qual.MinLen; -*/ + import java.io.Serializable; import java.text.MessageFormat; @@ -140,7 +140,7 @@ public NumberFormat getPercentFormat() { * * @return The items (never {@code null}). */ - protected Object /*@MinLen(4)*/ [] createItemArray(PieDataset dataset, Comparable key) { + protected Object @MinLen(4) [] createItemArray(PieDataset dataset, Comparable key) { Object[] result = new Object[4]; double total = DatasetUtils.calculatePieDatasetTotal(dataset); result[0] = key.toString(); diff --git a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java index 6d10bec92..975f83ff6 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java @@ -54,12 +54,12 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.MinLen; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.MinLen; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -239,7 +239,7 @@ public DateFormat getYDateFormat() { * * @return The label (possibly {@code null}). */ - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateLabelString(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { String result; Object[] items = createItemArray(dataset, series, item); result = MessageFormat.format(this.formatString, items); @@ -268,8 +268,8 @@ public String getNullYString() { * @return An array of three items from the dataset formatted as * {@code String} objects (never {@code null}). */ - protected Object /*@MinLen(3)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#1.getSeries(#2)")*/ int item) { + protected Object @MinLen(3) [] createItemArray(XYDataset dataset, @NonNegative int series, + @IndexFor("#1.getSeries(#2)") int item) { Object[] result = new Object[3]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java index 73a805347..c5a825261 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java @@ -40,11 +40,11 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.MinLen; */ +import org.checkerframework.common.value.qual.MinLen; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.MessageFormat; @@ -113,8 +113,8 @@ public BoxAndWhiskerToolTipGenerator(String format, * @return The items (never {@code null}). */ @Override - protected Object /*@MinLen(8)*/ [] createItemArray(CategoryDataset dataset, /*@NonNegative*/ int series, - /*@NonNegative*/ int item) { + protected Object @MinLen(8) [] createItemArray(CategoryDataset dataset, @NonNegative int series, + @NonNegative int item) { Object[] result = new Object[8]; result[0] = dataset.getRowKey(series); Number y = dataset.getValue(series, item); diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 1fff721cc..b0fccbac8 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -48,13 +48,13 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -130,8 +130,8 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, * @return The items (never {@code null}). */ @Override - protected Object /*@MinLen(8)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#1.getSeries(#2)")*/ int item) { + protected Object @MinLen(8) [] createItemArray(XYDataset dataset, @NonNegative int series, + @IndexFor("#1.getSeries(#2)") int item) { Object[] result = new Object[8]; result[0] = dataset.getSeriesKey(series).toString(); Number x = dataset.getX(series, item); @@ -146,7 +146,7 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, if (dataset instanceof BoxAndWhiskerXYDataset) { BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("d.getSeries(series)")*/ int itemD = item; + @IndexFor("d.getSeries(series)") int itemD = item; result[2] = formatter.format(d.getMeanValue(series, itemD)); result[3] = formatter.format(d.getMedianValue(series, itemD)); result[4] = formatter.format(d.getMinRegularValue(series, itemD)); diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index 1eeb876d5..bca6ab1e7 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -44,13 +44,13 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -168,7 +168,7 @@ public DateFormat getZDateFormat() { * @return The item label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateLabel(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { return generateLabelString(dataset, series, item); } @@ -182,13 +182,13 @@ public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@I * @return The label (possibly {@code null}). */ @Override - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateLabelString(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { String result; Object[] items; if (dataset instanceof XYZDataset) { XYZDataset xyzDataset = (XYZDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("xyzDataset.getSeries(series)")*/ int item1 = item; + @IndexFor("xyzDataset.getSeries(series)") int item1 = item; items = createItemArray(xyzDataset, series, item1); } else { @@ -208,8 +208,8 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series * * @return The items (never {@code null}). */ - protected Object /*@MinLen(4)*/ [] createItemArray(XYZDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + protected Object @MinLen(4) [] createItemArray(XYZDataset dataset, + @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { Object[] result = new Object[4]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java index 6be3085f0..b6e989b3f 100644 --- a/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java @@ -58,7 +58,7 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.CategoryDataset; @@ -81,7 +81,7 @@ public interface CategoryItemLabelGenerator { * * @return The label. */ - public String generateRowLabel(CategoryDataset dataset, /*@NonNegative*/ int row); + public String generateRowLabel(CategoryDataset dataset, @NonNegative int row); /** * Generates a label for the specified row. @@ -91,7 +91,7 @@ public interface CategoryItemLabelGenerator { * * @return The label. */ - public String generateColumnLabel(CategoryDataset dataset, /*@NonNegative*/ int column); + public String generateColumnLabel(CategoryDataset dataset, @NonNegative int column); /** * Generates a label for the specified item. The label is typically a @@ -103,6 +103,6 @@ public interface CategoryItemLabelGenerator { * * @return The label (possibly {@code null}). */ - public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column); + public String generateLabel(CategoryDataset dataset, @NonNegative int row, @NonNegative int column); } diff --git a/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java index a99597c6f..cfb79f8a5 100644 --- a/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java @@ -42,9 +42,9 @@ package org.jfree.chart.labels; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.category.CategoryDataset; @@ -66,6 +66,6 @@ public interface CategorySeriesLabelGenerator { * * @return A series label. */ - public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int series); + public String generateLabel(CategoryDataset dataset, @NonNegative int series); } diff --git a/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java index dcc64af37..ed551fd0c 100644 --- a/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.CategoryDataset; @@ -67,6 +67,6 @@ public interface CategoryToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column); + public String generateToolTip(CategoryDataset dataset, @NonNegative int row, @NonNegative int column); } diff --git a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java index 0a941e3b9..f8803278d 100644 --- a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java @@ -46,9 +46,9 @@ package org.jfree.chart.labels; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.List; @@ -81,7 +81,7 @@ public CustomXYToolTipGenerator() { * * @return The list count. */ - public /*@NonNegative*/ int getListCount() { + public @NonNegative int getListCount() { return this.toolTipSeries.size(); } @@ -92,7 +92,7 @@ public CustomXYToolTipGenerator() { * * @return The tooltip count. */ - public /*@NonNegative*/ int getToolTipCount(/*@NonNegative*/ int list) { + public @NonNegative int getToolTipCount(@NonNegative int list) { int result = 0; List tooltips = (List) this.toolTipSeries.get(list); @@ -110,7 +110,7 @@ public CustomXYToolTipGenerator() { * * @return The tool tip text. */ - public String getToolTipText(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String getToolTipText(@NonNegative int series, @NonNegative int item) { String result = null; @@ -145,7 +145,7 @@ public void addToolTipSeries(List toolTips) { * @return The tooltip text. */ @Override - public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateToolTip(XYDataset data, @NonNegative int series, @NonNegative int item) { return getToolTipText(series, item); } diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index bac11ad3c..f868a41ab 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -51,11 +51,11 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -123,14 +123,14 @@ public HighLowItemLabelGenerator(DateFormat dateFormatter, * @return The tooltip text. */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateToolTip(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { if (!(dataset instanceof OHLCDataset)) { return null; } StringBuilder sb = new StringBuilder(); OHLCDataset d = (OHLCDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("d.getSeries(series)")*/ int itemD = item; + @IndexFor("d.getSeries(series)") int itemD = item; Number high = d.getHigh(series, itemD); Number low = d.getLow(series, itemD); Number open = d.getOpen(series, itemD); @@ -171,7 +171,7 @@ public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /* * @return The label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int category) { + public String generateLabel(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int category) { return null; //TODO: implement this method properly } diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java index 1616d7a79..96f7b98c1 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java @@ -39,8 +39,8 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.MinLen; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.MinLen; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.text.DateFormat; @@ -108,8 +108,8 @@ public IntervalCategoryItemLabelGenerator(String labelFormat, * @return The items (never {@code null}). */ @Override - protected Object /*@MinLen(5)*/ [] createItemArray(CategoryDataset dataset, - /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + protected Object @MinLen(5) [] createItemArray(CategoryDataset dataset, + @NonNegative int row, @NonNegative int column) { Object[] result = new Object[5]; result[0] = dataset.getRowKey(row).toString(); result[1] = dataset.getColumnKey(column).toString(); diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java index 306c66955..ed30132a1 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java @@ -40,8 +40,8 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; import java.text.DateFormat; import java.text.NumberFormat; @@ -105,8 +105,8 @@ public IntervalCategoryToolTipGenerator(String labelFormat, * @return The items (never {@code null}). */ @Override - protected Object /*@MinLen(5)*/ [] createItemArray(CategoryDataset dataset, - /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + protected Object @MinLen(5) [] createItemArray(CategoryDataset dataset, + @NonNegative int row, @NonNegative int column) { Object[] result = new Object[5]; result[0] = dataset.getRowKey(row).toString(); result[1] = dataset.getColumnKey(column).toString(); diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index d9614cb02..0124197d6 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -39,13 +39,13 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -156,12 +156,12 @@ public IntervalXYItemLabelGenerator(String formatString, * {@code String} objects (never {@code null}). */ @Override - protected Object /*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#1.getSeries(#2)")*/ int item) { + protected Object @MinLen(7) [] createItemArray(XYDataset dataset, @NonNegative int series, + @IndexFor("#1.getSeries(#2)") int item) { IntervalXYDataset intervalDataset = null; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("intervalDataset.getSeries(series)")*/ int itemIntervalDataset = item; + @IndexFor("intervalDataset.getSeries(series)") int itemIntervalDataset = item; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; } @@ -244,7 +244,7 @@ public IntervalXYItemLabelGenerator(String formatString, * @return The label text (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateLabel(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index 60be84e23..e75e05d4f 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -39,12 +39,12 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.MinLen; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.MinLen; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -152,11 +152,11 @@ public IntervalXYToolTipGenerator(String formatString, * {@code String} objects (never {@code null}). */ @Override - protected Object/*@MinLen(7)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#1.getSeries(#2)")*/ int item) { + protected Object@MinLen(7) [] createItemArray(XYDataset dataset, @NonNegative int series, + @IndexFor("#1.getSeries(#2)") int item) { IntervalXYDataset intervalDataset = null; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("intervalDataset.getSeries(series)")*/ int itemIntervalDataset = item; + @IndexFor("intervalDataset.getSeries(series)") int itemIntervalDataset = item; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; } @@ -235,7 +235,7 @@ public IntervalXYToolTipGenerator(String formatString, * @return The tool tip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateToolTip(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java index f3c15e72c..cfce0e119 100644 --- a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java @@ -43,13 +43,13 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.MessageFormat; @@ -111,7 +111,7 @@ public MultipleXYSeriesLabelGenerator(String format) { * @param series the series index. * @param label the label. */ - public void addSeriesLabel(/*@NonNegative*/ int series, String label) { + public void addSeriesLabel(@NonNegative int series, String label) { Integer key = new Integer(series); List labelList = (List) this.seriesLabelLists.get(key); if (labelList == null) { @@ -126,7 +126,7 @@ public void addSeriesLabel(/*@NonNegative*/ int series, String label) { * * @param series the series index. */ - public void clearSeriesLabels(/*@NonNegative*/ int series) { + public void clearSeriesLabels(@NonNegative int series) { Integer key = new Integer(series); this.seriesLabelLists.put(key, null); } @@ -141,7 +141,7 @@ public void clearSeriesLabels(/*@NonNegative*/ int series) { * @return A series label. */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series) { + public String generateLabel(XYDataset dataset, @NonNegative int series) { Args.nullNotPermitted(dataset, "dataset"); StringBuilder label = new StringBuilder(); label.append(MessageFormat.format(this.formatPattern, @@ -169,7 +169,7 @@ public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series) { * * @return The items (never {@code null}). */ - protected Object /*@MinLen(1)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series) { + protected Object @MinLen(1) [] createItemArray(XYDataset dataset, @NonNegative int series) { Object[] result = new Object[1]; result[0] = dataset.getSeriesKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java index da2f791b3..1b3d601d8 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java @@ -42,7 +42,7 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.text.DateFormat; @@ -125,7 +125,7 @@ public StandardCategoryItemLabelGenerator(String labelFormat, * @return The label (possibly {@code null}). */ @Override - public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public String generateLabel(CategoryDataset dataset, @NonNegative int row, @NonNegative int column) { return generateLabelString(dataset, row, column); } diff --git a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java index 3b1349a9e..8c5b0dac4 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java @@ -43,13 +43,13 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.MessageFormat; @@ -102,7 +102,7 @@ public StandardCategorySeriesLabelGenerator(String format) { * @return A series label. */ @Override - public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int series) { + public String generateLabel(CategoryDataset dataset, @NonNegative int series) { Args.nullNotPermitted(dataset, "dataset"); String label = MessageFormat.format(this.formatPattern, createItemArray(dataset, series)); @@ -118,7 +118,7 @@ public String generateLabel(CategoryDataset dataset, /*@NonNegative*/ int series * * @return The items (never {@code null}). */ - protected Object /*@MinLen(1)*/ [] createItemArray(CategoryDataset dataset, /*@NonNegative*/ int series) { + protected Object @MinLen(1) [] createItemArray(CategoryDataset dataset, @NonNegative int series) { Object[] result = new Object[1]; result[0] = dataset.getRowKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java index fa7a32653..d028a323b 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java @@ -41,7 +41,7 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.text.DateFormat; @@ -108,7 +108,7 @@ public StandardCategoryToolTipGenerator(String labelFormat, */ @Override public String generateToolTip(CategoryDataset dataset, - /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @NonNegative int row, @NonNegative int column) { return generateLabelString(dataset, row, column); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java index f8afe7d53..97f7c63f8 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java @@ -59,11 +59,11 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -185,7 +185,7 @@ public StandardXYItemLabelGenerator(String formatString, * @return The label text (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateLabel(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java index bf7a78d00..71cee4822 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java @@ -43,13 +43,13 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.MessageFormat; @@ -106,7 +106,7 @@ public StandardXYSeriesLabelGenerator(String format) { * @return A series label. */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series) { + public String generateLabel(XYDataset dataset, @NonNegative int series) { Args.nullNotPermitted(dataset, "dataset"); String label = MessageFormat.format( this.formatPattern, createItemArray(dataset, series) @@ -123,7 +123,7 @@ this.formatPattern, createItemArray(dataset, series) * * @return The items (never {@code null}). */ - protected Object /*@MinLen(1)*/ [] createItemArray(XYDataset dataset, /*@NonNegative*/ int series) { + protected Object @MinLen(1) [] createItemArray(XYDataset dataset, @NonNegative int series) { Object[] result = new Object[1]; result[0] = dataset.getSeriesKey(series).toString(); return result; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java index 8c7e930f3..e7cc93508 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java @@ -41,11 +41,11 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -167,7 +167,7 @@ public StandardXYToolTipGenerator(String formatString, * @return The tooltip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateToolTip(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { return generateLabelString(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index a27965977..1920a81c4 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -41,12 +41,12 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.MinLen; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.MinLen; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.text.DateFormat; @@ -163,7 +163,7 @@ public DateFormat getZDateFormat() { * @return The tooltip text (possibly {@code null}). */ @Override - public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateToolTip(XYZDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { return generateLabelString(dataset, series, item); } @@ -177,7 +177,7 @@ public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, / * @return The label (possibly {@code null}). */ @Override - public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateLabelString(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { String result; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 Object[] items = createItemArray((XYZDataset) dataset, series, item); @@ -195,8 +195,8 @@ public String generateLabelString(XYDataset dataset, /*@NonNegative*/ int series * * @return The items (never {@code null}). */ - protected Object /*@MinLen(4)*/ [] createItemArray(XYZDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + protected Object @MinLen(4) [] createItemArray(XYZDataset dataset, + @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { Object[] result = new Object[4]; result[0] = dataset.getSeriesKey(series).toString(); diff --git a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java index 2a06b0fb1..62385d3d5 100644 --- a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java @@ -48,11 +48,11 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; @@ -83,7 +83,7 @@ public class SymbolicXYItemLabelGenerator implements XYItemLabelGenerator, * @return The tool tip text (possibly {@code null}). */ @Override - public String generateToolTip(XYDataset data, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateToolTip(XYDataset data, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { String xStr, yStr; if (data instanceof YisSymbolic) { @@ -120,7 +120,7 @@ else if (data instanceof TimeSeriesCollection) { * @return The label (possibly {@code null}). */ @Override - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int category) { + public String generateLabel(XYDataset dataset, @NonNegative int series, @NonNegative int category) { return null; //TODO: implement this method properly } diff --git a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java index 77ad74e6f..9775c0abc 100644 --- a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java @@ -47,11 +47,11 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.xy.XYDataset; @@ -71,6 +71,6 @@ public interface XYItemLabelGenerator { * * @return The label (possibly {@code null}). */ - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item); + public String generateLabel(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item); } diff --git a/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java index f5bed9e17..beab5f873 100644 --- a/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java @@ -42,9 +42,9 @@ package org.jfree.chart.labels; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.xy.XYDataset; @@ -67,6 +67,6 @@ public interface XYSeriesLabelGenerator { * * @return A series label. */ - public String generateLabel(XYDataset dataset, /*@NonNegative*/ int series); + public String generateLabel(XYDataset dataset, @NonNegative int series); } diff --git a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java index 463c620b5..f8d7c517a 100644 --- a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java @@ -41,12 +41,12 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.xy.XYDataset; @@ -65,6 +65,6 @@ public interface XYToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item); + public String generateToolTip(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item); } diff --git a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java index 5625f831f..c165feadc 100644 --- a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java @@ -41,11 +41,11 @@ */ package org.jfree.chart.labels; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.xy.XYZDataset; @@ -64,6 +64,6 @@ public interface XYZToolTipGenerator extends XYToolTipGenerator { * * @return The tooltip text (possibly {@code null}). */ - public String generateToolTip(XYZDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item); + public String generateToolTip(XYZDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item); } diff --git a/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java b/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java index 8a7613dd1..4d93ef475 100644 --- a/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java +++ b/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.List; @@ -71,7 +71,7 @@ public AbstractPieLabelDistributor() { * * @return The label record. */ - public PieLabelRecord getPieLabelRecord(/*@NonNegative*/ int index) { + public PieLabelRecord getPieLabelRecord(@NonNegative int index) { return (PieLabelRecord) this.labels.get(index); } @@ -90,7 +90,7 @@ public void addPieLabelRecord(PieLabelRecord record) { * * @return The item count. */ - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.labels.size(); } diff --git a/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java b/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java index 3f66517f2..04ec08d6e 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.geom.Point2D; @@ -123,7 +123,7 @@ public void setColumnKey(Comparable key) { * @param orientation the plot orientation. */ public void updateCrosshairPoint(Comparable rowKey, Comparable columnKey, - double value, /*@NonNegative*/ int datasetIndex, double transX, double transY, + double value, @NonNegative int datasetIndex, double transX, double transY, PlotOrientation orientation) { Point2D anchor = getAnchor(); @@ -160,7 +160,7 @@ public void updateCrosshairPoint(Comparable rowKey, Comparable columnKey, * @param orientation the plot orientation. */ public void updateCrosshairX(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int datasetIndex, double transX, PlotOrientation orientation) { + @NonNegative int datasetIndex, double transX, PlotOrientation orientation) { Point2D anchor = getAnchor(); if (anchor != null) { diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 325432d45..b53b48d4e 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -186,8 +186,8 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -329,10 +329,10 @@ public class CategoryPlot extends Plot implements ValueAxisPlot, Pannable, private RectangleInsets axisOffset; /** Storage for the domain axes. */ - private Map</*@NonNegative*/ Integer, CategoryAxis> domainAxes; + private Map<@NonNegative Integer, CategoryAxis> domainAxes; /** Storage for the domain axis locations. */ - private Map</*@NonNegative*/ Integer, AxisLocation> domainAxisLocations; + private Map<@NonNegative Integer, AxisLocation> domainAxisLocations; /** * A flag that controls whether or not the shared domain axis is drawn @@ -341,30 +341,30 @@ public class CategoryPlot extends Plot implements ValueAxisPlot, Pannable, private boolean drawSharedDomainAxis; /** Storage for the range axes. */ - private Map</*@NonNegative*/ Integer, ValueAxis> rangeAxes; + private Map<@NonNegative Integer, ValueAxis> rangeAxes; /** Storage for the range axis locations. */ - private Map</*@NonNegative*/ Integer, AxisLocation> rangeAxisLocations; + private Map<@NonNegative Integer, AxisLocation> rangeAxisLocations; /** Storage for the datasets. */ - private Map</*@NonNegative*/ Integer, CategoryDataset> datasets; + private Map<@NonNegative Integer, CategoryDataset> datasets; /** * Storage for keys that map each dataset to one or more domain axes. * Typically a dataset is rendered using the scale of a single axis, but * a dataset can contribute to the "auto-range" of any number of axes. */ - private TreeMap</*@NonNegative*/ Integer, List<Integer>> datasetToDomainAxesMap; + private TreeMap<@NonNegative Integer, List<Integer>> datasetToDomainAxesMap; /** * Storage for keys that map each dataset to one or more range axes. * Typically a dataset is rendered using the scale of a single axis, but * a dataset can contribute to the "auto-range" of any number of axes. */ - private TreeMap</*@NonNegative*/ Integer, List<Integer>> datasetToRangeAxesMap; + private TreeMap<@NonNegative Integer, List<Integer>> datasetToRangeAxesMap; /** Storage for the renderers. */ - private Map</*@NonNegative*/ Integer, CategoryItemRenderer> renderers; + private Map<@NonNegative Integer, CategoryItemRenderer> renderers; /** The dataset rendering order. */ private DatasetRenderingOrder renderingOrder @@ -518,16 +518,16 @@ public class CategoryPlot extends Plot implements ValueAxisPlot, Pannable, private boolean rangeCrosshairLockedOnData = true; /** A map containing lists of markers for the domain axes. */ - private Map</*@NonNegative*/ Integer, Collection> foregroundDomainMarkers; + private Map<@NonNegative Integer, Collection> foregroundDomainMarkers; /** A map containing lists of markers for the domain axes. */ - private Map</*@NonNegative*/ Integer, Collection> backgroundDomainMarkers; + private Map<@NonNegative Integer, Collection> backgroundDomainMarkers; /** A map containing lists of markers for the range axes. */ - private Map</*@NonNegative*/ Integer, Collection> foregroundRangeMarkers; + private Map<@NonNegative Integer, Collection> foregroundRangeMarkers; /** A map containing lists of markers for the range axes. */ - private Map</*@NonNegative*/ Integer, Collection> backgroundRangeMarkers; + private Map<@NonNegative Integer, Collection> backgroundRangeMarkers; /** * A (possibly empty) list of annotations for the plot. The list should @@ -593,22 +593,22 @@ public CategoryPlot(CategoryDataset dataset, CategoryAxis domainAxis, this.orientation = PlotOrientation.VERTICAL; // allocate storage for dataset, axes and renderers - HashMap domainAxesTmp = new HashMap</*@NonNegative*/ Integer, CategoryAxis>(); + HashMap domainAxesTmp = new HashMap<@NonNegative Integer, CategoryAxis>(); this.domainAxes = domainAxesTmp; - HashMap domainAxisLocationsTmp = new HashMap</*@NonNegative*/ Integer, AxisLocation>(); + HashMap domainAxisLocationsTmp = new HashMap<@NonNegative Integer, AxisLocation>(); this.domainAxisLocations = domainAxisLocationsTmp; - HashMap rangeAxesTmp = new HashMap</*@NonNegative*/ Integer, ValueAxis>(); + HashMap rangeAxesTmp = new HashMap<@NonNegative Integer, ValueAxis>(); this.rangeAxes = rangeAxesTmp; - HashMap rangeAxisLocationsTmp = new HashMap</*@NonNegative*/ Integer, AxisLocation>(); + HashMap rangeAxisLocationsTmp = new HashMap<@NonNegative Integer, AxisLocation>(); this.rangeAxisLocations = rangeAxisLocationsTmp; this.datasetToDomainAxesMap = new TreeMap(); this.datasetToRangeAxesMap = new TreeMap(); - HashMap renderersTmp = new HashMap</*@NonNegative*/ Integer, CategoryItemRenderer>(); + HashMap renderersTmp = new HashMap<@NonNegative Integer, CategoryItemRenderer>(); this.renderers = renderersTmp; - HashMap datasetsTmp = new HashMap</*@NonNegative*/ Integer, CategoryDataset>(); + HashMap datasetsTmp = new HashMap<@NonNegative Integer, CategoryDataset>(); this.datasets = datasetsTmp; this.datasets.put(0, dataset); if (dataset != null) { @@ -765,7 +765,7 @@ public CategoryAxis getDomainAxis() { * * @see #setDomainAxis(int, CategoryAxis) */ - public CategoryAxis getDomainAxis(/*@NonNegative*/ int index) { + public CategoryAxis getDomainAxis(@NonNegative int index) { CategoryAxis result = (CategoryAxis) this.domainAxes.get(index); if (result == null) { Plot parent = getParent(); @@ -798,7 +798,7 @@ public void setDomainAxis(CategoryAxis axis) { * * @see #getDomainAxis(int) */ - public void setDomainAxis(/*@NonNegative*/ int index, CategoryAxis axis) { + public void setDomainAxis(@NonNegative int index, CategoryAxis axis) { setDomainAxis(index, axis, true); } @@ -810,7 +810,7 @@ public void setDomainAxis(/*@NonNegative*/ int index, CategoryAxis axis) { * @param axis the axis ({@code null} permitted). * @param notify notify listeners? */ - public void setDomainAxis(/*@NonNegative*/ int index, CategoryAxis axis, boolean notify) { + public void setDomainAxis(@NonNegative int index, CategoryAxis axis, boolean notify) { CategoryAxis existing = (CategoryAxis) this.domainAxes.get(index); if (existing != null) { existing.removeChangeListener(this); @@ -856,9 +856,9 @@ public void setDomainAxes(CategoryAxis[] axes) { * * @since 1.0.3 */ - public /*@GTENegativeOne*/ int getDomainAxisIndex(CategoryAxis axis) { + public @GTENegativeOne int getDomainAxisIndex(CategoryAxis axis) { Args.nullNotPermitted(axis, "axis"); - for (Entry</*@NonNegative*/ Integer, CategoryAxis> entry : this.domainAxes.entrySet()) { + for (Entry<@NonNegative Integer, CategoryAxis> entry : this.domainAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); } @@ -886,7 +886,7 @@ public AxisLocation getDomainAxisLocation() { * * @see #setDomainAxisLocation(int, AxisLocation) */ - public AxisLocation getDomainAxisLocation(/*@NonNegative*/ int index) { + public AxisLocation getDomainAxisLocation(@NonNegative int index) { AxisLocation result = this.domainAxisLocations.get(index); if (result == null) { result = AxisLocation.getOpposite(getDomainAxisLocation(0)); @@ -930,7 +930,7 @@ public void setDomainAxisLocation(AxisLocation location, boolean notify) { * @see #getDomainAxisLocation(int) * @see #setRangeAxisLocation(int, AxisLocation) */ - public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation location) { + public void setDomainAxisLocation(@NonNegative int index, AxisLocation location) { // delegate... setDomainAxisLocation(index, location, true); } @@ -948,7 +948,7 @@ public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation locat * @see #getDomainAxisLocation(int) * @see #setRangeAxisLocation(int, AxisLocation, boolean) */ - public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation location, + public void setDomainAxisLocation(@NonNegative int index, AxisLocation location, boolean notify) { if (index == 0 && location == null) { throw new IllegalArgumentException( @@ -977,7 +977,7 @@ public RectangleEdge getDomainAxisEdge() { * * @return The edge (never {@code null}). */ - public RectangleEdge getDomainAxisEdge(/*@NonNegative*/ int index) { + public RectangleEdge getDomainAxisEdge(@NonNegative int index) { RectangleEdge result; AxisLocation location = getDomainAxisLocation(index); if (location != null) { @@ -993,7 +993,7 @@ public RectangleEdge getDomainAxisEdge(/*@NonNegative*/ int index) { * * @return The axis count. */ - public /*@NonNegative*/ int getDomainAxisCount() { + public @NonNegative int getDomainAxisCount() { return this.domainAxes.size(); } @@ -1040,7 +1040,7 @@ public ValueAxis getRangeAxis() { * * @return The axis ({@code null} possible). */ - public ValueAxis getRangeAxis(/*@NonNegative*/ int index) { + public ValueAxis getRangeAxis(@NonNegative int index) { ValueAxis result = this.rangeAxes.get(index); if (result == null) { Plot parent = getParent(); @@ -1069,7 +1069,7 @@ public void setRangeAxis(ValueAxis axis) { * @param index the axis index. * @param axis the axis. */ - public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis) { + public void setRangeAxis(@NonNegative int index, ValueAxis axis) { setRangeAxis(index, axis, true); } @@ -1081,7 +1081,7 @@ public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis) { * @param axis the axis. * @param notify notify listeners? */ - public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis, boolean notify) { + public void setRangeAxis(@NonNegative int index, ValueAxis axis, boolean notify) { ValueAxis existing = this.rangeAxes.get(index); if (existing != null) { existing.removeChangeListener(this); @@ -1127,7 +1127,7 @@ public void setRangeAxes(ValueAxis[] axes) { * * @since 1.0.7 */ - public /*@GTENegativeOne*/ int getRangeAxisIndex(ValueAxis axis) { + public @GTENegativeOne int getRangeAxisIndex(ValueAxis axis) { Args.nullNotPermitted(axis, "axis"); int result = findRangeAxisIndex(axis); if (result < 0) { // try the parent plot @@ -1140,8 +1140,8 @@ public void setRangeAxes(ValueAxis[] axes) { return result; } - private /*@GTENegativeOne*/ int findRangeAxisIndex(ValueAxis axis) { - for (Entry</*@NonNegative*/ Integer, ValueAxis> entry : this.rangeAxes.entrySet()) { + private @GTENegativeOne int findRangeAxisIndex(ValueAxis axis) { + for (Entry<@NonNegative Integer, ValueAxis> entry : this.rangeAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); } @@ -1167,7 +1167,7 @@ public AxisLocation getRangeAxisLocation() { * * @see #setRangeAxisLocation(int, AxisLocation) */ - public AxisLocation getRangeAxisLocation(/*@NonNegative*/ int index) { + public AxisLocation getRangeAxisLocation(@NonNegative int index) { AxisLocation result = this.rangeAxisLocations.get(index); if (result == null) { result = AxisLocation.getOpposite(getRangeAxisLocation(0)); @@ -1212,7 +1212,7 @@ public void setRangeAxisLocation(AxisLocation location, boolean notify) { * @see #getRangeAxisLocation(int) * @see #setRangeAxisLocation(int, AxisLocation, boolean) */ - public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation location) { + public void setRangeAxisLocation(@NonNegative int index, AxisLocation location) { setRangeAxisLocation(index, location, true); } @@ -1227,7 +1227,7 @@ public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation locati * @see #getRangeAxisLocation(int) * @see #setDomainAxisLocation(int, AxisLocation, boolean) */ - public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation location, + public void setRangeAxisLocation(@NonNegative int index, AxisLocation location, boolean notify) { if (index == 0 && location == null) { throw new IllegalArgumentException( @@ -1255,7 +1255,7 @@ public RectangleEdge getRangeAxisEdge() { * * @return The edge. */ - public RectangleEdge getRangeAxisEdge(/*@NonNegative*/ int index) { + public RectangleEdge getRangeAxisEdge(@NonNegative int index) { AxisLocation location = getRangeAxisLocation(index); return Plot.resolveRangeAxisLocation(location, this.orientation); } @@ -1265,7 +1265,7 @@ public RectangleEdge getRangeAxisEdge(/*@NonNegative*/ int index) { * * @return The axis count. */ - public /*@NonNegative*/ int getRangeAxisCount() { + public @NonNegative int getRangeAxisCount() { return this.rangeAxes.size(); } @@ -1315,7 +1315,7 @@ public CategoryDataset getDataset() { * * @see #setDataset(int, CategoryDataset) */ - public CategoryDataset getDataset(/*@NonNegative*/ int index) { + public CategoryDataset getDataset(@NonNegative int index) { return this.datasets.get(index); } @@ -1343,7 +1343,7 @@ public void setDataset(CategoryDataset dataset) { * * @see #getDataset(int) */ - public void setDataset(/*@NonNegative*/ int index, CategoryDataset dataset) { + public void setDataset(@NonNegative int index, CategoryDataset dataset) { CategoryDataset existing = (CategoryDataset) this.datasets.get(index); if (existing != null) { existing.removeChangeListener(this); @@ -1364,7 +1364,7 @@ public void setDataset(/*@NonNegative*/ int index, CategoryDataset dataset) { * * @since 1.0.2 */ - public /*@NonNegative*/ int getDatasetCount() { + public @NonNegative int getDatasetCount() { return this.datasets.size(); } @@ -1378,8 +1378,8 @@ public void setDataset(/*@NonNegative*/ int index, CategoryDataset dataset) { * * @since 1.0.11 */ - public /*@GTENegativeOne*/ int indexOf(CategoryDataset dataset) { - for (Entry</*@NonNegative*/ Integer, CategoryDataset> entry: this.datasets.entrySet()) { + public @GTENegativeOne int indexOf(CategoryDataset dataset) { + for (Entry<@NonNegative Integer, CategoryDataset> entry: this.datasets.entrySet()) { if (entry.getValue() == dataset) { return entry.getKey(); } @@ -1395,7 +1395,7 @@ public void setDataset(/*@NonNegative*/ int index, CategoryDataset dataset) { * * @see #getDomainAxisForDataset(int) */ - public void mapDatasetToDomainAxis(/*@NonNegative*/ int index, int axisIndex) { + public void mapDatasetToDomainAxis(@NonNegative int index, int axisIndex) { List<Integer> axisIndices = new java.util.ArrayList<Integer>(1); axisIndices.add(axisIndex); mapDatasetToDomainAxes(index, axisIndices); @@ -1411,7 +1411,7 @@ public void mapDatasetToDomainAxis(/*@NonNegative*/ int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToDomainAxes(/*@NonNegative*/ int index, List<Integer> axisIndices) { + public void mapDatasetToDomainAxes(@NonNegative int index, List<Integer> axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); this.datasetToDomainAxesMap.put(index, new ArrayList<Integer>(axisIndices)); @@ -1461,14 +1461,14 @@ private void checkAxisIndices(List indices) { * * @see #mapDatasetToDomainAxis(int, int) */ - public CategoryAxis getDomainAxisForDataset(/*@NonNegative*/ int index) { + public CategoryAxis getDomainAxisForDataset(@NonNegative int index) { Args.requireNonNegative(index, "index"); CategoryAxis axis; List axisIndices = (List) this.datasetToDomainAxesMap.get( new Integer(index)); if (axisIndices != null) { @SuppressWarnings("index") // the first axis in the list is used for data <--> Java2D - /*@NonNegative*/ Integer axisIndex = (Integer) axisIndices.get(0); + @NonNegative Integer axisIndex = (Integer) axisIndices.get(0); axis = getDomainAxis(axisIndex.intValue()); } else { axis = getDomainAxis(0); @@ -1484,7 +1484,7 @@ public CategoryAxis getDomainAxisForDataset(/*@NonNegative*/ int index) { * * @see #getRangeAxisForDataset(int) */ - public void mapDatasetToRangeAxis(/*@NonNegative*/ int index, int axisIndex) { + public void mapDatasetToRangeAxis(@NonNegative int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(new Integer(axisIndex)); mapDatasetToRangeAxes(index, axisIndices); @@ -1500,7 +1500,7 @@ public void mapDatasetToRangeAxis(/*@NonNegative*/ int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List<Integer> axisIndices) { + public void mapDatasetToRangeAxes(@NonNegative int index, List<Integer> axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); this.datasetToRangeAxesMap.put(index, new ArrayList<Integer>(axisIndices)); @@ -1518,14 +1518,14 @@ public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List<Integer> axis * * @see #mapDatasetToRangeAxis(int, int) */ - public ValueAxis getRangeAxisForDataset(/*@NonNegative*/ int index) { + public ValueAxis getRangeAxisForDataset(@NonNegative int index) { Args.requireNonNegative(index, "index"); ValueAxis axis; List axisIndices = (List) this.datasetToRangeAxesMap.get( new Integer(index)); if (axisIndices != null) { @SuppressWarnings("index") // the first axis in the list is used for data <--> Java2D - /*@NonNegative*/ Integer axisIndex = (Integer) axisIndices.get(0); + @NonNegative Integer axisIndex = (Integer) axisIndices.get(0); axis = getRangeAxis(axisIndex.intValue()); } else { axis = getRangeAxis(0); @@ -1540,7 +1540,7 @@ public ValueAxis getRangeAxisForDataset(/*@NonNegative*/ int index) { * * @since 1.0.11 */ - public /*@NonNegative*/ int getRendererCount() { + public @NonNegative int getRendererCount() { return this.renderers.size(); } @@ -1564,7 +1564,7 @@ public CategoryItemRenderer getRenderer() { * * @see #setRenderer(int, CategoryItemRenderer) */ - public CategoryItemRenderer getRenderer(/*@NonNegative*/ int index) { + public CategoryItemRenderer getRenderer(@NonNegative int index) { CategoryItemRenderer renderer = this.renderers.get(index); if (renderer == null) { return this.renderers.get(0); @@ -1617,7 +1617,7 @@ public void setRenderer(CategoryItemRenderer renderer, boolean notify) { * @see #getRenderer(int) * @see #setRenderer(int, CategoryItemRenderer, boolean) */ - public void setRenderer(/*@NonNegative*/ int index, CategoryItemRenderer renderer) { + public void setRenderer(@NonNegative int index, CategoryItemRenderer renderer) { setRenderer(index, renderer, true); } @@ -1633,7 +1633,7 @@ public void setRenderer(/*@NonNegative*/ int index, CategoryItemRenderer rendere * * @see #getRenderer(int) */ - public void setRenderer(/*@NonNegative*/ int index, CategoryItemRenderer renderer, + public void setRenderer(@NonNegative int index, CategoryItemRenderer renderer, boolean notify) { CategoryItemRenderer existing = this.renderers.get(index); if (existing != null) { @@ -1692,8 +1692,8 @@ public CategoryItemRenderer getRendererForDataset(CategoryDataset dataset) { * * @return The renderer index. */ - public /*@GTENegativeOne*/ int getIndexOf(CategoryItemRenderer renderer) { - for (Entry</*@NonNegative*/ Integer, CategoryItemRenderer> entry + public @GTENegativeOne int getIndexOf(CategoryItemRenderer renderer) { + for (Entry<@NonNegative Integer, CategoryItemRenderer> entry : this.renderers.entrySet()) { if (entry.getValue() == renderer) { return entry.getKey(); @@ -2193,7 +2193,7 @@ public LegendItemCollection getLegendItems() { for (CategoryDataset dataset: this.datasets.values()) { if (dataset != null) { @SuppressWarnings("index") // guaranteed index: indexOf cannot return -1 here because we're looking up the indexOf an element we already know is in the dataset - /*@NonNegative*/ int datasetIndex = indexOf(dataset); + @NonNegative int datasetIndex = indexOf(dataset); CategoryItemRenderer renderer = getRenderer(datasetIndex); if (renderer != null) { result.addAll(renderer.getLegendItems()); @@ -2365,7 +2365,7 @@ public void addDomainMarker(CategoryMarker marker, Layer layer) { * * @see #removeDomainMarker(int, Marker, Layer) */ - public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, Layer layer) { + public void addDomainMarker(@NonNegative int index, CategoryMarker marker, Layer layer) { addDomainMarker(index, marker, layer, true); } @@ -2385,7 +2385,7 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L * * @see #removeDomainMarker(int, Marker, Layer, boolean) */ - public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, Layer layer, + public void addDomainMarker(@NonNegative int index, CategoryMarker marker, Layer layer, boolean notify) { Args.nullNotPermitted(marker, "marker"); Args.nullNotPermitted(layer, "layer"); @@ -2395,7 +2395,7 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - /*@NonNegative*/ Integer i = index; + @NonNegative Integer i = index; this.foregroundDomainMarkers.put(i, markers); } markers.add(marker); @@ -2404,7 +2404,7 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - /*@NonNegative*/ Integer i = index; + @NonNegative Integer i = index; this.backgroundDomainMarkers.put(i, markers); } markers.add(marker); @@ -2424,22 +2424,22 @@ public void addDomainMarker(/*@NonNegative*/ int index, CategoryMarker marker, L public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - Set</*@NonNegative*/ Integer> keys = this.backgroundDomainMarkers.keySet(); + Set<@NonNegative Integer> keys = this.backgroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? - /*@NonNegative*/ Integer key = (Integer) iterator.next(); + @NonNegative Integer key = (Integer) iterator.next(); clearDomainMarkers(key.intValue()); } this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { - Set</*@NonNegative*/ Integer> keys = this.foregroundDomainMarkers.keySet(); + Set<@NonNegative Integer> keys = this.foregroundDomainMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? - /*@NonNegative*/ Integer key = (Integer) iterator.next(); + @NonNegative Integer key = (Integer) iterator.next(); clearDomainMarkers(key.intValue()); } this.foregroundDomainMarkers.clear(); @@ -2467,7 +2467,7 @@ public Collection getDomainMarkers(Layer layer) { * * @return A collection of markers (possibly {@code null}). */ - public Collection getDomainMarkers(/*@NonNegative*/ int index, Layer layer) { + public Collection getDomainMarkers(@NonNegative int index, Layer layer) { Collection result = null; Integer key = new Integer(index); if (layer == Layer.FOREGROUND) { @@ -2489,7 +2489,7 @@ else if (layer == Layer.BACKGROUND) { * * @see #clearRangeMarkers(int) */ - public void clearDomainMarkers(/*@NonNegative*/ int index) { + public void clearDomainMarkers(@NonNegative int index) { Integer key = new Integer(index); if (this.backgroundDomainMarkers != null) { Collection markers @@ -2562,7 +2562,7 @@ public boolean removeDomainMarker(Marker marker, Layer layer) { * * @since 1.0.7 */ - public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { + public boolean removeDomainMarker(@NonNegative int index, Marker marker, Layer layer) { return removeDomainMarker(index, marker, layer, true); } @@ -2580,7 +2580,7 @@ public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Lay * * @since 1.0.10 */ - public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, + public boolean removeDomainMarker(@NonNegative int index, Marker marker, Layer layer, boolean notify) { ArrayList markers; if (layer == Layer.FOREGROUND) { @@ -2643,7 +2643,7 @@ public void addRangeMarker(Marker marker, Layer layer) { * * @see #removeRangeMarker(int, Marker, Layer) */ - public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { + public void addRangeMarker(@NonNegative int index, Marker marker, Layer layer) { addRangeMarker(index, marker, layer, true); } @@ -2663,7 +2663,7 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye * * @see #removeRangeMarker(int, Marker, Layer, boolean) */ - public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, + public void addRangeMarker(@NonNegative int index, Marker marker, Layer layer, boolean notify) { Collection markers; if (layer == Layer.FOREGROUND) { @@ -2671,7 +2671,7 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - /*@NonNegative*/ Integer i = index; + @NonNegative Integer i = index; this.foregroundRangeMarkers.put(i, markers); } markers.add(marker); @@ -2680,7 +2680,7 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - /*@NonNegative*/ Integer i = index; + @NonNegative Integer i = index; this.backgroundRangeMarkers.put(i, markers); } markers.add(marker); @@ -2700,22 +2700,22 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - Set</*@NonNegative*/ Integer> keys = this.backgroundRangeMarkers.keySet(); + Set<@NonNegative Integer> keys = this.backgroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? - /*@NonNegative*/ Integer key = (Integer) iterator.next(); + @NonNegative Integer key = (Integer) iterator.next(); clearRangeMarkers(key.intValue()); } this.backgroundRangeMarkers.clear(); } if (this.foregroundRangeMarkers != null) { - Set</*@NonNegative*/ Integer> keys = this.foregroundRangeMarkers.keySet(); + Set<@NonNegative Integer> keys = this.foregroundRangeMarkers.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? - /*@NonNegative*/ Integer key = (Integer) iterator.next(); + @NonNegative Integer key = (Integer) iterator.next(); clearRangeMarkers(key.intValue()); } this.foregroundRangeMarkers.clear(); @@ -2745,7 +2745,7 @@ public Collection getRangeMarkers(Layer layer) { * * @return A collection of markers (possibly {@code null}). */ - public Collection getRangeMarkers(/*@NonNegative*/ int index, Layer layer) { + public Collection getRangeMarkers(@NonNegative int index, Layer layer) { Collection result = null; Integer key = new Integer(index); if (layer == Layer.FOREGROUND) { @@ -2767,7 +2767,7 @@ else if (layer == Layer.BACKGROUND) { * * @see #clearDomainMarkers(int) */ - public void clearRangeMarkers(/*@NonNegative*/ int index) { + public void clearRangeMarkers(@NonNegative int index) { Integer key = new Integer(index); if (this.backgroundRangeMarkers != null) { Collection markers @@ -2846,7 +2846,7 @@ public boolean removeRangeMarker(Marker marker, Layer layer) { * * @see #addRangeMarker(int, Marker, Layer) */ - public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { + public boolean removeRangeMarker(@NonNegative int index, Marker marker, Layer layer) { return removeRangeMarker(index, marker, layer, true); } @@ -2866,7 +2866,7 @@ public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Laye * * @see #addRangeMarker(int, Marker, Layer, boolean) */ - public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, + public boolean removeRangeMarker(@NonNegative int index, Marker marker, Layer layer, boolean notify) { Args.nullNotPermitted(marker, "marker"); ArrayList markers; @@ -3017,7 +3017,7 @@ public int getCrosshairDatasetIndex() { * * @since 1.0.11 */ - public void setCrosshairDatasetIndex(/*@NonNegative*/ int index) { + public void setCrosshairDatasetIndex(@NonNegative int index) { setCrosshairDatasetIndex(index, true); } @@ -3030,7 +3030,7 @@ public void setCrosshairDatasetIndex(/*@NonNegative*/ int index) { * * @since 1.0.11 */ - public void setCrosshairDatasetIndex(/*@NonNegative*/ int index, boolean notify) { + public void setCrosshairDatasetIndex(@NonNegative int index, boolean notify) { this.crosshairDatasetIndex = index; if (notify) { fireChangeEvent(); @@ -3405,7 +3405,7 @@ protected AxisSpace calculateDomainAxisSpace(Graphics2D g2, for (CategoryAxis xAxis : this.domainAxes.values()) { if (xAxis != null) { @SuppressWarnings("index") // guaranteed index: xAxis is guaranteed to be in the set, so IndexOf returns NN - /*@NonNegative*/ int i = getDomainAxisIndex(xAxis); + @NonNegative int i = getDomainAxisIndex(xAxis); RectangleEdge edge = getDomainAxisEdge(i); space = xAxis.reserveSpace(g2, this, plotArea, edge, space); } @@ -3450,7 +3450,7 @@ protected AxisSpace calculateRangeAxisSpace(Graphics2D g2, for (ValueAxis yAxis : this.rangeAxes.values()) { if (yAxis != null) { @SuppressWarnings("index") // guaranteed index: yAxis is guaranteed to be in the set, so indexOf returns NN - /*@NonNegative*/ int i = findRangeAxisIndex(yAxis); + @NonNegative int i = findRangeAxisIndex(yAxis); RectangleEdge edge = getRangeAxisEdge(i); space = yAxis.reserveSpace(g2, this, plotArea, edge, space); } @@ -3619,12 +3619,12 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw the markers... for (CategoryItemRenderer renderer : this.renderers.values()) { @SuppressWarnings("index") // guaranteed index: renderer is one of the renderers of this object, so getIndexOf must return nonnegative - /*@NonNegative*/ int i = getIndexOf(renderer); + @NonNegative int i = getIndexOf(renderer); drawDomainMarkers(g2, dataArea, i, Layer.BACKGROUND); } for (CategoryItemRenderer renderer : this.renderers.values()) { @SuppressWarnings("index") // guaranteed index: renderer is one of the renderers of this object, so getIndexOf must return nonnegative - /*@NonNegative*/ int i = getIndexOf(renderer); + @NonNegative int i = getIndexOf(renderer); drawRangeMarkers(g2, dataArea, i, Layer.BACKGROUND); } @@ -3637,14 +3637,14 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, AlphaComposite.SRC_OVER, getForegroundAlpha())); DatasetRenderingOrder order = getDatasetRenderingOrder(); - List</*@NonNegative*/ Integer> datasetIndices = getDatasetIndices(order); + List<@NonNegative Integer> datasetIndices = getDatasetIndices(order); for (int i : datasetIndices) { foundData = render(g2, dataArea, i, state, crosshairState) || foundData; } // draw the foreground markers... - List</*@NonNegative*/ Integer> rendererIndices = getRendererIndices(order); + List<@NonNegative Integer> rendererIndices = getRendererIndices(order); for (int i : rendererIndices) { drawDomainMarkers(g2, dataArea, i, Layer.FOREGROUND); } @@ -3729,9 +3729,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ - private List</*@NonNegative*/ Integer> getDatasetIndices(DatasetRenderingOrder order) { - List</*@NonNegative*/ /*@UnknownVal*/ Integer> result = new ArrayList</*@NonNegative*/ Integer>(); - for (Map.Entry</*@NonNegative*/ Integer, CategoryDataset> entry : + private List<@NonNegative Integer> getDatasetIndices(DatasetRenderingOrder order) { + List<@NonNegative Integer> result = new ArrayList<@NonNegative Integer>(); + for (Map.Entry<@NonNegative Integer, CategoryDataset> entry : this.datasets.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -3752,9 +3752,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return A list of indices. */ - private List</*@NonNegative*/ Integer> getRendererIndices(DatasetRenderingOrder order) { - List</*@NonNegative*/ /*@UnknownVal*/ Integer> result = new ArrayList</*@NonNegative*/ Integer>(); - for (Map.Entry</*@NonNegative*/ Integer, CategoryItemRenderer> entry: + private List<@NonNegative Integer> getRendererIndices(DatasetRenderingOrder order) { + List<@NonNegative Integer> result = new ArrayList<@NonNegative Integer>(); + for (Map.Entry<@NonNegative Integer, CategoryItemRenderer> entry: this.renderers.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); @@ -3803,7 +3803,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, for (CategoryAxis xAxis : this.domainAxes.values()) { if (xAxis != null) { @SuppressWarnings("index") // guaranteed index: xAxis is guaranteed to have an index, so getDomainAxisIndex return NN - /*@NonNegative*/ int index = getDomainAxisIndex(xAxis); + @NonNegative int index = getDomainAxisIndex(xAxis); axisCollection.add(xAxis, getDomainAxisEdge(index)); } } @@ -3812,7 +3812,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, for (ValueAxis yAxis : this.rangeAxes.values()) { if (yAxis != null) { @SuppressWarnings("index") // guaranteed index: yAxis is guaranteed to have an index, so getRangeAxisIndex return NN - /*@NonNegative*/ int index = findRangeAxisIndex(yAxis); + @NonNegative int index = findRangeAxisIndex(yAxis); axisCollection.add(yAxis, getRangeAxisEdge(index)); } } @@ -3894,7 +3894,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, * * @since 1.0.11 */ - public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int index, + public boolean render(Graphics2D g2, Rectangle2D dataArea, @NonNegative int index, PlotRenderingInfo info, CategoryCrosshairState crosshairState) { boolean foundData = false; @@ -4092,7 +4092,7 @@ protected void drawAnnotations(Graphics2D g2, Rectangle2D dataArea) { * @see #drawRangeMarkers(Graphics2D, Rectangle2D, int, Layer) */ protected void drawDomainMarkers(Graphics2D g2, Rectangle2D dataArea, - /*@NonNegative*/ int index, Layer layer) { + @NonNegative int index, Layer layer) { CategoryItemRenderer r = getRenderer(index); if (r == null) { @@ -4123,7 +4123,7 @@ protected void drawDomainMarkers(Graphics2D g2, Rectangle2D dataArea, * @see #drawDomainMarkers(Graphics2D, Rectangle2D, int, Layer) */ protected void drawRangeMarkers(Graphics2D g2, Rectangle2D dataArea, - /*@NonNegative*/ int index, Layer layer) { + @NonNegative int index, Layer layer) { CategoryItemRenderer r = getRenderer(index); if (r == null) { @@ -4190,7 +4190,7 @@ else if (this.orientation == PlotOrientation.VERTICAL) { * @since 1.0.11 */ protected void drawDomainCrosshair(Graphics2D g2, Rectangle2D dataArea, - PlotOrientation orientation, /*@NonNegative*/ int datasetIndex, + PlotOrientation orientation, @NonNegative int datasetIndex, Comparable rowKey, Comparable columnKey, Stroke stroke, Paint paint) { @@ -5009,16 +5009,16 @@ public Object clone() throws CloneNotSupportedException { // AxisLocation is immutable, so we can just copy the maps - HashMap clonedomainAxisLocations = new HashMap</*@NonNegative*/ Integer, AxisLocation>( + HashMap clonedomainAxisLocations = new HashMap<@NonNegative Integer, AxisLocation>( this.domainAxisLocations); clone.domainAxisLocations = clonedomainAxisLocations; - HashMap clonerangeAxisLocations = new HashMap</*@NonNegative*/ Integer, AxisLocation>( + HashMap clonerangeAxisLocations = new HashMap<@NonNegative Integer, AxisLocation>( this.rangeAxisLocations); clone.rangeAxisLocations = clonerangeAxisLocations; - HashMap clonedatasets = new HashMap</*@NonNegative*/ Integer, CategoryDataset>(this.datasets); + HashMap clonedatasets = new HashMap<@NonNegative Integer, CategoryDataset>(this.datasets); clone.datasets = clonedatasets; for (CategoryDataset dataset : clone.datasets.values()) { if (dataset != null) { diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 944582aa3..714f1ed93 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -67,13 +67,13 @@ package org.jfree.chart.plot; -/*>>> + import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.SameLen; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.index.qual.LTLengthOf; import org.checkerframework.checker.index.qual.IndexFor; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -171,11 +171,11 @@ public class CompassPlot extends Plot implements Cloneable, Serializable { /** An array of value datasets. */ @SuppressWarnings("index") // synced update: this.datasets and this.seriesNeedle are always updated in tandem - private ValueDataset /*@MinLen(1)*/ /*@SameLen("this.seriesNeedle")*/ [] datasets = new ValueDataset[1]; + private ValueDataset @MinLen(1) @SameLen("this.seriesNeedle") [] datasets = new ValueDataset[1]; /** An array of needles. */ @SuppressWarnings("index") // synced update: this.datasets and this.seriesNeedle are always updated in tandem - private MeterNeedle /*@MinLen(1)*/ /*@SameLen("this.datasets")*/ [] seriesNeedle = new MeterNeedle[1]; + private MeterNeedle @MinLen(1) @SameLen("this.datasets") [] seriesNeedle = new MeterNeedle[1]; /** The resourceBundle for the localization. */ protected static ResourceBundle localizationResources @@ -379,7 +379,7 @@ public void setDrawBorder(boolean status) { * * @see #setSeriesOutlinePaint(int, Paint) */ - public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint) { + public void setSeriesPaint(@NonNegative int series, Paint paint) { // super.setSeriesPaint(series, paint); if ((series >= 0) && (series < this.seriesNeedle.length)) { this.seriesNeedle[series].setFillPaint(paint); @@ -394,7 +394,7 @@ public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint) { * * @see #setSeriesPaint(int, Paint) */ - public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint p) { + public void setSeriesOutlinePaint(@NonNegative int series, Paint p) { if ((series >= 0) && (series < this.seriesNeedle.length)) { this.seriesNeedle[series].setOutlinePaint(p); @@ -410,7 +410,7 @@ public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint p) { * * @see #setSeriesOutlinePaint(int, Paint) */ - public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke) { + public void setSeriesOutlineStroke(@NonNegative int series, Stroke stroke) { if ((series >= 0) && (series < this.seriesNeedle.length)) { this.seriesNeedle[series].setOutlineStroke(stroke); @@ -448,7 +448,7 @@ public void setSeriesNeedle(int type) { * * @see #setSeriesNeedle(int) */ - public void setSeriesNeedle(/*@NonNegative*/ int index, int type) { + public void setSeriesNeedle(@NonNegative int index, int type) { switch (type) { case 0: setSeriesNeedle(index, new ArrowNeedle(true)); @@ -503,7 +503,7 @@ public void setSeriesNeedle(/*@NonNegative*/ int index, int type) { * @param index the series index. * @param needle the needle. */ - public void setSeriesNeedle(/*@NonNegative*/ int index, MeterNeedle needle) { + public void setSeriesNeedle(@NonNegative int index, MeterNeedle needle) { if ((needle != null) && (index < this.seriesNeedle.length)) { this.seriesNeedle[index] = needle; } @@ -551,7 +551,7 @@ public void addDataset(ValueDataset dataset, MeterNeedle needle) { } @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: arrays have correlated but non-equal length - /*@LTLengthOf(value = {"t", "p", "p", "this.datasets"}, offset = {"0", "0", "-1", "-1"})*/ int newI = this.datasets.length; + @LTLengthOf(value = {"t", "p", "p", "this.datasets"}, offset = {"0", "0", "-1", "-1"}) int newI = this.datasets.length; i = newI; t[i] = dataset; p[i] = ((needle != null) ? needle : p[i - 1]); @@ -560,10 +560,10 @@ public void addDataset(ValueDataset dataset, MeterNeedle needle) { MeterNeedle[] b = this.seriesNeedle; @SuppressWarnings({"index", "value"}) // synced update: these two values are being changed together, but they go out of sync as the change occurs - ValueDataset /*@MinLen(1)*/ /*@SameLen("this.seriesNeedle")*/ [] t0 = t; + ValueDataset @MinLen(1) @SameLen("this.seriesNeedle") [] t0 = t; @SuppressWarnings({"index", "value"}) // synced update: these two values are being changed together, but they go out of sync as the change occurs - MeterNeedle /*@MinLen(1)*/ /*@SameLen("this.datasets")*/ [] p0 = p; + MeterNeedle @MinLen(1) @SameLen("this.datasets") [] p0 = p; this.datasets = t0; this.seriesNeedle = p0; diff --git a/src/main/java/org/jfree/chart/plot/CrosshairState.java b/src/main/java/org/jfree/chart/plot/CrosshairState.java index ab31c39bd..e5c6da030 100644 --- a/src/main/java/org/jfree/chart/plot/CrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CrosshairState.java @@ -52,7 +52,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.geom.Point2D; @@ -90,7 +90,7 @@ public class CrosshairState { * * @since 1.0.11 */ - private /*@NonNegative*/ int datasetIndex; + private @NonNegative int datasetIndex; /** * The smallest distance (so far) between the anchor point and a data @@ -157,7 +157,7 @@ public void setCrosshairDistance(double distance) { * @param transY the y-value in Java2D space. * @param orientation the plot orientation ({@code null} not permitted). */ - public void updateCrosshairPoint(double x, double y, /*@NonNegative*/ int datasetIndex, + public void updateCrosshairPoint(double x, double y, @NonNegative int datasetIndex, double transX, double transY, PlotOrientation orientation) { if (this.anchor != null) { @@ -199,7 +199,7 @@ public void updateCrosshairPoint(double x, double y, /*@NonNegative*/ int datase * * @since 1.0.20 */ - public void updateCrosshairX(double x, double transX, /*@NonNegative*/ int datasetIndex) { + public void updateCrosshairX(double x, double transX, @NonNegative int datasetIndex) { if (this.anchor == null) { return; } @@ -224,7 +224,7 @@ public void updateCrosshairX(double x, double transX, /*@NonNegative*/ int datas * * @since 1.0.20 */ - public void updateCrosshairY(double candidateY, double transY, /*@NonNegative*/ int datasetIndex) { + public void updateCrosshairY(double candidateY, double transY, @NonNegative int datasetIndex) { if (this.anchor == null) { return; } @@ -378,7 +378,7 @@ public void setCrosshairY(double y) { * * @since 1.0.11 */ - public /*@NonNegative*/ int getDatasetIndex() { + public @NonNegative int getDatasetIndex() { return this.datasetIndex; } @@ -391,7 +391,7 @@ public void setCrosshairY(double y) { * * @since 1.0.11 */ - public void setDatasetIndex(/*@NonNegative*/ int index) { + public void setDatasetIndex(@NonNegative int index) { this.datasetIndex = index; } } diff --git a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java index 531703465..28e6920d5 100644 --- a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java +++ b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java @@ -48,10 +48,10 @@ package org.jfree.chart.plot; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.index.qual.IndexFor; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -113,37 +113,37 @@ public class DefaultDrawingSupplier implements DrawingSupplier, Cloneable, private transient Paint[] paintSequence; /** The current paint index. */ - private /*@NonNegative*/ int paintIndex; + private @NonNegative int paintIndex; /** The outline paint sequence. */ private transient Paint[] outlinePaintSequence; /** The current outline paint index. */ - private /*@NonNegative*/ int outlinePaintIndex; + private @NonNegative int outlinePaintIndex; /** The fill paint sequence. */ private transient Paint[] fillPaintSequence; /** The current fill paint index. */ - private /*@NonNegative*/ int fillPaintIndex; + private @NonNegative int fillPaintIndex; /** The stroke sequence. */ private transient Stroke[] strokeSequence; /** The current stroke index. */ - private /*@NonNegative*/ int strokeIndex; + private @NonNegative int strokeIndex; /** The outline stroke sequence. */ private transient Stroke[] outlineStrokeSequence; /** The current outline stroke index. */ - private /*@NonNegative*/ int outlineStrokeIndex; + private @NonNegative int outlineStrokeIndex; /** The shape sequence. */ private transient Shape[] shapeSequence; /** The current shape index. */ - private /*@NonNegative*/ int shapeIndex; + private @NonNegative int shapeIndex; /** * Creates a new supplier, with default sequences for fill paint, outline diff --git a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java index 1b6f712f6..43d340154 100644 --- a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java +++ b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java @@ -68,11 +68,11 @@ package org.jfree.chart.plot; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.checker.index.qual.SameLen; import org.checkerframework.checker.index.qual.PolySameLen; -*/ + import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -128,7 +128,7 @@ public class FastScatterPlot extends Plot implements ValueAxisPlot, Pannable, public static final Paint DEFAULT_GRIDLINE_PAINT = Color.lightGray; /** The data. */ - private float /*@ArrayLen(2)*/ [] /*@SameLen({"this.data[0]", "this.data[1]"})*/ [] data; + private float @ArrayLen(2) [] @SameLen({"this.data[0]", "this.data[1]"}) [] data; /** The x data range. */ private Range xDataRange; @@ -201,7 +201,7 @@ public FastScatterPlot() { * @param domainAxis the domain (x) axis ({@code null} not permitted). * @param rangeAxis the range (y) axis ({@code null} not permitted). */ - public FastScatterPlot(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0]", "data[1]"})*/ [] data, + public FastScatterPlot(float @ArrayLen(2) [] @SameLen({"data[0]", "data[1]"}) [] data, ValueAxis domainAxis, ValueAxis rangeAxis) { super(); @@ -258,7 +258,7 @@ public float[][] getData() { * * @see #getData() */ - public void setData(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0]", "data[1]"})*/ [] data) { + public void setData(float @ArrayLen(2) [] @SameLen({"data[0]", "data[1]"}) [] data) { this.data = data; fireChangeEvent(); } @@ -707,7 +707,7 @@ else if (axis == this.rangeAxis) { * * @return The range. */ - private Range calculateXDataRange(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0]", "data[1]"})*/ [] data) { + private Range calculateXDataRange(float @ArrayLen(2) [] @SameLen({"data[0]", "data[1]"}) [] data) { Range result = null; @@ -739,7 +739,7 @@ private Range calculateXDataRange(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0] * * @return The range. */ - private Range calculateYDataRange(float /*@ArrayLen(2)*/ [] /*@SameLen({"data[0]", "data[1]"})*/ [] data) { + private Range calculateYDataRange(float @ArrayLen(2) [] @SameLen({"data[0]", "data[1]"}) [] data) { Range result = null; if (data != null) { diff --git a/src/main/java/org/jfree/chart/plot/PiePlot.java b/src/main/java/org/jfree/chart/plot/PiePlot.java index 3e2a69c09..d2040928b 100644 --- a/src/main/java/org/jfree/chart/plot/PiePlot.java +++ b/src/main/java/org/jfree/chart/plot/PiePlot.java @@ -174,7 +174,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -303,7 +303,7 @@ public class PiePlot extends Plot implements Cloneable, Serializable { private PieDataset dataset; /** The pie index (used by the {@link MultiplePiePlot} class). */ - private /*@NonNegative*/ int pieIndex; + private @NonNegative int pieIndex; /** * The amount of space left around the outside of the pie plot, expressed @@ -662,7 +662,7 @@ public void setDataset(PieDataset dataset) { * * @see #setPieIndex(int) */ - public /*@NonNegative*/ int getPieIndex() { + public @NonNegative int getPieIndex() { return this.pieIndex; } @@ -674,7 +674,7 @@ public void setDataset(PieDataset dataset) { * * @see #getPieIndex() */ - public void setPieIndex(/*@NonNegative*/ int index) { + public void setPieIndex(@NonNegative int index) { this.pieIndex = index; } @@ -2539,7 +2539,7 @@ protected void drawPie(Graphics2D g2, Rectangle2D plotArea, * @param state state information for one chart. * @param currentPass the current pass index. */ - protected void drawItem(Graphics2D g2, /*@NonNegative*/ int section, Rectangle2D dataArea, + protected void drawItem(Graphics2D g2, @NonNegative int section, Rectangle2D dataArea, PiePlotState state, int currentPass) { Number n = this.dataset.getValue(section); @@ -2967,7 +2967,7 @@ public LegendItemCollection getLegendItems() { new Line2D.Float(), new BasicStroke(), Color.BLACK); item.setDataset(getDataset()); @SuppressWarnings("index") // guaranteed index: key came from the list of keys for this dataset, so getIndex has to return non-negative - /*@NonNegative*/ int newSeriesIndex = this.dataset.getIndex(key); + @NonNegative int newSeriesIndex = this.dataset.getIndex(key); item.setSeriesIndex(newSeriesIndex); item.setSeriesKey(key); result.add(item); diff --git a/src/main/java/org/jfree/chart/plot/Plot.java b/src/main/java/org/jfree/chart/plot/Plot.java index af76cce65..0687eca7f 100644 --- a/src/main/java/org/jfree/chart/plot/Plot.java +++ b/src/main/java/org/jfree/chart/plot/Plot.java @@ -135,9 +135,9 @@ package org.jfree.chart.plot; -/*>>> + import org.checkerframework.dataflow.qual.Pure; - */ + import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -1490,7 +1490,7 @@ private void readObject(ObjectInputStream stream) * * @return The edge (never {@code null}). */ - /*@Pure*/ + @Pure public static RectangleEdge resolveDomainAxisLocation( AxisLocation location, PlotOrientation orientation) { diff --git a/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java b/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java index 07f667ac2..07d35c8a0 100644 --- a/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java +++ b/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java @@ -45,8 +45,8 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; @@ -178,7 +178,7 @@ public void addSubplotInfo(PlotRenderingInfo info) { * * @see #addSubplotInfo(PlotRenderingInfo) */ - public PlotRenderingInfo getSubplotInfo(/*@NonNegative*/ int index) { + public PlotRenderingInfo getSubplotInfo(@NonNegative int index) { return (PlotRenderingInfo) this.subplotInfo.get(index); } @@ -194,7 +194,7 @@ public PlotRenderingInfo getSubplotInfo(/*@NonNegative*/ int index) { * * @return The subplot index (or -1 if no subplot contains {@code source}). */ - public /*@GTENegativeOne*/ int getSubplotIndex(Point2D source) { + public @GTENegativeOne int getSubplotIndex(Point2D source) { Args.nullNotPermitted(source, "source"); int subplotCount = getSubplotCount(); for (int i = 0; i < subplotCount; i++) { diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index fc9ce7898..7c6accf3f 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -61,11 +61,11 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -359,7 +359,7 @@ public ValueAxis getAxis() { * * @since 1.0.14 */ - public ValueAxis getAxis(/*@NonNegative*/ int index) { + public ValueAxis getAxis(@NonNegative int index) { ValueAxis result = null; if (index < this.axes.size()) { result = (ValueAxis) this.axes.get(index); @@ -388,7 +388,7 @@ public void setAxis(ValueAxis axis) { * * @since 1.0.14 */ - public void setAxis(/*@NonNegative*/ int index, ValueAxis axis) { + public void setAxis(@NonNegative int index, ValueAxis axis) { setAxis(index, axis, true); } @@ -404,7 +404,7 @@ public void setAxis(/*@NonNegative*/ int index, ValueAxis axis) { * * @since 1.0.14 */ - public void setAxis(/*@NonNegative*/ int index, ValueAxis axis, boolean notify) { + public void setAxis(@NonNegative int index, ValueAxis axis, boolean notify) { ValueAxis existing = getAxis(index); if (existing != null) { existing.removeChangeListener(this); @@ -446,7 +446,7 @@ public PolarAxisLocation getAxisLocation() { * * @since 1.0.14 */ - public PolarAxisLocation getAxisLocation(/*@NonNegative*/ int index) { + public PolarAxisLocation getAxisLocation(@NonNegative int index) { PolarAxisLocation result = null; if (index < this.axisLocations.size()) { result = (PolarAxisLocation) this.axisLocations.get(index); @@ -496,7 +496,7 @@ public void setAxisLocation(PolarAxisLocation location, boolean notify) { * * @since 1.0.14 */ - public void setAxisLocation(/*@NonNegative*/ int index, PolarAxisLocation location) { + public void setAxisLocation(@NonNegative int index, PolarAxisLocation location) { // delegate... setAxisLocation(index, location, true); } @@ -511,7 +511,7 @@ public void setAxisLocation(/*@NonNegative*/ int index, PolarAxisLocation locati * * @since 1.0.14 */ - public void setAxisLocation(/*@NonNegative*/ int index, PolarAxisLocation location, + public void setAxisLocation(@NonNegative int index, PolarAxisLocation location, boolean notify) { Args.nullNotPermitted(location, "location"); this.axisLocations.set(index, location); @@ -553,7 +553,7 @@ public XYDataset getDataset() { * * @since 1.0.14 */ - public XYDataset getDataset(/*@NonNegative*/ int index) { + public XYDataset getDataset(@NonNegative int index) { XYDataset result = null; if (index < this.datasets.size()) { result = (XYDataset) this.datasets.get(index); @@ -586,7 +586,7 @@ public void setDataset(XYDataset dataset) { * * @since 1.0.14 */ - public void setDataset(/*@NonNegative*/ int index, XYDataset dataset) { + public void setDataset(@NonNegative int index, XYDataset dataset) { XYDataset existing = getDataset(index); if (existing != null) { existing.removeChangeListener(this); @@ -622,7 +622,7 @@ public int getDatasetCount() { * * @since 1.0.14 */ - public /*@GTENegativeOne*/ int indexOf(XYDataset dataset) { + public @GTENegativeOne int indexOf(XYDataset dataset) { int result = -1; for (int i = 0; i < this.datasets.size(); i++) { if (dataset == this.datasets.get(i)) { @@ -655,7 +655,7 @@ public PolarItemRenderer getRenderer() { * * @since 1.0.14 */ - public PolarItemRenderer getRenderer(/*@NonNegative*/ int index) { + public PolarItemRenderer getRenderer(@NonNegative int index) { PolarItemRenderer result = null; if (index < this.renderers.size()) { result = (PolarItemRenderer) this.renderers.get(index); @@ -687,7 +687,7 @@ public void setRenderer(PolarItemRenderer renderer) { * * @since 1.0.14 */ - public void setRenderer(/*@NonNegative*/ int index, PolarItemRenderer renderer) { + public void setRenderer(@NonNegative int index, PolarItemRenderer renderer) { setRenderer(index, renderer, true); } @@ -703,7 +703,7 @@ public void setRenderer(/*@NonNegative*/ int index, PolarItemRenderer renderer) * * @since 1.0.14 */ - public void setRenderer(/*@NonNegative*/ int index, PolarItemRenderer renderer, + public void setRenderer(@NonNegative int index, PolarItemRenderer renderer, boolean notify) { PolarItemRenderer existing = getRenderer(index); if (existing != null) { @@ -1235,7 +1235,7 @@ else if (normalizedAngle > 270.0 && normalizedAngle < 360.0) { * * @since 1.0.14 */ - public void mapDatasetToAxis(/*@NonNegative*/ int index, int axisIndex) { + public void mapDatasetToAxis(@NonNegative int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(new Integer(axisIndex)); mapDatasetToAxes(index, axisIndices); @@ -1251,7 +1251,7 @@ public void mapDatasetToAxis(/*@NonNegative*/ int index, int axisIndex) { * * @since 1.0.14 */ - public void mapDatasetToAxes(/*@NonNegative*/ int index, List axisIndices) { + public void mapDatasetToAxes(@NonNegative int index, List axisIndices) { if (index < 0) { throw new IllegalArgumentException("Requires 'index' >= 0."); } @@ -1302,14 +1302,14 @@ private void checkAxisIndices(List indices) { * * @since 1.0.14 */ - public ValueAxis getAxisForDataset(/*@NonNegative*/ int index) { + public ValueAxis getAxisForDataset(@NonNegative int index) { ValueAxis valueAxis; List axisIndices = (List) this.datasetToAxesMap.get( new Integer(index)); if (axisIndices != null) { // the first axis in the list is used for data <--> Java2D @SuppressWarnings("index") // guaranteed index: axesIndices[0] is always NN - /*@NonNegative*/ int axisIndex = ((Integer) axisIndices.get(0)).intValue(); + @NonNegative int axisIndex = ((Integer) axisIndices.get(0)).intValue(); valueAxis = getAxis(axisIndex); } else { diff --git a/src/main/java/org/jfree/chart/plot/RingPlot.java b/src/main/java/org/jfree/chart/plot/RingPlot.java index b88c4e051..366fa6ee3 100644 --- a/src/main/java/org/jfree/chart/plot/RingPlot.java +++ b/src/main/java/org/jfree/chart/plot/RingPlot.java @@ -52,7 +52,7 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; import java.awt.Color; @@ -500,7 +500,7 @@ public PiePlotState initialise(Graphics2D g2, Rectangle2D plotArea, * @param currentPass the current pass index. */ @Override - protected void drawItem(Graphics2D g2, /*@NonNegative*/ int section, Rectangle2D dataArea, + protected void drawItem(Graphics2D g2, @NonNegative int section, Rectangle2D dataArea, PiePlotState state, int currentPass) { PieDataset dataset = getDataset(); diff --git a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java index d23762caf..404d6b99c 100644 --- a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java +++ b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java @@ -71,9 +71,9 @@ package org.jfree.chart.plot; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -681,7 +681,7 @@ public void setSeriesPaint(Paint paint) { * * @see #setSeriesPaint(int, Paint) */ - public Paint getSeriesPaint(/*@NonNegative*/ int series) { + public Paint getSeriesPaint(@NonNegative int series) { // return the override, if there is one... if (this.seriesPaint != null) { @@ -714,7 +714,7 @@ public Paint getSeriesPaint(/*@NonNegative*/ int series) { * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint) { + public void setSeriesPaint(@NonNegative int series, Paint paint) { this.seriesPaintList.setPaint(series, paint); fireChangeEvent(); } @@ -774,7 +774,7 @@ public void setSeriesOutlinePaint(Paint paint) { * * @return The paint (never {@code null}). */ - public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series) { + public Paint getSeriesOutlinePaint(@NonNegative int series) { // return the override, if there is one... if (this.seriesOutlinePaint != null) { return this.seriesOutlinePaint; @@ -794,7 +794,7 @@ public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series) { * @param series the series index (zero-based). * @param paint the paint ({@code null} permitted). */ - public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint) { + public void setSeriesOutlinePaint(@NonNegative int series, Paint paint) { this.seriesOutlinePaintList.setPaint(series, paint); fireChangeEvent(); } @@ -850,7 +850,7 @@ public void setSeriesOutlineStroke(Stroke stroke) { * * @return The stroke (never {@code null}). */ - public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series) { + public Stroke getSeriesOutlineStroke(@NonNegative int series) { // return the override, if there is one... if (this.seriesOutlineStroke != null) { @@ -873,7 +873,7 @@ public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series) { * @param series the series index (zero-based). * @param stroke the stroke ({@code null} permitted). */ - public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke) { + public void setSeriesOutlineStroke(@NonNegative int series, Stroke stroke) { this.seriesOutlineStrokeList.setStroke(series, stroke); fireChangeEvent(); } @@ -1260,7 +1260,7 @@ protected void drawRadarPoly(Graphics2D g2, Rectangle2D plotArea, Point2D centre, PlotRenderingInfo info, - /*@NonNegative*/ int series, int catCount, + @NonNegative int series, int catCount, double headH, double headW) { Polygon polygon = new Polygon(); @@ -1383,7 +1383,7 @@ protected void drawRadarPoly(Graphics2D g2, * * @see #getDataExtractOrder() */ - protected Number getPlotValue(/*@NonNegative*/ int series, /*@NonNegative*/ int cat) { + protected Number getPlotValue(@NonNegative int series, @NonNegative int cat) { Number value = null; if (this.dataExtractOrder == TableOrder.BY_ROW) { value = this.dataset.getValue(series, cat); @@ -1405,7 +1405,7 @@ else if (this.dataExtractOrder == TableOrder.BY_COLUMN) { * @param extent the extent of the arc. */ protected void drawLabel(Graphics2D g2, Rectangle2D plotArea, double value, - /*@NonNegative*/ int cat, double startAngle, double extent) { + @NonNegative int cat, double startAngle, double extent) { FontRenderContext frc = g2.getFontRenderContext(); String label; diff --git a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java index aca932fd6..282d23738 100644 --- a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java +++ b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java @@ -93,11 +93,11 @@ package org.jfree.chart.plot; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntVal; import org.checkerframework.checker.index.qual.IndexFor; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -169,7 +169,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, public static final int UNITS_FAHRENHEIT = 1; /** A constant for unit type 'Celcius'. */ - public static final /*@IndexFor("UNITS")*/ int UNITS_CELCIUS = 2; + public static final @IndexFor("UNITS") int UNITS_CELCIUS = 2; /** A constant for unit type 'Kelvin'. */ public static final int UNITS_KELVIN = 3; @@ -199,7 +199,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, protected static final int AXIS_GAP = 10; /** The unit strings. */ - protected static final String /*@ArrayLen(4)*/ [] UNITS = {"", "\u00B0F", "\u00B0C", + protected static final String @ArrayLen(4) [] UNITS = {"", "\u00B0F", "\u00B0C", "\u00B0K"}; /** Index for low value in subrangeInfo matrix. */ @@ -286,7 +286,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, private transient Paint thermometerPaint = Color.BLACK; /** The display units */ - private /*@IndexFor("UNITS")*/ int units = UNITS_CELCIUS; + private @IndexFor("UNITS") int units = UNITS_CELCIUS; /** The value label position. */ private int valueLocation = BULB; @@ -310,10 +310,10 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, private boolean showValueLines = false; /** The display sub-range. */ - private /*@IntVal({-1,0,1,2})*/ int subrange = -1; + private @IntVal({-1,0,1,2}) int subrange = -1; /** The start and end values for the subranges. */ - private double /*@ArrayLen(3)*/ [] /*@ArrayLen(4)*/ [] subrangeInfo = { + private double @ArrayLen(3) [] @ArrayLen(4) [] subrangeInfo = { {0.0, 50.0, 0.0, 50.0}, {50.0, 75.0, 50.0, 75.0}, {75.0, 100.0, 75.0, 100.0} @@ -332,7 +332,7 @@ public class ThermometerPlot extends Plot implements ValueAxisPlot, private boolean useSubrangePaint = true; /** Paint for each range */ - private transient Paint /*@ArrayLen(3)*/ [] subrangePaint = {Color.GREEN, Color.ORANGE, + private transient Paint @ArrayLen(3) [] subrangePaint = {Color.GREEN, Color.ORANGE, Color.RED}; /** A flag that controls whether the sub-range indicators are visible. */ @@ -1367,7 +1367,7 @@ protected static boolean isValidNumber(double d) { * * @return A boolean. */ - private boolean inSubrange(/*@IndexFor("this.subrangeInfo")*/ int subrange, double value) { + private boolean inSubrange(@IndexFor("this.subrangeInfo") int subrange, double value) { return (value > this.subrangeInfo[subrange][RANGE_LOW] && value <= this.subrangeInfo[subrange][RANGE_HIGH]); } diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index bef06570a..c45ffa403 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -234,11 +234,11 @@ */ package org.jfree.chart.plot; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> +import org.checkerframework.checker.index.qual.*; + import org.checkerframework.common.value.qual.*; import org.checkerframework.dataflow.qual.Pure; -*/ + import java.awt.AlphaComposite; import java.awt.BasicStroke; @@ -358,22 +358,22 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, private RectangleInsets axisOffset; /** The domain axis / axes (used for the x-values). */ - private Map</*@NonNegative*/ Integer, ValueAxis> domainAxes; + private Map<@NonNegative Integer, ValueAxis> domainAxes; /** The domain axis locations. */ - private Map</*@NonNegative*/ Integer, AxisLocation> domainAxisLocations; + private Map<@NonNegative Integer, AxisLocation> domainAxisLocations; /** The range axis (used for the y-values). */ - private Map</*@NonNegative*/ Integer, ValueAxis> rangeAxes; + private Map<@NonNegative Integer, ValueAxis> rangeAxes; /** The range axis location. */ - private Map</*@NonNegative*/ Integer, AxisLocation> rangeAxisLocations; + private Map<@NonNegative Integer, AxisLocation> rangeAxisLocations; /** Storage for the datasets. */ - private Map</*@NonNegative*/ Integer, XYDataset> datasets; + private Map<@NonNegative Integer, XYDataset> datasets; /** Storage for the renderers. */ - private Map</*@NonNegative*/ Integer, XYItemRenderer> renderers; + private Map<@NonNegative Integer, XYItemRenderer> renderers; /** * Storage for the mapping between datasets/renderers and domain axes. The @@ -383,7 +383,7 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, * entry for a dataset, it is assumed to map to the primary domain axis * (index = 0). */ - private Map</*@NonNegative*/ Integer, List<Integer>> datasetToDomainAxesMap; + private Map<@NonNegative Integer, List<Integer>> datasetToDomainAxesMap; /** * Storage for the mapping between datasets/renderers and range axes. The @@ -393,13 +393,13 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, * entry for a dataset, it is assumed to map to the primary domain axis * (index = 0). */ - private Map</*@NonNegative*/ Integer, List<Integer>> datasetToRangeAxesMap; + private Map<@NonNegative Integer, List<Integer>> datasetToRangeAxesMap; /** The origin point for the quadrants (if drawn). */ private transient Point2D quadrantOrigin = new Point2D.Double(0.0, 0.0); /** The paint used for each quadrant. */ - private transient Paint /*@ArrayLen(4)*/ [] quadrantPaint + private transient Paint @ArrayLen(4) [] quadrantPaint = new Paint[] {null, null, null, null}; /** A flag that controls whether the domain grid-lines are visible. */ @@ -533,16 +533,16 @@ public class XYPlot extends Plot implements ValueAxisPlot, Pannable, Zoomable, private boolean rangeCrosshairLockedOnData = true; /** A map of lists of foreground markers (optional) for the domain axes. */ - private Map</*@NonNegative*/ Integer, Collection> foregroundDomainMarkers; + private Map<@NonNegative Integer, Collection> foregroundDomainMarkers; /** A map of lists of background markers (optional) for the domain axes. */ - private Map</*@NonNegative*/ Integer, Collection> backgroundDomainMarkers; + private Map<@NonNegative Integer, Collection> backgroundDomainMarkers; /** A map of lists of foreground markers (optional) for the range axes. */ - private Map</*@NonNegative*/ Integer, Collection> foregroundRangeMarkers; + private Map<@NonNegative Integer, Collection> foregroundRangeMarkers; /** A map of lists of background markers (optional) for the range axes. */ - private Map</*@NonNegative*/ Integer, Collection> backgroundRangeMarkers; + private Map<@NonNegative Integer, Collection> backgroundRangeMarkers; /** * A (possibly empty) list of annotations for the plot. The list should @@ -640,29 +640,29 @@ public XYPlot(XYDataset dataset, ValueAxis domainAxis, ValueAxis rangeAxis, // allocate storage for datasets, axes and renderers (all optional) - HashMap domainAxes = new HashMap</*@NonNegative*/ Integer, ValueAxis>(); + HashMap domainAxes = new HashMap<@NonNegative Integer, ValueAxis>(); this.domainAxes = domainAxes; - HashMap domainAxisLocations = new HashMap</*@NonNegative*/ Integer, AxisLocation>(); + HashMap domainAxisLocations = new HashMap<@NonNegative Integer, AxisLocation>(); this.domainAxisLocations = domainAxisLocations; this.foregroundDomainMarkers = new HashMap(); this.backgroundDomainMarkers = new HashMap(); - HashMap rangeAxes = new HashMap</*@NonNegative*/ Integer, ValueAxis>(); + HashMap rangeAxes = new HashMap<@NonNegative Integer, ValueAxis>(); this.rangeAxes = rangeAxes; - HashMap rangeAxisLocations = new HashMap</*@NonNegative*/ Integer, AxisLocation>(); + HashMap rangeAxisLocations = new HashMap<@NonNegative Integer, AxisLocation>(); this.rangeAxisLocations = rangeAxisLocations; this.foregroundRangeMarkers = new HashMap(); this.backgroundRangeMarkers = new HashMap(); - HashMap datasets = new HashMap</*@NonNegative*/ Integer, XYDataset>(); + HashMap datasets = new HashMap<@NonNegative Integer, XYDataset>(); this.datasets = datasets; - HashMap renderers = new HashMap</*@NonNegative*/ Integer, XYItemRenderer>(); + HashMap renderers = new HashMap<@NonNegative Integer, XYItemRenderer>(); this.renderers = renderers; this.datasetToDomainAxesMap = new TreeMap(); @@ -756,7 +756,7 @@ public String getPlotType() { * @see #setOrientation(PlotOrientation) */ @Override - /*@Pure*/ + @Pure public PlotOrientation getOrientation() { return this.orientation; } @@ -826,7 +826,7 @@ public ValueAxis getDomainAxis() { * * @see #setDomainAxis(int, ValueAxis) */ - public ValueAxis getDomainAxis(/*@NonNegative*/ int index) { + public ValueAxis getDomainAxis(@NonNegative int index) { ValueAxis result = this.domainAxes.get(index); if (result == null) { Plot parent = getParent(); @@ -861,7 +861,7 @@ public void setDomainAxis(ValueAxis axis) { * @see #getDomainAxis(int) * @see #setRangeAxis(int, ValueAxis) */ - public void setDomainAxis(/*@NonNegative*/ int index, ValueAxis axis) { + public void setDomainAxis(@NonNegative int index, ValueAxis axis) { setDomainAxis(index, axis, true); } @@ -875,7 +875,7 @@ public void setDomainAxis(/*@NonNegative*/ int index, ValueAxis axis) { * * @see #getDomainAxis(int) */ - public void setDomainAxis(/*@NonNegative*/ int index, ValueAxis axis, boolean notify) { + public void setDomainAxis(@NonNegative int index, ValueAxis axis, boolean notify) { ValueAxis existing = getDomainAxis(index); if (existing != null) { existing.removeChangeListener(this); @@ -915,7 +915,7 @@ public void setDomainAxes(ValueAxis[] axes) { * * @see #setDomainAxisLocation(AxisLocation) */ - /*@Pure*/ + @Pure public AxisLocation getDomainAxisLocation() { return (AxisLocation) this.domainAxisLocations.get(0); } @@ -1010,7 +1010,7 @@ public void configureDomainAxes() { * * @see #setDomainAxisLocation(int, AxisLocation) */ - public AxisLocation getDomainAxisLocation(/*@NonNegative*/ int index) { + public AxisLocation getDomainAxisLocation(@NonNegative int index) { AxisLocation result = this.domainAxisLocations.get(index); if (result == null) { result = AxisLocation.getOpposite(getDomainAxisLocation()); @@ -1028,7 +1028,7 @@ public AxisLocation getDomainAxisLocation(/*@NonNegative*/ int index) { * * @see #getDomainAxisLocation(int) */ - public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation location) { + public void setDomainAxisLocation(@NonNegative int index, AxisLocation location) { // delegate... setDomainAxisLocation(index, location, true); } @@ -1047,7 +1047,7 @@ public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation locat * @see #getDomainAxisLocation(int) * @see #setRangeAxisLocation(int, AxisLocation, boolean) */ - public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation location, + public void setDomainAxisLocation(@NonNegative int index, AxisLocation location, boolean notify) { if (index == 0 && location == null) { throw new IllegalArgumentException( @@ -1068,7 +1068,7 @@ public void setDomainAxisLocation(/*@NonNegative*/ int index, AxisLocation locat * * @see #getRangeAxisEdge(int) */ - public RectangleEdge getDomainAxisEdge(/*@NonNegative*/ int index) { + public RectangleEdge getDomainAxisEdge(@NonNegative int index) { AxisLocation location = getDomainAxisLocation(index); return Plot.resolveDomainAxisLocation(location, this.orientation); } @@ -1120,7 +1120,7 @@ public void setRangeAxis(ValueAxis axis) { * * @see #setRangeAxisLocation(AxisLocation) */ - /*@Pure*/ + @Pure public AxisLocation getRangeAxisLocation() { return (AxisLocation) this.rangeAxisLocations.get(0); } @@ -1175,7 +1175,7 @@ public RectangleEdge getRangeAxisEdge() { * * @see #setRangeAxis(int, ValueAxis) */ - public ValueAxis getRangeAxis(/*@NonNegative*/ int index) { + public ValueAxis getRangeAxis(@NonNegative int index) { ValueAxis result = this.rangeAxes.get(index); if (result == null) { Plot parent = getParent(); @@ -1196,7 +1196,7 @@ public ValueAxis getRangeAxis(/*@NonNegative*/ int index) { * * @see #getRangeAxis(int) */ - public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis) { + public void setRangeAxis(@NonNegative int index, ValueAxis axis) { setRangeAxis(index, axis, true); } @@ -1210,7 +1210,7 @@ public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis) { * * @see #getRangeAxis(int) */ - public void setRangeAxis(/*@NonNegative*/ int index, ValueAxis axis, boolean notify) { + public void setRangeAxis(@NonNegative int index, ValueAxis axis, boolean notify) { ValueAxis existing = getRangeAxis(index); if (existing != null) { existing.removeChangeListener(this); @@ -1294,7 +1294,7 @@ public void configureRangeAxes() { * * @see #setRangeAxisLocation(int, AxisLocation) */ - public AxisLocation getRangeAxisLocation(/*@NonNegative*/ int index) { + public AxisLocation getRangeAxisLocation(@NonNegative int index) { AxisLocation result = this.rangeAxisLocations.get(index); if (result == null) { result = AxisLocation.getOpposite(getRangeAxisLocation()); @@ -1311,7 +1311,7 @@ public AxisLocation getRangeAxisLocation(/*@NonNegative*/ int index) { * * @see #getRangeAxisLocation(int) */ - public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation location) { + public void setRangeAxisLocation(@NonNegative int index, AxisLocation location) { // delegate... setRangeAxisLocation(index, location, true); } @@ -1330,7 +1330,7 @@ public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation locati * @see #getRangeAxisLocation(int) * @see #setDomainAxisLocation(int, AxisLocation, boolean) */ - public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation location, + public void setRangeAxisLocation(@NonNegative int index, AxisLocation location, boolean notify) { if (index == 0 && location == null) { throw new IllegalArgumentException( @@ -1352,7 +1352,7 @@ public void setRangeAxisLocation(/*@NonNegative*/ int index, AxisLocation locati * @see #getRangeAxisLocation(int) * @see #getOrientation() */ - public RectangleEdge getRangeAxisEdge(/*@NonNegative*/ int index) { + public RectangleEdge getRangeAxisEdge(@NonNegative int index) { AxisLocation location = getRangeAxisLocation(index); return Plot.resolveRangeAxisLocation(location, this.orientation); } @@ -1379,7 +1379,7 @@ public XYDataset getDataset() { * * @see #setDataset(int, XYDataset) */ - public XYDataset getDataset(/*@NonNegative*/ int index) { + public XYDataset getDataset(@NonNegative int index) { return (XYDataset) this.datasets.get(index); } @@ -1405,7 +1405,7 @@ public void setDataset(XYDataset dataset) { * * @see #getDataset(int) */ - public void setDataset(/*@NonNegative*/ int index, XYDataset dataset) { + public void setDataset(@NonNegative int index, XYDataset dataset) { XYDataset existing = getDataset(index); if (existing != null) { existing.removeChangeListener(this); @@ -1437,8 +1437,8 @@ public int getDatasetCount() { * * @return The index or -1. */ - public /*@GTENegativeOne*/ int indexOf(XYDataset dataset) { - for (Map.Entry</*@NonNegative*/ Integer, XYDataset> entry: this.datasets.entrySet()) { + public @GTENegativeOne int indexOf(XYDataset dataset) { + for (Map.Entry<@NonNegative Integer, XYDataset> entry: this.datasets.entrySet()) { if (dataset == entry.getValue()) { return entry.getKey(); } @@ -1455,7 +1455,7 @@ public int getDatasetCount() { * * @see #mapDatasetToRangeAxis(int, int) */ - public void mapDatasetToDomainAxis(/*@NonNegative*/ int index, int axisIndex) { + public void mapDatasetToDomainAxis(@NonNegative int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(new Integer(axisIndex)); mapDatasetToDomainAxes(index, axisIndices); @@ -1471,10 +1471,10 @@ public void mapDatasetToDomainAxis(/*@NonNegative*/ int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToDomainAxes(/*@NonNegative*/ int index, List<Integer> axisIndices) { + public void mapDatasetToDomainAxes(@NonNegative int index, List<Integer> axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); - /*@NonNegative*/ Integer key = index; + @NonNegative Integer key = index; this.datasetToDomainAxesMap.put(key, new ArrayList<Integer>(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); @@ -1489,7 +1489,7 @@ public void mapDatasetToDomainAxes(/*@NonNegative*/ int index, List<Integer> axi * * @see #mapDatasetToDomainAxis(int, int) */ - public void mapDatasetToRangeAxis(/*@NonNegative*/ int index, int axisIndex) { + public void mapDatasetToRangeAxis(@NonNegative int index, int axisIndex) { List axisIndices = new java.util.ArrayList(1); axisIndices.add(new Integer(axisIndex)); mapDatasetToRangeAxes(index, axisIndices); @@ -1505,10 +1505,10 @@ public void mapDatasetToRangeAxis(/*@NonNegative*/ int index, int axisIndex) { * * @since 1.0.12 */ - public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List<Integer> axisIndices) { + public void mapDatasetToRangeAxes(@NonNegative int index, List<Integer> axisIndices) { Args.requireNonNegative(index, "index"); checkAxisIndices(axisIndices); - /*@NonNegative*/ Integer key = index; + @NonNegative Integer key = index; this.datasetToRangeAxesMap.put(key, new ArrayList<Integer>(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); @@ -1521,7 +1521,7 @@ public void mapDatasetToRangeAxes(/*@NonNegative*/ int index, List<Integer> axis * * @param indices the list of indices ({@code null} permitted). */ - /*@Pure*/ + @Pure private void checkAxisIndices(List<Integer> indices) { // axisIndices can be: // 1. null; @@ -1549,7 +1549,7 @@ private void checkAxisIndices(List<Integer> indices) { * * @since 1.0.11 */ - public /*@NonNegative*/ int getRendererCount() { + public @NonNegative int getRendererCount() { return this.renderers.size(); } @@ -1573,8 +1573,8 @@ public XYItemRenderer getRenderer() { * * @see #setRenderer(int, XYItemRenderer) */ - /*@Pure*/ - public XYItemRenderer getRenderer(/*@NonNegative*/ int index) { + @Pure + public XYItemRenderer getRenderer(@NonNegative int index) { return (XYItemRenderer) this.renderers.get(index); } @@ -1602,7 +1602,7 @@ public void setRenderer(XYItemRenderer renderer) { * * @see #getRenderer(int) */ - public void setRenderer(/*@NonNegative*/ int index, XYItemRenderer renderer) { + public void setRenderer(@NonNegative int index, XYItemRenderer renderer) { setRenderer(index, renderer, true); } @@ -1618,7 +1618,7 @@ public void setRenderer(/*@NonNegative*/ int index, XYItemRenderer renderer) { * * @see #getRenderer(int) */ - public void setRenderer(/*@NonNegative*/ int index, XYItemRenderer renderer, + public void setRenderer(@NonNegative int index, XYItemRenderer renderer, boolean notify) { XYItemRenderer existing = getRenderer(index); if (existing != null) { @@ -1711,8 +1711,8 @@ public void setSeriesRenderingOrder(SeriesRenderingOrder order) { * * @return The renderer index. */ - public /*@GTENegativeOne*/ int getIndexOf(XYItemRenderer renderer) { - for (Map.Entry</*@NonNegative*/ Integer, XYItemRenderer> entry + public @GTENegativeOne int getIndexOf(XYItemRenderer renderer) { + for (Map.Entry<@NonNegative Integer, XYItemRenderer> entry : this.renderers.entrySet()) { if (entry.getValue() == renderer) { return entry.getKey(); @@ -2382,7 +2382,7 @@ public void setQuadrantOrigin(Point2D origin) { * * @see #setQuadrantPaint(int, Paint) */ - public Paint getQuadrantPaint(/*@NonNegative*/ int index) { + public Paint getQuadrantPaint(@NonNegative int index) { if (index < 0 || index > 3) { throw new IllegalArgumentException("The index value (" + index + ") should be in the range 0 to 3."); @@ -2399,7 +2399,7 @@ public Paint getQuadrantPaint(/*@NonNegative*/ int index) { * * @see #getQuadrantPaint(int) */ - public void setQuadrantPaint(/*@NonNegative*/ int index, Paint paint) { + public void setQuadrantPaint(@NonNegative int index, Paint paint) { if (index < 0 || index > 3) { throw new IllegalArgumentException("The index value (" + index + ") should be in the range 0 to 3."); @@ -2449,14 +2449,14 @@ public void addDomainMarker(Marker marker, Layer layer) { */ public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - Set</*@NonNegative*/ Integer> keys = this.backgroundDomainMarkers.keySet(); + Set<@NonNegative Integer> keys = this.backgroundDomainMarkers.keySet(); for (Integer key : keys) { clearDomainMarkers(key); } this.backgroundDomainMarkers.clear(); } if (this.foregroundDomainMarkers != null) { - Set</*@NonNegative*/ Integer> keys = this.foregroundDomainMarkers.keySet(); + Set<@NonNegative Integer> keys = this.foregroundDomainMarkers.keySet(); for (Integer key : keys) { clearDomainMarkers(key); } @@ -2473,7 +2473,7 @@ public void clearDomainMarkers() { * * @see #clearRangeMarkers(int) */ - public void clearDomainMarkers(/*@NonNegative*/ int index) { + public void clearDomainMarkers(@NonNegative int index) { Integer key = new Integer(index); if (this.backgroundDomainMarkers != null) { Collection markers @@ -2517,7 +2517,7 @@ public void clearDomainMarkers(/*@NonNegative*/ int index) { * @see #clearDomainMarkers(int) * @see #addRangeMarker(int, Marker, Layer) */ - public void addDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { + public void addDomainMarker(@NonNegative int index, Marker marker, Layer layer) { addDomainMarker(index, marker, layer, true); } @@ -2536,7 +2536,7 @@ public void addDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer lay * * @since 1.0.10 */ - public void addDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, + public void addDomainMarker(@NonNegative int index, Marker marker, Layer layer, boolean notify) { Args.nullNotPermitted(marker, "marker"); Args.nullNotPermitted(layer, "layer"); @@ -2546,7 +2546,7 @@ public void addDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer lay new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - /*@NonNegative*/ Integer i = index; + @NonNegative Integer i = index; this.foregroundDomainMarkers.put(i, markers); } markers.add(marker); @@ -2556,7 +2556,7 @@ else if (layer == Layer.BACKGROUND) { new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - /*@NonNegative*/ Integer i = index; + @NonNegative Integer i = index; this.backgroundDomainMarkers.put(i, markers); } markers.add(marker); @@ -2611,7 +2611,7 @@ public boolean removeDomainMarker(Marker marker, Layer layer) { * * @since 1.0.7 */ - public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { + public boolean removeDomainMarker(@NonNegative int index, Marker marker, Layer layer) { return removeDomainMarker(index, marker, layer, true); } @@ -2629,7 +2629,7 @@ public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Lay * * @since 1.0.10 */ - public boolean removeDomainMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, + public boolean removeDomainMarker(@NonNegative int index, Marker marker, Layer layer, boolean notify) { ArrayList markers; if (layer == Layer.FOREGROUND) { @@ -2690,7 +2690,7 @@ public void addRangeMarker(Marker marker, Layer layer) { public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { - Set</*@NonNegative*/ Integer> keys = this.backgroundRangeMarkers.keySet(); + Set<@NonNegative Integer> keys = this.backgroundRangeMarkers.keySet(); for (Integer key : keys) { clearRangeMarkers(key); } @@ -2698,7 +2698,7 @@ public void clearRangeMarkers() { } if (this.foregroundRangeMarkers != null) { - Set</*@NonNegative*/ Integer> keys = this.foregroundRangeMarkers.keySet(); + Set<@NonNegative Integer> keys = this.foregroundRangeMarkers.keySet(); for (Integer key : keys) { clearRangeMarkers(key); } @@ -2721,7 +2721,7 @@ public void clearRangeMarkers() { * @see #clearRangeMarkers(int) * @see #addDomainMarker(int, Marker, Layer) */ - public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { + public void addRangeMarker(@NonNegative int index, Marker marker, Layer layer) { addRangeMarker(index, marker, layer, true); } @@ -2739,7 +2739,7 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye * * @since 1.0.10 */ - public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, + public void addRangeMarker(@NonNegative int index, Marker marker, Layer layer, boolean notify) { Collection markers; if (layer == Layer.FOREGROUND) { @@ -2747,7 +2747,7 @@ public void addRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer laye new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - /*@NonNegative*/ Integer i = index; + @NonNegative Integer i = index; this.foregroundRangeMarkers.put(i, markers); } markers.add(marker); @@ -2757,7 +2757,7 @@ else if (layer == Layer.BACKGROUND) { new Integer(index)); if (markers == null) { markers = new java.util.ArrayList(); - /*@NonNegative*/ Integer i = index; + @NonNegative Integer i = index; this.backgroundRangeMarkers.put(i, markers); } markers.add(marker); @@ -2774,7 +2774,7 @@ else if (layer == Layer.BACKGROUND) { * * @param index the renderer index. */ - public void clearRangeMarkers(/*@NonNegative*/ int index) { + public void clearRangeMarkers(@NonNegative int index) { Integer key = new Integer(index); if (this.backgroundRangeMarkers != null) { Collection markers @@ -2847,7 +2847,7 @@ public boolean removeRangeMarker(Marker marker, Layer layer) { * * @since 1.0.7 */ - public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer) { + public boolean removeRangeMarker(@NonNegative int index, Marker marker, Layer layer) { return removeRangeMarker(index, marker, layer, true); } @@ -2865,7 +2865,7 @@ public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Laye * * @since 1.0.10 */ - public boolean removeRangeMarker(/*@NonNegative*/ int index, Marker marker, Layer layer, + public boolean removeRangeMarker(@NonNegative int index, Marker marker, Layer layer, boolean notify) { Args.nullNotPermitted(marker, "marker"); Args.nullNotPermitted(layer, "layer"); @@ -3276,20 +3276,20 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw the markers that are associated with a specific dataset... for (XYDataset dataset: this.datasets.values()) { @SuppressWarnings("index") // guaranteed index: dataset is definitely a valid dataset, so its index will be nonnegative - /*@NonNegative*/ int datasetIndex = indexOf(dataset); + @NonNegative int datasetIndex = indexOf(dataset); drawDomainMarkers(g2, dataArea, datasetIndex, Layer.BACKGROUND); } for (XYDataset dataset: this.datasets.values()) { @SuppressWarnings("index") // guaranteed index: dataset is definitely a valid dataset, so its index will be nonnegative - /*@NonNegative*/ int datasetIndex = indexOf(dataset); + @NonNegative int datasetIndex = indexOf(dataset); drawRangeMarkers(g2, dataArea, datasetIndex, Layer.BACKGROUND); } // now draw annotations and render data items... boolean foundData = false; DatasetRenderingOrder order = getDatasetRenderingOrder(); - List</*@NonNegative*/ Integer> rendererIndices = getRendererIndices(order); - List</*@NonNegative*/ Integer> datasetIndices = getDatasetIndices(order); + List<@NonNegative Integer> rendererIndices = getRendererIndices(order); + List<@NonNegative Integer> datasetIndices = getDatasetIndices(order); // draw background annotations for (int i : rendererIndices) { @@ -3401,9 +3401,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, * * @return The list of indices. */ - private List< /*@NonNegative*/ Integer> getDatasetIndices(DatasetRenderingOrder order) { - List</*@NonNegative*/ /*@UnknownVal*/ Integer> result = new ArrayList</*@NonNegative*/ /*@UnknownVal*/ Integer>(); - for (Entry< /*@NonNegative*/ Integer, XYDataset> entry : this.datasets.entrySet()) { + private List< @NonNegative Integer> getDatasetIndices(DatasetRenderingOrder order) { + List<@NonNegative Integer> result = new ArrayList<@NonNegative Integer>(); + for (Entry< @NonNegative Integer, XYDataset> entry : this.datasets.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); } @@ -3415,9 +3415,9 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, return result; } - private List< /*@NonNegative*/ Integer> getRendererIndices(DatasetRenderingOrder order) { - List</*@NonNegative*/ /*@UnknownVal*/ Integer> result = new ArrayList</*@NonNegative*/ /*@UnknownVal*/ Integer>(); - for (Entry< /*@NonNegative*/ Integer, XYItemRenderer> entry : this.renderers.entrySet()) { + private List< @NonNegative Integer> getRendererIndices(DatasetRenderingOrder order) { + List<@NonNegative Integer> result = new ArrayList<@NonNegative Integer>(); + for (Entry< @NonNegative Integer, XYItemRenderer> entry : this.renderers.entrySet()) { if (entry.getValue() != null) { result.add(entry.getKey()); } @@ -3648,7 +3648,7 @@ protected Map<Axis, AxisState> drawAxes(Graphics2D g2, Rectangle2D plotArea, for (ValueAxis axis : this.domainAxes.values()) { if (axis != null) { @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a domain axis, so axisIndex is NN - /*@NonNegative*/ int axisIndex = findDomainAxisIndex(axis); + @NonNegative int axisIndex = findDomainAxisIndex(axis); axisCollection.add(axis, getDomainAxisEdge(axisIndex)); } } @@ -3657,7 +3657,7 @@ protected Map<Axis, AxisState> drawAxes(Graphics2D g2, Rectangle2D plotArea, for (ValueAxis axis : this.rangeAxes.values()) { if (axis != null) { @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a range axis, so axisIndex is NN - /*@NonNegative*/ int axisIndex = findRangeAxisIndex(axis); + @NonNegative int axisIndex = findRangeAxisIndex(axis); axisCollection.add(axis, getRangeAxisEdge(axisIndex)); } } @@ -3731,7 +3731,7 @@ protected Map<Axis, AxisState> drawAxes(Graphics2D g2, Rectangle2D plotArea, * * @return A flag that indicates whether any data was actually rendered. */ - public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int index, + public boolean render(Graphics2D g2, Rectangle2D dataArea, @NonNegative int index, PlotRenderingInfo info, CrosshairState crosshairState) { boolean foundData = false; @@ -3767,14 +3767,14 @@ public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int continue; } if (state.getProcessVisibleItemsOnly()) { - /*@NonNegative*/ int[] itemBounds = RendererUtils.findLiveItems( + @NonNegative int[] itemBounds = RendererUtils.findLiveItems( dataset, series, xAxis.getLowerBound(), xAxis.getUpperBound()); firstItem = Math.max(itemBounds[0] - 1, 0); lastItem = Math.min(itemBounds[1] + 1, lastItem); } @SuppressWarnings("index") // if 0 weren't a valid index, then this loop iteration is skipped above - /*@IndexFor("dataset.getSeries(series)")*/ int firstItemTmp = firstItem; + @IndexFor("dataset.getSeries(series)") int firstItemTmp = firstItem; state.startSeriesPass(dataset, series, firstItemTmp, lastItem, pass, passCount); for (int item = firstItem; item <= lastItem; item++) { @@ -3795,17 +3795,17 @@ public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int int firstItem = 0; int lastItem = dataset.getItemCount(series) - 1; if (state.getProcessVisibleItemsOnly()) { - /*@NonNegative*/ int[] itemBounds = RendererUtils.findLiveItems( + @NonNegative int[] itemBounds = RendererUtils.findLiveItems( dataset, series, xAxis.getLowerBound(), xAxis.getUpperBound()); firstItem = Math.max(itemBounds[0] - 1, 0); lastItem = Math.min(itemBounds[1] + 1, lastItem); } @SuppressWarnings("index") // if 0 weren't a valid index, then this loop iteration is skipped above - /*@IndexFor("dataset.getSeries(series)")*/ int firstItemTmp = firstItem; + @IndexFor("dataset.getSeries(series)") int firstItemTmp = firstItem; @SuppressWarnings("index") // I think this is a bug, as lastItem is checked in the parallel code above to not be -1, but that check is elided here. - /*@NonNegative*/ int lastItemTmp = lastItem; + @NonNegative int lastItemTmp = lastItem; state.startSeriesPass(dataset, series, firstItemTmp, lastItemTmp, pass, passCount); @@ -3830,7 +3830,7 @@ public boolean render(Graphics2D g2, Rectangle2D dataArea, /*@NonNegative*/ int * * @return The axis. */ - public ValueAxis getDomainAxisForDataset(/*@NonNegative*/ int index) { + public ValueAxis getDomainAxisForDataset(@NonNegative int index) { Args.requireNonNegative(index, "index"); ValueAxis valueAxis; List axisIndices = (List) this.datasetToDomainAxesMap.get( @@ -3838,7 +3838,7 @@ public ValueAxis getDomainAxisForDataset(/*@NonNegative*/ int index) { if (axisIndices != null) { // the first axis in the list is used for data <--> Java2D @SuppressWarnings("index") // first element of axisIndices is guaranteed NN - /*@NonNegative*/ int axisIndex = ((Integer) axisIndices.get(0)).intValue(); + @NonNegative int axisIndex = ((Integer) axisIndices.get(0)).intValue(); valueAxis = getDomainAxis(axisIndex); } else { @@ -3854,7 +3854,7 @@ public ValueAxis getDomainAxisForDataset(/*@NonNegative*/ int index) { * * @return The axis. */ - public ValueAxis getRangeAxisForDataset(/*@NonNegative*/ int index) { + public ValueAxis getRangeAxisForDataset(@NonNegative int index) { Args.requireNonNegative(index, "index"); ValueAxis valueAxis; List axisIndices = (List) this.datasetToRangeAxesMap.get( @@ -3862,7 +3862,7 @@ public ValueAxis getRangeAxisForDataset(/*@NonNegative*/ int index) { if (axisIndices != null) { // the first axis in the list is used for data <--> Java2D @SuppressWarnings("index") // first element of axisIndices is guaranteed NN - /*@NonNegative*/ int axisIndex = ((Integer) axisIndices.get(0)).intValue(); + @NonNegative int axisIndex = ((Integer) axisIndices.get(0)).intValue(); valueAxis = getRangeAxis(axisIndex); } else { @@ -4031,7 +4031,7 @@ public void drawAnnotations(Graphics2D g2, Rectangle2D dataArea, * @param layer the layer (foreground or background). */ protected void drawDomainMarkers(Graphics2D g2, Rectangle2D dataArea, - /*@NonNegative*/ int index, Layer layer) { + @NonNegative int index, Layer layer) { XYItemRenderer r = getRenderer(index); if (r == null) { @@ -4064,7 +4064,7 @@ protected void drawDomainMarkers(Graphics2D g2, Rectangle2D dataArea, * @param layer the layer (foreground or background). */ protected void drawRangeMarkers(Graphics2D g2, Rectangle2D dataArea, - /*@NonNegative*/ int index, Layer layer) { + @NonNegative int index, Layer layer) { XYItemRenderer r = getRenderer(index); if (r == null) { @@ -4123,7 +4123,7 @@ public Collection getRangeMarkers(Layer layer) { * * @see #getRangeMarkers(int, Layer) */ - public Collection getDomainMarkers(/*@NonNegative*/ int index, Layer layer) { + public Collection getDomainMarkers(@NonNegative int index, Layer layer) { Collection result = null; Integer key = new Integer(index); if (layer == Layer.FOREGROUND) { @@ -4149,7 +4149,7 @@ else if (layer == Layer.BACKGROUND) { * * @see #getDomainMarkers(int, Layer) */ - public Collection getRangeMarkers(/*@NonNegative*/ int index, Layer layer) { + public Collection getRangeMarkers(@NonNegative int index, Layer layer) { Collection result = null; Integer key = new Integer(index); if (layer == Layer.FOREGROUND) { @@ -4395,7 +4395,7 @@ private List<XYDataset> getDatasetsMappedToRangeAxis(Integer axisIndex) { * * @see #getRangeAxisIndex(ValueAxis) */ - public /*@GTENegativeOne*/ int getDomainAxisIndex(ValueAxis axis) { + public @GTENegativeOne int getDomainAxisIndex(ValueAxis axis) { int result = findDomainAxisIndex(axis); if (result < 0) { // try the parent plot @@ -4408,8 +4408,8 @@ private List<XYDataset> getDatasetsMappedToRangeAxis(Integer axisIndex) { return result; } - private /*@GTENegativeOne*/ int findDomainAxisIndex(ValueAxis axis) { - for (Map.Entry</*@NonNegative*/ Integer, ValueAxis> entry : this.domainAxes.entrySet()) { + private @GTENegativeOne int findDomainAxisIndex(ValueAxis axis) { + for (Map.Entry<@NonNegative Integer, ValueAxis> entry : this.domainAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); } @@ -4426,7 +4426,7 @@ private List<XYDataset> getDatasetsMappedToRangeAxis(Integer axisIndex) { * * @see #getDomainAxisIndex(ValueAxis) */ - public /*@GTENegativeOne*/ int getRangeAxisIndex(ValueAxis axis) { + public @GTENegativeOne int getRangeAxisIndex(ValueAxis axis) { int result = findRangeAxisIndex(axis); if (result < 0) { // try the parent plot @@ -4439,8 +4439,8 @@ private List<XYDataset> getDatasetsMappedToRangeAxis(Integer axisIndex) { return result; } - private /*@GTENegativeOne*/ int findRangeAxisIndex(ValueAxis axis) { - for (Map.Entry</*@NonNegative*/ Integer, ValueAxis> entry : this.rangeAxes.entrySet()) { + private @GTENegativeOne int findRangeAxisIndex(ValueAxis axis) { + for (Map.Entry<@NonNegative Integer, ValueAxis> entry : this.rangeAxes.entrySet()) { if (entry.getValue() == axis) { return entry.getKey(); } @@ -5276,7 +5276,7 @@ public boolean isRangeZoomable() { * * @return The series count. */ - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { int result = 0; XYDataset dataset = getDataset(); if (dataset != null) { @@ -5328,7 +5328,7 @@ public LegendItemCollection getLegendItems() { continue; } @SuppressWarnings("index") // guaranteed index: dataset is came from this object, so indexOf returns NN - /*@NonNegative*/ int datasetIndex = indexOf(dataset); + @NonNegative int datasetIndex = indexOf(dataset); XYItemRenderer renderer = getRenderer(datasetIndex); if (renderer == null) { renderer = getRenderer(0); @@ -5590,13 +5590,13 @@ public Object clone() throws CloneNotSupportedException { axis.addChangeListener(clone); } } - clone.domainAxisLocations = new HashMap</*@NonNegative*/ Integer, AxisLocation>( + clone.domainAxisLocations = new HashMap<@NonNegative Integer, AxisLocation>( this.domainAxisLocations); - clone.rangeAxisLocations = new HashMap</*@NonNegative*/ Integer, AxisLocation>( + clone.rangeAxisLocations = new HashMap<@NonNegative Integer, AxisLocation>( this.rangeAxisLocations); // the datasets are not cloned, but listeners need to be added... - clone.datasets = new HashMap</*@NonNegative*/ Integer, XYDataset>(this.datasets); + clone.datasets = new HashMap<@NonNegative Integer, XYDataset>(this.datasets); for (XYDataset dataset : clone.datasets.values()) { if (dataset != null) { dataset.addChangeListener(clone); diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java index 3a7664864..5e072db6c 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java @@ -45,7 +45,7 @@ */ package org.jfree.chart.plot.dial; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Shape; @@ -356,7 +356,7 @@ public int getLayerIndex(DialLayer layer) { * * @param index the index. */ - public void removeLayer(/*@NonNegative*/ int index) { + public void removeLayer(@NonNegative int index) { DialLayer layer = (DialLayer) this.layers.get(index); if (layer != null) { layer.removeChangeListener(this); @@ -408,7 +408,7 @@ public int getPointerIndex(DialPointer pointer) { * * @param index the index. */ - public void removePointer(/*@NonNegative*/ int index) { + public void removePointer(@NonNegative int index) { DialPointer pointer = (DialPointer) this.pointers.get(index); if (pointer != null) { pointer.removeChangeListener(this); @@ -437,7 +437,7 @@ public void removePointer(DialPointer pointer) { * * @return The pointer. */ - public DialPointer getPointerForDataset(/*@NonNegative*/ int datasetIndex) { + public DialPointer getPointerForDataset(@NonNegative int datasetIndex) { DialPointer result = null; Iterator iterator = this.pointers.iterator(); while (iterator.hasNext()) { @@ -465,7 +465,7 @@ public ValueDataset getDataset() { * * @return The dataset (possibly {@code null}). */ - public ValueDataset getDataset(/*@NonNegative*/ int index) { + public ValueDataset getDataset(@NonNegative int index) { ValueDataset result = null; if (this.datasets.size() > index) { result = (ValueDataset) this.datasets.get(index); @@ -490,7 +490,7 @@ public void setDataset(ValueDataset dataset) { * @param index the dataset index. * @param dataset the dataset ({@code null} permitted). */ - public void setDataset(/*@NonNegative*/ int index, ValueDataset dataset) { + public void setDataset(@NonNegative int index, ValueDataset dataset) { ValueDataset existing = (ValueDataset) this.datasets.get(index); if (existing != null) { @@ -627,7 +627,7 @@ private Rectangle2D viewToFrame(Rectangle2D view) { * * @return The data value. */ - public double getValue(/*@NonNegative*/ int datasetIndex) { + public double getValue(@NonNegative int datasetIndex) { double result = Double.NaN; ValueDataset dataset = getDataset(datasetIndex); if (dataset != null) { @@ -646,7 +646,7 @@ public double getValue(/*@NonNegative*/ int datasetIndex) { * @param index the scale index. * @param scale the scale ({@code null} not permitted). */ - public void addScale(/*@NonNegative*/ int index, DialScale scale) { + public void addScale(@NonNegative int index, DialScale scale) { Args.nullNotPermitted(scale, "scale"); DialScale existing = (DialScale) this.scales.get(index); if (existing != null) { @@ -665,7 +665,7 @@ public void addScale(/*@NonNegative*/ int index, DialScale scale) { * * @return The scale (possibly {@code null}). */ - public DialScale getScale(/*@NonNegative*/ int index) { + public DialScale getScale(@NonNegative int index) { DialScale result = null; if (this.scales.size() > index) { result = (DialScale) this.scales.get(index); @@ -679,7 +679,7 @@ public DialScale getScale(/*@NonNegative*/ int index) { * @param index the dataset index (zero-based). * @param scaleIndex the scale index (zero-based). */ - public void mapDatasetToScale(/*@NonNegative*/ int index, int scaleIndex) { + public void mapDatasetToScale(@NonNegative int index, int scaleIndex) { this.datasetToScaleMap.set(index, new Integer(scaleIndex)); fireChangeEvent(); } @@ -691,10 +691,10 @@ public void mapDatasetToScale(/*@NonNegative*/ int index, int scaleIndex) { * * @return The dial scale. */ - public DialScale getScaleForDataset(/*@NonNegative*/ int datasetIndex) { + public DialScale getScaleForDataset(@NonNegative int datasetIndex) { DialScale result = (DialScale) this.scales.get(0); @SuppressWarnings("index") // all scale indices are nonnegative - /*@NonNegative*/ Integer scaleIndex = (Integer) this.datasetToScaleMap.get(datasetIndex); + @NonNegative Integer scaleIndex = (Integer) this.datasetToScaleMap.get(datasetIndex); if (scaleIndex != null) { result = getScale(scaleIndex.intValue()); } diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java index 5a5e1a7e1..3536beecd 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java @@ -45,7 +45,7 @@ */ package org.jfree.chart.plot.dial; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; import java.awt.Color; @@ -81,7 +81,7 @@ public abstract class DialPointer extends AbstractDialLayer /** * The dataset index for the needle. */ - /*@NonNegative*/ int datasetIndex; + @NonNegative int datasetIndex; /** * Creates a new {@code DialPointer} instance. @@ -95,7 +95,7 @@ protected DialPointer() { * * @param datasetIndex the dataset index. */ - protected DialPointer(/*@NonNegative*/ int datasetIndex) { + protected DialPointer(@NonNegative int datasetIndex) { this.radius = 0.9; this.datasetIndex = datasetIndex; } @@ -107,7 +107,7 @@ protected DialPointer(/*@NonNegative*/ int datasetIndex) { * * @see #getDatasetIndex() */ - public /*@NonNegative*/ int getDatasetIndex() { + public @NonNegative int getDatasetIndex() { return this.datasetIndex; } @@ -119,7 +119,7 @@ protected DialPointer(/*@NonNegative*/ int datasetIndex) { * * @see #getDatasetIndex() */ - public void setDatasetIndex(/*@NonNegative*/ int index) { + public void setDatasetIndex(@NonNegative int index) { this.datasetIndex = index; notifyListeners(new DialLayerChangeEvent(this)); } @@ -236,7 +236,7 @@ public Pin() { * * @param datasetIndex the dataset index. */ - public Pin(/*@NonNegative*/ int datasetIndex) { + public Pin(@NonNegative int datasetIndex) { super(datasetIndex); this.paint = Color.RED; this.stroke = new BasicStroke(3.0f, BasicStroke.CAP_ROUND, @@ -429,7 +429,7 @@ public Pointer() { * * @param datasetIndex the dataset index. */ - public Pointer(/*@NonNegative*/ int datasetIndex) { + public Pointer(@NonNegative int datasetIndex) { super(datasetIndex); this.widthRadius = 0.05; this.fillPaint = Color.GRAY; diff --git a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java index d85333343..26a3cb3d9 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java @@ -43,7 +43,7 @@ */ package org.jfree.chart.plot.dial; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; import java.awt.Color; @@ -87,7 +87,7 @@ public class DialValueIndicator extends AbstractDialLayer implements DialLayer, static final long serialVersionUID = 803094354130942585L; /** The dataset index. */ - private /*@NonNegative*/ int datasetIndex; + private @NonNegative int datasetIndex; /** The angle that defines the anchor point. */ private double angle; @@ -149,7 +149,7 @@ public DialValueIndicator() { * * @param datasetIndex the dataset index. */ - public DialValueIndicator(/*@NonNegative*/ int datasetIndex) { + public DialValueIndicator(@NonNegative int datasetIndex) { this.datasetIndex = datasetIndex; this.angle = -90.0; this.radius = 0.3; @@ -175,7 +175,7 @@ public DialValueIndicator(/*@NonNegative*/ int datasetIndex) { * * @see #setDatasetIndex(int) */ - public /*@NonNegative*/ int getDatasetIndex() { + public @NonNegative int getDatasetIndex() { return this.datasetIndex; } @@ -187,7 +187,7 @@ public DialValueIndicator(/*@NonNegative*/ int datasetIndex) { * * @see #getDatasetIndex() */ - public void setDatasetIndex(/*@NonNegative*/ int index) { + public void setDatasetIndex(@NonNegative int index) { this.datasetIndex = index; notifyListeners(new DialLayerChangeEvent(this)); } diff --git a/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java b/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java index 5db98a0a9..9bb64b4cc 100644 --- a/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java +++ b/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java @@ -43,7 +43,7 @@ */ package org.jfree.chart.plot.dial; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; import java.awt.Color; @@ -74,7 +74,7 @@ public class StandardDialRange extends AbstractDialLayer implements DialLayer, static final long serialVersionUID = 345515648249364904L; /** The scale index. */ - private /*@NonNegative*/ int scaleIndex; + private @NonNegative int scaleIndex; /** The minimum data value for the scale. */ private double lowerBound; @@ -131,7 +131,7 @@ public StandardDialRange(double lower, double upper, Paint paint) { * * @see #setScaleIndex(int) */ - public /*@NonNegative*/ int getScaleIndex() { + public @NonNegative int getScaleIndex() { return this.scaleIndex; } @@ -143,7 +143,7 @@ public StandardDialRange(double lower, double upper, Paint paint) { * * @see #getScaleIndex() */ - public void setScaleIndex(/*@NonNegative*/ int index) { + public void setScaleIndex(@NonNegative int index) { this.scaleIndex = index; notifyListeners(new DialLayerChangeEvent(this)); } diff --git a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java index c81e346a5..3934c0137 100644 --- a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java @@ -99,9 +99,9 @@ package org.jfree.chart.renderer; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -388,7 +388,7 @@ public abstract class AbstractRenderer implements Cloneable, Serializable { private boolean dataBoundsIncludesVisibleSeriesOnly = true; /** The default radius for the entity 'hotspot' */ - private /*@NonNegative*/ int defaultEntityRadius; + private @NonNegative int defaultEntityRadius; /** Storage for registered change listeners. */ private transient EventListenerList listenerList; @@ -516,7 +516,7 @@ protected void endElementGroup(Graphics2D g2) { * * @return A boolean. */ - public boolean getItemVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemVisible(@NonNegative int series, @NonNegative int item) { return isSeriesVisible(series); } @@ -530,7 +530,7 @@ public boolean getItemVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int * * @return A boolean. */ - public boolean isSeriesVisible(/*@NonNegative*/ int series) { + public boolean isSeriesVisible(@NonNegative int series) { boolean result = this.defaultSeriesVisible; Boolean b = this.seriesVisibleList.getBoolean(series); if (b != null) { @@ -548,7 +548,7 @@ public boolean isSeriesVisible(/*@NonNegative*/ int series) { * * @see #setSeriesVisible(int, Boolean) */ - public Boolean getSeriesVisible(/*@NonNegative*/ int series) { + public Boolean getSeriesVisible(@NonNegative int series) { return this.seriesVisibleList.getBoolean(series); } @@ -561,7 +561,7 @@ public Boolean getSeriesVisible(/*@NonNegative*/ int series) { * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible) { + public void setSeriesVisible(@NonNegative int series, Boolean visible) { setSeriesVisible(series, visible, true); } @@ -576,7 +576,7 @@ public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible) { * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify) { + public void setSeriesVisible(@NonNegative int series, Boolean visible, boolean notify) { this.seriesVisibleList.setBoolean(series, visible); if (notify) { // we create an event with a special flag set...the purpose of @@ -643,7 +643,7 @@ public void setDefaultSeriesVisible(boolean visible, boolean notify) { * * @return A boolean. */ - public boolean isSeriesVisibleInLegend(/*@NonNegative*/ int series) { + public boolean isSeriesVisibleInLegend(@NonNegative int series) { boolean result = this.defaultSeriesVisibleInLegend; Boolean b = this.seriesVisibleInLegendList.getBoolean(series); if (b != null) { @@ -664,7 +664,7 @@ public boolean isSeriesVisibleInLegend(/*@NonNegative*/ int series) { * * @see #setSeriesVisibleInLegend(int, Boolean) */ - public Boolean getSeriesVisibleInLegend(/*@NonNegative*/ int series) { + public Boolean getSeriesVisibleInLegend(@NonNegative int series) { return this.seriesVisibleInLegendList.getBoolean(series); } @@ -677,7 +677,7 @@ public Boolean getSeriesVisibleInLegend(/*@NonNegative*/ int series) { * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible) { + public void setSeriesVisibleInLegend(@NonNegative int series, Boolean visible) { setSeriesVisibleInLegend(series, visible, true); } @@ -692,7 +692,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible, + public void setSeriesVisibleInLegend(@NonNegative int series, Boolean visible, boolean notify) { this.seriesVisibleInLegendList.setBoolean(series, visible); if (notify) { @@ -756,7 +756,7 @@ public void setDefaultSeriesVisibleInLegend(boolean visible, * * @return The paint (never {@code null}). */ - public Paint getItemPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Paint getItemPaint(@NonNegative int row, @NonNegative int column) { return lookupSeriesPaint(row); } @@ -769,7 +769,7 @@ public Paint getItemPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) * * @since 1.0.6 */ - public Paint lookupSeriesPaint(/*@NonNegative*/ int series) { + public Paint lookupSeriesPaint(@NonNegative int series) { Paint seriesPaint = getSeriesPaint(series); if (seriesPaint == null && this.autoPopulateSeriesPaint) { @@ -795,7 +795,7 @@ public Paint lookupSeriesPaint(/*@NonNegative*/ int series) { * * @see #setSeriesPaint(int, Paint) */ - public Paint getSeriesPaint(/*@NonNegative*/ int series) { + public Paint getSeriesPaint(@NonNegative int series) { return this.paintList.getPaint(series); } @@ -808,7 +808,7 @@ public Paint getSeriesPaint(/*@NonNegative*/ int series) { * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint) { + public void setSeriesPaint(@NonNegative int series, Paint paint) { setSeriesPaint(series, paint, true); } @@ -822,7 +822,7 @@ public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint) { * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint, boolean notify) { + public void setSeriesPaint(@NonNegative int series, Paint paint, boolean notify) { this.paintList.setPaint(series, paint); if (notify) { fireChangeEvent(); @@ -925,7 +925,7 @@ public void setAutoPopulateSeriesPaint(boolean auto) { * * @return The paint (never {@code null}). */ - public Paint getItemFillPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Paint getItemFillPaint(@NonNegative int row, @NonNegative int column) { return lookupSeriesFillPaint(row); } @@ -938,7 +938,7 @@ public Paint getItemFillPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int col * * @since 1.0.6 */ - public Paint lookupSeriesFillPaint(/*@NonNegative*/ int series) { + public Paint lookupSeriesFillPaint(@NonNegative int series) { Paint seriesFillPaint = getSeriesFillPaint(series); if (seriesFillPaint == null && this.autoPopulateSeriesFillPaint) { @@ -964,7 +964,7 @@ public Paint lookupSeriesFillPaint(/*@NonNegative*/ int series) { * * @see #setSeriesFillPaint(int, Paint) */ - public Paint getSeriesFillPaint(/*@NonNegative*/ int series) { + public Paint getSeriesFillPaint(@NonNegative int series) { return this.fillPaintList.getPaint(series); } @@ -977,7 +977,7 @@ public Paint getSeriesFillPaint(/*@NonNegative*/ int series) { * * @see #getSeriesFillPaint(int) */ - public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint) { + public void setSeriesFillPaint(@NonNegative int series, Paint paint) { setSeriesFillPaint(series, paint, true); } @@ -991,7 +991,7 @@ public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint) { * * @see #getSeriesFillPaint(int) */ - public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint, boolean notify) { + public void setSeriesFillPaint(@NonNegative int series, Paint paint, boolean notify) { this.fillPaintList.setPaint(series, paint); if (notify) { fireChangeEvent(); @@ -1084,7 +1084,7 @@ public void setAutoPopulateSeriesFillPaint(boolean auto) { * * @return The paint (never {@code null}). */ - public Paint getItemOutlinePaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Paint getItemOutlinePaint(@NonNegative int row, @NonNegative int column) { return lookupSeriesOutlinePaint(row); } @@ -1097,7 +1097,7 @@ public Paint getItemOutlinePaint(/*@NonNegative*/ int row, /*@NonNegative*/ int * * @since 1.0.6 */ - public Paint lookupSeriesOutlinePaint(/*@NonNegative*/ int series) { + public Paint lookupSeriesOutlinePaint(@NonNegative int series) { Paint seriesOutlinePaint = getSeriesOutlinePaint(series); if (seriesOutlinePaint == null && this.autoPopulateSeriesOutlinePaint) { @@ -1123,7 +1123,7 @@ public Paint lookupSeriesOutlinePaint(/*@NonNegative*/ int series) { * * @see #setSeriesOutlinePaint(int, Paint) */ - public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series) { + public Paint getSeriesOutlinePaint(@NonNegative int series) { return this.outlinePaintList.getPaint(series); } @@ -1136,7 +1136,7 @@ public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series) { * * @see #getSeriesOutlinePaint(int) */ - public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint) { + public void setSeriesOutlinePaint(@NonNegative int series, Paint paint) { setSeriesOutlinePaint(series, paint, true); } @@ -1150,7 +1150,7 @@ public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint) { * * @see #getSeriesOutlinePaint(int) */ - public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint, boolean notify) { + public void setSeriesOutlinePaint(@NonNegative int series, Paint paint, boolean notify) { this.outlinePaintList.setPaint(series, paint); if (notify) { fireChangeEvent(); @@ -1241,7 +1241,7 @@ public void setAutoPopulateSeriesOutlinePaint(boolean auto) { * * @return The stroke (never {@code null}). */ - public Stroke getItemStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Stroke getItemStroke(@NonNegative int row, @NonNegative int column) { return lookupSeriesStroke(row); } @@ -1254,7 +1254,7 @@ public Stroke getItemStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int colum * * @since 1.0.6 */ - public Stroke lookupSeriesStroke(/*@NonNegative*/ int series) { + public Stroke lookupSeriesStroke(@NonNegative int series) { Stroke result = getSeriesStroke(series); if (result == null && this.autoPopulateSeriesStroke) { @@ -1280,7 +1280,7 @@ public Stroke lookupSeriesStroke(/*@NonNegative*/ int series) { * * @see #setSeriesStroke(int, Stroke) */ - public Stroke getSeriesStroke(/*@NonNegative*/ int series) { + public Stroke getSeriesStroke(@NonNegative int series) { return this.strokeList.getStroke(series); } @@ -1293,7 +1293,7 @@ public Stroke getSeriesStroke(/*@NonNegative*/ int series) { * * @see #getSeriesStroke(int) */ - public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke) { + public void setSeriesStroke(@NonNegative int series, Stroke stroke) { setSeriesStroke(series, stroke, true); } @@ -1307,7 +1307,7 @@ public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke) { * * @see #getSeriesStroke(int) */ - public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify) { + public void setSeriesStroke(@NonNegative int series, Stroke stroke, boolean notify) { this.strokeList.setStroke(series, stroke); if (notify) { fireChangeEvent(); @@ -1411,7 +1411,7 @@ public void setAutoPopulateSeriesStroke(boolean auto) { * * @return The stroke (never {@code null}). */ - public Stroke getItemOutlineStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Stroke getItemOutlineStroke(@NonNegative int row, @NonNegative int column) { return lookupSeriesOutlineStroke(row); } @@ -1424,7 +1424,7 @@ public Stroke getItemOutlineStroke(/*@NonNegative*/ int row, /*@NonNegative*/ in * * @since 1.0.6 */ - public Stroke lookupSeriesOutlineStroke(/*@NonNegative*/ int series) { + public Stroke lookupSeriesOutlineStroke(@NonNegative int series) { Stroke result = getSeriesOutlineStroke(series); if (result == null && this.autoPopulateSeriesOutlineStroke) { @@ -1450,7 +1450,7 @@ public Stroke lookupSeriesOutlineStroke(/*@NonNegative*/ int series) { * * @see #setSeriesOutlineStroke(int, Stroke) */ - public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series) { + public Stroke getSeriesOutlineStroke(@NonNegative int series) { return this.outlineStrokeList.getStroke(series); } @@ -1463,7 +1463,7 @@ public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series) { * * @see #getSeriesOutlineStroke(int) */ - public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke) { + public void setSeriesOutlineStroke(@NonNegative int series, Stroke stroke) { setSeriesOutlineStroke(series, stroke, true); } @@ -1477,7 +1477,7 @@ public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke) { * * @see #getSeriesOutlineStroke(int) */ - public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke, + public void setSeriesOutlineStroke(@NonNegative int series, Stroke stroke, boolean notify) { this.outlineStrokeList.setStroke(series, stroke); if (notify) { @@ -1570,7 +1570,7 @@ public void setAutoPopulateSeriesOutlineStroke(boolean auto) { * * @return The shape (never {@code null}). */ - public Shape getItemShape(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Shape getItemShape(@NonNegative int row, @NonNegative int column) { return lookupSeriesShape(row); } @@ -1583,7 +1583,7 @@ public Shape getItemShape(/*@NonNegative*/ int row, /*@NonNegative*/ int column) * * @since 1.0.6 */ - public Shape lookupSeriesShape(/*@NonNegative*/ int series) { + public Shape lookupSeriesShape(@NonNegative int series) { Shape result = getSeriesShape(series); if (result == null && this.autoPopulateSeriesShape) { @@ -1609,7 +1609,7 @@ public Shape lookupSeriesShape(/*@NonNegative*/ int series) { * * @see #setSeriesShape(int, Shape) */ - public Shape getSeriesShape(/*@NonNegative*/ int series) { + public Shape getSeriesShape(@NonNegative int series) { return this.shapeList.getShape(series); } @@ -1622,7 +1622,7 @@ public Shape getSeriesShape(/*@NonNegative*/ int series) { * * @see #getSeriesShape(int) */ - public void setSeriesShape(/*@NonNegative*/ int series, Shape shape) { + public void setSeriesShape(@NonNegative int series, Shape shape) { setSeriesShape(series, shape, true); } @@ -1636,7 +1636,7 @@ public void setSeriesShape(/*@NonNegative*/ int series, Shape shape) { * * @see #getSeriesShape(int) */ - public void setSeriesShape(/*@NonNegative*/ int series, Shape shape, boolean notify) { + public void setSeriesShape(@NonNegative int series, Shape shape, boolean notify) { this.shapeList.setShape(series, shape); if (notify) { fireChangeEvent(); @@ -1723,7 +1723,7 @@ public void setAutoPopulateSeriesShape(boolean auto) { * * @return A boolean. */ - public boolean isItemLabelVisible(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public boolean isItemLabelVisible(@NonNegative int row, @NonNegative int column) { return isSeriesItemLabelsVisible(row); } @@ -1735,7 +1735,7 @@ public boolean isItemLabelVisible(/*@NonNegative*/ int row, /*@NonNegative*/ int * * @return A boolean. */ - public boolean isSeriesItemLabelsVisible(/*@NonNegative*/ int series) { + public boolean isSeriesItemLabelsVisible(@NonNegative int series) { Boolean b = this.itemLabelsVisibleList.getBoolean(series); if (b == null) { return this.defaultItemLabelsVisible; @@ -1750,7 +1750,7 @@ public boolean isSeriesItemLabelsVisible(/*@NonNegative*/ int series) { * @param series the series index (zero-based). * @param visible the flag. */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, boolean visible) { + public void setSeriesItemLabelsVisible(@NonNegative int series, boolean visible) { setSeriesItemLabelsVisible(series, Boolean.valueOf(visible)); } @@ -1761,7 +1761,7 @@ public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, boolean visi * @param series the series index (zero-based). * @param visible the flag ({@code null} permitted). */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible) { + public void setSeriesItemLabelsVisible(@NonNegative int series, Boolean visible) { setSeriesItemLabelsVisible(series, visible, true); } @@ -1774,7 +1774,7 @@ public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visi * @param notify a flag that controls whether or not listeners are * notified. */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible, + public void setSeriesItemLabelsVisible(@NonNegative int series, Boolean visible, boolean notify) { this.itemLabelsVisibleList.setBoolean(series, visible); if (notify) { @@ -1834,7 +1834,7 @@ public void setDefaultItemLabelsVisible(boolean visible, boolean notify) { * * @return The font (never {@code null}). */ - public Font getItemLabelFont(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Font getItemLabelFont(@NonNegative int row, @NonNegative int column) { Font result = getSeriesItemLabelFont(row); if (result == null) { result = this.defaultItemLabelFont; @@ -1851,7 +1851,7 @@ public Font getItemLabelFont(/*@NonNegative*/ int row, /*@NonNegative*/ int colu * * @see #setSeriesItemLabelFont(int, Font) */ - public Font getSeriesItemLabelFont(/*@NonNegative*/ int series) { + public Font getSeriesItemLabelFont(@NonNegative int series) { return this.itemLabelFontMap.get(series); } @@ -1864,7 +1864,7 @@ public Font getSeriesItemLabelFont(/*@NonNegative*/ int series) { * * @see #getSeriesItemLabelFont(int) */ - public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font) { + public void setSeriesItemLabelFont(@NonNegative int series, Font font) { setSeriesItemLabelFont(series, font, true); } @@ -1879,7 +1879,7 @@ public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font) { * * @see #getSeriesItemLabelFont(int) */ - public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font, boolean notify) { + public void setSeriesItemLabelFont(@NonNegative int series, Font font, boolean notify) { this.itemLabelFontMap.put(series, font); if (notify) { fireChangeEvent(); @@ -1938,7 +1938,7 @@ public void setDefaultItemLabelFont(Font font, boolean notify) { * * @return The paint (never {@code null}). */ - public Paint getItemLabelPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Paint getItemLabelPaint(@NonNegative int row, @NonNegative int column) { Paint result = getSeriesItemLabelPaint(row); if (result == null) { result = this.defaultItemLabelPaint; @@ -1955,7 +1955,7 @@ public Paint getItemLabelPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int co * * @see #setSeriesItemLabelPaint(int, Paint) */ - public Paint getSeriesItemLabelPaint(/*@NonNegative*/ int series) { + public Paint getSeriesItemLabelPaint(@NonNegative int series) { return this.itemLabelPaintList.getPaint(series); } @@ -1968,7 +1968,7 @@ public Paint getSeriesItemLabelPaint(/*@NonNegative*/ int series) { * * @see #getSeriesItemLabelPaint(int) */ - public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint) { + public void setSeriesItemLabelPaint(@NonNegative int series, Paint paint) { setSeriesItemLabelPaint(series, paint, true); } @@ -1983,7 +1983,7 @@ public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint) { * * @see #getSeriesItemLabelPaint(int) */ - public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint, + public void setSeriesItemLabelPaint(@NonNegative int series, Paint paint, boolean notify) { this.itemLabelPaintList.setPaint(series, paint); if (notify) { @@ -2045,7 +2045,7 @@ public void setDefaultItemLabelPaint(Paint paint, boolean notify) { * * @see #getNegativeItemLabelPosition(int, int) */ - public ItemLabelPosition getPositiveItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public ItemLabelPosition getPositiveItemLabelPosition(@NonNegative int row, @NonNegative int column) { return getSeriesPositiveItemLabelPosition(row); } @@ -2058,7 +2058,7 @@ public ItemLabelPosition getPositiveItemLabelPosition(/*@NonNegative*/ int row, * * @see #setSeriesPositiveItemLabelPosition(int, ItemLabelPosition) */ - public ItemLabelPosition getSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series) { + public ItemLabelPosition getSeriesPositiveItemLabelPosition(@NonNegative int series) { // otherwise look up the position table ItemLabelPosition position = (ItemLabelPosition) this.positiveItemLabelPositionMap.get(series); @@ -2077,7 +2077,7 @@ public ItemLabelPosition getSeriesPositiveItemLabelPosition(/*@NonNegative*/ int * * @see #getSeriesPositiveItemLabelPosition(int) */ - public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesPositiveItemLabelPosition(@NonNegative int series, ItemLabelPosition position) { setSeriesPositiveItemLabelPosition(series, position, true); } @@ -2093,7 +2093,7 @@ public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, * * @see #getSeriesPositiveItemLabelPosition(int) */ - public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesPositiveItemLabelPosition(@NonNegative int series, ItemLabelPosition position, boolean notify) { this.positiveItemLabelPositionMap.put(series, position); if (notify) { @@ -2157,7 +2157,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @see #getPositiveItemLabelPosition(int, int) */ - public ItemLabelPosition getNegativeItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public ItemLabelPosition getNegativeItemLabelPosition(@NonNegative int row, @NonNegative int column) { return getSeriesNegativeItemLabelPosition(row); } @@ -2170,7 +2170,7 @@ public ItemLabelPosition getNegativeItemLabelPosition(/*@NonNegative*/ int row, * * @see #setSeriesNegativeItemLabelPosition(int, ItemLabelPosition) */ - public ItemLabelPosition getSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series) { + public ItemLabelPosition getSeriesNegativeItemLabelPosition(@NonNegative int series) { // otherwise look up the position list ItemLabelPosition position = this.negativeItemLabelPositionMap.get(series); @@ -2189,7 +2189,7 @@ public ItemLabelPosition getSeriesNegativeItemLabelPosition(/*@NonNegative*/ int * * @see #getSeriesNegativeItemLabelPosition(int) */ - public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesNegativeItemLabelPosition(@NonNegative int series, ItemLabelPosition position) { setSeriesNegativeItemLabelPosition(series, position, true); } @@ -2205,7 +2205,7 @@ public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, * * @see #getSeriesNegativeItemLabelPosition(int) */ - public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesNegativeItemLabelPosition(@NonNegative int series, ItemLabelPosition position, boolean notify) { this.negativeItemLabelPositionMap.put(series, position); if (notify) { @@ -2287,7 +2287,7 @@ public void setItemLabelAnchorOffset(double offset) { * * @return A boolean. */ - public boolean getItemCreateEntity(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemCreateEntity(@NonNegative int series, @NonNegative int item) { Boolean b = getSeriesCreateEntities(series); if (b != null) { return b; @@ -2306,7 +2306,7 @@ public boolean getItemCreateEntity(/*@NonNegative*/ int series, /*@NonNegative*/ * * @see #setSeriesCreateEntities(int, Boolean) */ - public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series) { + public Boolean getSeriesCreateEntities(@NonNegative int series) { return this.createEntitiesList.getBoolean(series); } @@ -2319,7 +2319,7 @@ public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series) { * * @see #getSeriesCreateEntities(int) */ - public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create) { + public void setSeriesCreateEntities(@NonNegative int series, Boolean create) { setSeriesCreateEntities(series, create, true); } @@ -2334,7 +2334,7 @@ public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create) * * @see #getSeriesCreateEntities(int) */ - public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, + public void setSeriesCreateEntities(@NonNegative int series, Boolean create, boolean notify) { this.createEntitiesList.setBoolean(series, create); if (notify) { @@ -2392,7 +2392,7 @@ public void setDefaultCreateEntities(boolean create, boolean notify) { * * @see #setDefaultEntityRadius(int) */ - public /*@NonNegative*/ int getDefaultEntityRadius() { + public @NonNegative int getDefaultEntityRadius() { return this.defaultEntityRadius; } @@ -2404,7 +2404,7 @@ public void setDefaultCreateEntities(boolean create, boolean notify) { * * @see #getDefaultEntityRadius() */ - public void setDefaultEntityRadius(/*@NonNegative*/ int radius) { + public void setDefaultEntityRadius(@NonNegative int radius) { this.defaultEntityRadius = radius; } @@ -2417,7 +2417,7 @@ public void setDefaultEntityRadius(/*@NonNegative*/ int radius) { * * @since 1.0.11 */ - public Shape lookupLegendShape(/*@NonNegative*/ int series) { + public Shape lookupLegendShape(@NonNegative int series) { Shape result = getLegendShape(series); if (result == null) { result = this.defaultLegendShape; @@ -2440,7 +2440,7 @@ public Shape lookupLegendShape(/*@NonNegative*/ int series) { * * @since 1.0.11 */ - public Shape getLegendShape(/*@NonNegative*/ int series) { + public Shape getLegendShape(@NonNegative int series) { return this.legendShapeList.getShape(series); } @@ -2453,7 +2453,7 @@ public Shape getLegendShape(/*@NonNegative*/ int series) { * * @since 1.0.11 */ - public void setLegendShape(/*@NonNegative*/ int series, Shape shape) { + public void setLegendShape(@NonNegative int series, Shape shape) { this.legendShapeList.setShape(series, shape); fireChangeEvent(); } @@ -2518,7 +2518,7 @@ protected void setTreatLegendShapeAsLine(boolean treatAsLine) { * * @since 1.0.11 */ - public Font lookupLegendTextFont(/*@NonNegative*/ int series) { + public Font lookupLegendTextFont(@NonNegative int series) { Font result = getLegendTextFont(series); if (result == null) { result = this.defaultLegendTextFont; @@ -2538,7 +2538,7 @@ public Font lookupLegendTextFont(/*@NonNegative*/ int series) { * * @since 1.0.11 */ - public Font getLegendTextFont(/*@NonNegative*/ int series) { + public Font getLegendTextFont(@NonNegative int series) { return this.legendTextFontMap.get(series); } @@ -2551,7 +2551,7 @@ public Font getLegendTextFont(/*@NonNegative*/ int series) { * * @since 1.0.11 */ - public void setLegendTextFont(/*@NonNegative*/ int series, Font font) { + public void setLegendTextFont(@NonNegative int series, Font font) { this.legendTextFontMap.put(series, font); fireChangeEvent(); } @@ -2590,7 +2590,7 @@ public void setDefaultLegendTextFont(Font font) { * * @since 1.0.11 */ - public Paint lookupLegendTextPaint(/*@NonNegative*/ int series) { + public Paint lookupLegendTextPaint(@NonNegative int series) { Paint result = getLegendTextPaint(series); if (result == null) { result = this.defaultLegendTextPaint; @@ -2610,7 +2610,7 @@ public Paint lookupLegendTextPaint(/*@NonNegative*/ int series) { * * @since 1.0.11 */ - public Paint getLegendTextPaint(/*@NonNegative*/ int series) { + public Paint getLegendTextPaint(@NonNegative int series) { return this.legendTextPaint.getPaint(series); } @@ -2623,7 +2623,7 @@ public Paint getLegendTextPaint(/*@NonNegative*/ int series) { * * @since 1.0.11 */ - public void setLegendTextPaint(/*@NonNegative*/ int series, Paint paint) { + public void setLegendTextPaint(@NonNegative int series, Paint paint) { this.legendTextPaint.setPaint(series, paint); fireChangeEvent(); } diff --git a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java index 0ce4f8aa4..a31cd81df 100644 --- a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java @@ -62,11 +62,11 @@ */ package org.jfree.chart.renderer; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.AlphaComposite; import java.awt.Composite; @@ -372,7 +372,7 @@ public DrawingSupplier getDrawingSupplier() { * * @return A boolean. */ - public boolean isSeriesFilled(/*@NonNegative*/ int series) { + public boolean isSeriesFilled(@NonNegative int series) { boolean result = false; Boolean b = this.seriesFilled.getBoolean(series); if (b != null) { @@ -387,7 +387,7 @@ public boolean isSeriesFilled(/*@NonNegative*/ int series) { * @param series the series index. * @param filled the flag. */ - public void setSeriesFilled(/*@NonNegative*/ int series, boolean filled) { + public void setSeriesFilled(@NonNegative int series, boolean filled) { this.seriesFilled.setBoolean(series, Boolean.valueOf(filled)); } @@ -460,7 +460,7 @@ public void setLegendLine(Shape line) { * used if {@code area} is {@code null}). */ protected void addEntity(EntityCollection entities, Shape area, - XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#3.getSeries(#4)")*/ int item, + XYDataset dataset, @NonNegative int series, @IndexFor("#3.getSeries(#4)") int item, double entityX, double entityY) { if (!getItemCreateEntity(series, item)) { return; @@ -503,7 +503,7 @@ protected void addEntity(EntityCollection entities, Shape area, @Override public void drawSeries(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, PolarPlot plot, XYDataset dataset, - /*@NonNegative*/ int seriesIndex) { + @NonNegative int seriesIndex) { final int numPoints = dataset.getItemCount(seriesIndex); if (numPoints == 0) { @@ -590,7 +590,7 @@ public void drawSeries(Graphics2D g2, Rectangle2D dataArea, if (entities != null && ShapeUtils.isPointInRect(dataArea, x, y)) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: i - 1 is an index because the i increases once on each iteration of this while loop, and the loop condition is equivalent to the length of this series - /*@IndexFor("dataset.getSeries(seriesIndex)")*/ int i1 = i - 1; + @IndexFor("dataset.getSeries(seriesIndex)") int i1 = i - 1; addEntity(entities, shape, dataset, seriesIndex, i1, x, y); } } @@ -692,7 +692,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * @return The legend item. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int series) { LegendItem result; PolarPlot plot = getPlot(); if (plot == null) { @@ -755,7 +755,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int series) { * @since 1.0.14 */ @Override - public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public XYToolTipGenerator getToolTipGenerator(@NonNegative int series, @NonNegative int item) { XYToolTipGenerator generator = (XYToolTipGenerator) this.toolTipGeneratorList.get(series); if (generator == null) { @@ -772,7 +772,7 @@ public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, /*@No * @since 1.0.14 */ @Override - public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series) { + public XYToolTipGenerator getSeriesToolTipGenerator(@NonNegative int series) { return (XYToolTipGenerator) this.toolTipGeneratorList.get(series); } @@ -785,7 +785,7 @@ public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series) * @since 1.0.14 */ @Override - public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, + public void setSeriesToolTipGenerator(@NonNegative int series, XYToolTipGenerator generator) { this.toolTipGeneratorList.set(series, generator); fireChangeEvent(); diff --git a/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java b/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java index 2213a32c4..74d818836 100644 --- a/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java +++ b/src/main/java/org/jfree/chart/renderer/LookupPaintScale.java @@ -45,7 +45,7 @@ package org.jfree.chart.renderer; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Color; import java.awt.Paint; @@ -297,11 +297,11 @@ public Paint getPaint(double value) { } // for value in bounds, do the lookup... - /*@NonNegative*/ int low = 0; + @NonNegative int low = 0; @SuppressWarnings("index") // lookupTable always has at least one element - /*@NonNegative*/ int high = this.lookupTable.size() - 1; + @NonNegative int high = this.lookupTable.size() - 1; while (high - low > 1) { - /*@NonNegative*/ int current = (low + high) / 2; + @NonNegative int current = (low + high) / 2; item = (PaintItem) this.lookupTable.get(current); if (value >= item.value) { low = current; diff --git a/src/main/java/org/jfree/chart/renderer/OutlierList.java b/src/main/java/org/jfree/chart/renderer/OutlierList.java index 2cbb9446d..2402ced8f 100644 --- a/src/main/java/org/jfree/chart/renderer/OutlierList.java +++ b/src/main/java/org/jfree/chart/renderer/OutlierList.java @@ -43,7 +43,7 @@ */ package org.jfree.chart.renderer; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.geom.Point2D; import java.util.ArrayList; @@ -104,7 +104,7 @@ public boolean add(Outlier outlier) { * * @return The item count. */ - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.outliers.size(); } diff --git a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java index ad5d1dc2f..b8bf94cdc 100644 --- a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java @@ -41,9 +41,9 @@ package org.jfree.chart.renderer; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -77,7 +77,7 @@ public interface PolarItemRenderer { */ public void drawSeries(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, PolarPlot plot, XYDataset dataset, - /*@NonNegative*/ int seriesIndex); + @NonNegative int seriesIndex); /** * Draw the angular gridlines - the spokes. @@ -109,7 +109,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * * @return The legend item. */ - public LegendItem getLegendItem(/*@NonNegative*/ int series); + public LegendItem getLegendItem(@NonNegative int series); /** * Returns the plot that this renderer has been assigned to. @@ -153,7 +153,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * * @since 1.0.14 */ - public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public XYToolTipGenerator getToolTipGenerator(@NonNegative int row, @NonNegative int column); /** * Returns the tool tip generator for a series. @@ -166,7 +166,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * * @since 1.0.14 */ - public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series); + public XYToolTipGenerator getSeriesToolTipGenerator(@NonNegative int series); /** * Sets the tool tip generator for a series and sends a @@ -179,7 +179,7 @@ public void drawRadialGridLines(Graphics2D g2, PolarPlot plot, * * @since 1.0.14 */ - public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, + public void setSeriesToolTipGenerator(@NonNegative int series, XYToolTipGenerator generator); /** diff --git a/src/main/java/org/jfree/chart/renderer/RendererUtils.java b/src/main/java/org/jfree/chart/renderer/RendererUtils.java index 999147126..747f748b5 100644 --- a/src/main/java/org/jfree/chart/renderer/RendererUtils.java +++ b/src/main/java/org/jfree/chart/renderer/RendererUtils.java @@ -44,10 +44,10 @@ package org.jfree.chart.renderer; -/*>>> + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; -*/ + import org.jfree.chart.util.Args; import org.jfree.data.DomainOrder; import org.jfree.data.xy.XYDataset; @@ -74,7 +74,7 @@ public class RendererUtils { * * @see #findLiveItemsUpperBound(XYDataset, int, double, double) */ - public static /*@NonNegative*/ int findLiveItemsLowerBound(XYDataset dataset, /*@NonNegative*/ int series, + public static @NonNegative int findLiveItemsLowerBound(XYDataset dataset, @NonNegative int series, double xLow, double xHigh) { Args.nullNotPermitted(dataset, "dataset"); if (xLow >= xHigh) { @@ -88,9 +88,9 @@ public class RendererUtils { // for data in ascending order by x-value, we are (broadly) looking // for the index of the highest x-value that is less than xLow @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @IndexFor("dataset.getSeries(series)") int low = 0; @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; + @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue >= xLow) { // special case where the lowest x-value is >= xLow @@ -117,9 +117,9 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // when the x-values are sorted in descending order, the lower // bound is found by calculating relative to the xHigh value @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @IndexFor("dataset.getSeries(series)") int low = 0; @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; + @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue <= xHigh) { return low; @@ -145,7 +145,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // but we can still skip any initial values that fall outside the // range... @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int i = 0; + @IndexFor("dataset.getSeries(series)") int i = 0; // skip any items that don't need including... double x = dataset.getXValue(series, i); int index = i; @@ -174,7 +174,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { * * @see #findLiveItemsLowerBound(XYDataset, int, double, double) */ - public static /*@NonNegative*/ int findLiveItemsUpperBound(XYDataset dataset, /*@NonNegative*/ int series, + public static @NonNegative int findLiveItemsUpperBound(XYDataset dataset, @NonNegative int series, double xLow, double xHigh) { Args.nullNotPermitted(dataset, "dataset"); if (xLow >= xHigh) { @@ -186,9 +186,9 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { } if (dataset.getDomainOrder() == DomainOrder.ASCENDING) { @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @IndexFor("dataset.getSeries(series)") int low = 0; @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; + @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > xHigh) { return low; @@ -214,9 +214,9 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // when the x-values are descending, the upper bound is found by // comparing against xLow @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @IndexFor("dataset.getSeries(series)") int low = 0; @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; + @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; int mid = (low + high) / 2; double lowValue = dataset.getXValue(series, low); if (lowValue < xLow) { @@ -244,7 +244,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // range... int index = itemCount - 1; @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item - /*@IndexFor("dataset.getSeries(series)")*/ int indexTmp = index; // skip any items that don't need including... + @IndexFor("dataset.getSeries(series)") int indexTmp = index; // skip any items that don't need including... double x = dataset.getXValue(series, indexTmp); while (index >= 0 && x > xHigh) { index--; @@ -267,17 +267,17 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { * * @return The indices of the boundary items. */ - public static /*@NonNegative*/ int /*@ArrayLen(2)*/ [] findLiveItems(XYDataset dataset, /*@NonNegative*/ int series, + public static @NonNegative int @ArrayLen(2) [] findLiveItems(XYDataset dataset, @NonNegative int series, double xLow, double xHigh) { // here we could probably be a little faster by searching for both // indices simultaneously, but I'll look at that later if it seems // like it matters... - /*@NonNegative*/ int i0 = findLiveItemsLowerBound(dataset, series, xLow, xHigh); - /*@NonNegative*/ int i1 = findLiveItemsUpperBound(dataset, series, xLow, xHigh); + @NonNegative int i0 = findLiveItemsLowerBound(dataset, series, xLow, xHigh); + @NonNegative int i1 = findLiveItemsUpperBound(dataset, series, xLow, xHigh); if (i0 > i1) { i0 = i1; } - return new /*@NonNegative*/ int[] {i0, i1}; + return new @NonNegative int[] {i0, i1}; } } diff --git a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java index 3dc160fab..b57db0c2d 100644 --- a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java @@ -43,7 +43,7 @@ */ package org.jfree.chart.renderer; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Color; import java.awt.Paint; @@ -199,7 +199,7 @@ public Paint getChipColor(Number value) { * @return The paint index. */ @SuppressWarnings("index") // paint indices are always non negative - private /*@NonNegative*/ int getPaintIndex(Number value) { + private @NonNegative int getPaintIndex(Number value) { return ((Integer) this.paintIndex.get(value)).intValue(); } diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index b70b1fbaf..924550aa6 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -111,9 +111,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.*; - */ + import java.awt.AlphaComposite; import java.awt.Composite; @@ -217,10 +217,10 @@ public abstract class AbstractCategoryItemRenderer extends AbstractRenderer private CategorySeriesLabelGenerator legendItemURLGenerator; /** The number of rows in the dataset (temporary record). */ - private transient /*@NonNegative*/ int rowCount; + private transient @NonNegative int rowCount; /** The number of columns in the dataset (temporary record). */ - private transient /*@NonNegative*/ int columnCount; + private transient @NonNegative int columnCount; /** * Creates a new renderer with no tool tip generator and no URL generator. @@ -247,7 +247,7 @@ protected AbstractCategoryItemRenderer() { * @return The pass count. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 1; } @@ -294,7 +294,7 @@ public void setPlot(CategoryPlot plot) { * @return The generator (possibly {@code null}). */ @Override - public CategoryItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int row, + public CategoryItemLabelGenerator getItemLabelGenerator(@NonNegative int row, int column) { return getSeriesItemLabelGenerator(row); } @@ -309,7 +309,7 @@ public CategoryItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int row * @see #setSeriesItemLabelGenerator(int, CategoryItemLabelGenerator) */ @Override - public CategoryItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int series) { + public CategoryItemLabelGenerator getSeriesItemLabelGenerator(@NonNegative int series) { // otherwise look up the generator table CategoryItemLabelGenerator generator = this.itemLabelGeneratorMap.get( @@ -330,7 +330,7 @@ public CategoryItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ i * @see #getSeriesItemLabelGenerator(int) */ @Override - public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, + public void setSeriesItemLabelGenerator(@NonNegative int series, CategoryItemLabelGenerator generator) { setSeriesItemLabelGenerator(series, generator, true); } @@ -346,7 +346,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * @see #getSeriesItemLabelGenerator(int) */ @Override - public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, + public void setSeriesItemLabelGenerator(@NonNegative int series, CategoryItemLabelGenerator generator, boolean notify) { this.itemLabelGeneratorMap.put(series, generator); if (notify) { @@ -413,7 +413,7 @@ public void setDefaultItemLabelGenerator( * @return The generator (possibly {@code null}). */ @Override - public CategoryToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public CategoryToolTipGenerator getToolTipGenerator(@NonNegative int row, @NonNegative int column) { CategoryToolTipGenerator result = getSeriesToolTipGenerator(row); if (result == null) { @@ -433,7 +433,7 @@ public CategoryToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /* * @see #setSeriesToolTipGenerator(int, CategoryToolTipGenerator) */ @Override - public CategoryToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series) { + public CategoryToolTipGenerator getSeriesToolTipGenerator(@NonNegative int series) { return this.toolTipGeneratorMap.get(series); } @@ -447,7 +447,7 @@ public CategoryToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int s * @see #getSeriesToolTipGenerator(int) */ @Override - public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, + public void setSeriesToolTipGenerator(@NonNegative int series, CategoryToolTipGenerator generator) { setSeriesToolTipGenerator(series, generator, true); } @@ -463,7 +463,7 @@ public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, * @see #getSeriesToolTipGenerator(int) */ @Override - public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, + public void setSeriesToolTipGenerator(@NonNegative int series, CategoryToolTipGenerator generator, boolean notify) { this.toolTipGeneratorMap.put(series, generator); if (notify) { @@ -526,7 +526,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, boole * @return The URL generator. */ @Override - public CategoryURLGenerator getItemURLGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public CategoryURLGenerator getItemURLGenerator(@NonNegative int row, @NonNegative int column) { return getSeriesItemURLGenerator(row); } @@ -540,7 +540,7 @@ public CategoryURLGenerator getItemURLGenerator(/*@NonNegative*/ int row, /*@Non * @see #setSeriesItemURLGenerator(int, CategoryURLGenerator) */ @Override - public CategoryURLGenerator getSeriesItemURLGenerator(/*@NonNegative*/ int series) { + public CategoryURLGenerator getSeriesItemURLGenerator(@NonNegative int series) { // otherwise look up the generator table CategoryURLGenerator generator = this.itemURLGeneratorMap.get(series); if (generator == null) { @@ -559,7 +559,7 @@ public CategoryURLGenerator getSeriesItemURLGenerator(/*@NonNegative*/ int serie * @see #getSeriesItemURLGenerator(int) */ @Override - public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, + public void setSeriesItemURLGenerator(@NonNegative int series, CategoryURLGenerator generator) { setSeriesItemURLGenerator(series, generator, true); } @@ -575,7 +575,7 @@ public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, * @see #getSeriesItemURLGenerator(int) */ @Override - public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, + public void setSeriesItemURLGenerator(@NonNegative int series, CategoryURLGenerator generator, boolean notify) { this.itemURLGeneratorMap.put(series, generator); if (notify) { @@ -631,7 +631,7 @@ public void setDefaultItemURLGenerator(CategoryURLGenerator generator, boolean n * * @return The row count. */ - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.rowCount; } @@ -641,7 +641,7 @@ public void setDefaultItemURLGenerator(CategoryURLGenerator generator, boolean n * * @return The column count. */ - public /*@NonNegative*/ int getColumnCount() { + public @NonNegative int getColumnCount() { return this.columnCount; } @@ -678,7 +678,7 @@ protected CategoryItemRendererState createState(PlotRenderingInfo info) { */ @Override public CategoryItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, CategoryPlot plot, /*@NonNegative*/ int rendererIndex, + Rectangle2D dataArea, CategoryPlot plot, @NonNegative int rendererIndex, PlotRenderingInfo info) { setPlot(plot); @@ -698,14 +698,14 @@ public CategoryItemRendererState initialise(Graphics2D g2, for (int row = 0; row < rowCount; row++) { if (isSeriesVisible(row)) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: visibleSeriesCount is incremented at most as many times as row, which is an index - /*@IndexFor("visibleSeriesTemp")*/ int visibleSeriesCountTemp = visibleSeriesCount; + @IndexFor("visibleSeriesTemp") int visibleSeriesCountTemp = visibleSeriesCount; visibleSeriesTemp[visibleSeriesCountTemp] = row; visibleSeriesCount++; } } - /*@NonNegative*/ int[] visibleSeries = new int[visibleSeriesCount]; + @NonNegative int[] visibleSeries = new int[visibleSeriesCount]; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: visibleSeriesCount is incremented at most as many times as row, which is an index - /*@IndexOrHigh({"visibleSeriesTemp", "visibleSeries"})*/ int visibleSeriesCountTemp = visibleSeriesCount; + @IndexOrHigh({"visibleSeriesTemp", "visibleSeries"}) int visibleSeriesCountTemp = visibleSeriesCount; System.arraycopy(visibleSeriesTemp, 0, visibleSeries, 0, visibleSeriesCountTemp); state.setVisibleSeriesArray(visibleSeries); @@ -1256,7 +1256,7 @@ protected Point2D calculateRangeMarkerTextAnchorPoint(Graphics2D g2, * @see #getLegendItems() */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { CategoryPlot p = getPlot(); if (p == null) { @@ -1403,7 +1403,7 @@ public DrawingSupplier getDrawingSupplier() { */ protected void updateCrosshairValues(CategoryCrosshairState crosshairState, Comparable rowKey, Comparable columnKey, double value, - /*@NonNegative*/ int datasetIndex, + @NonNegative int datasetIndex, double transX, double transY, PlotOrientation orientation) { Args.nullNotPermitted(orientation, "orientation"); @@ -1435,7 +1435,7 @@ protected void updateCrosshairValues(CategoryCrosshairState crosshairState, * label position). */ protected void drawItemLabel(Graphics2D g2, PlotOrientation orientation, - CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + CategoryDataset dataset, @NonNegative int row, @NonNegative int column, double x, double y, boolean negative) { CategoryItemLabelGenerator generator = getItemLabelGenerator(row, @@ -1554,7 +1554,7 @@ public Object clone() throws CloneNotSupportedException { * * @return A domain axis. */ - protected CategoryAxis getDomainAxis(CategoryPlot plot, /*@NonNegative*/ int index) { + protected CategoryAxis getDomainAxis(CategoryPlot plot, @NonNegative int index) { CategoryAxis result = plot.getDomainAxis(index); if (result == null) { result = plot.getDomainAxis(); @@ -1570,7 +1570,7 @@ protected CategoryAxis getDomainAxis(CategoryPlot plot, /*@NonNegative*/ int ind * * @return A range axis. */ - protected ValueAxis getRangeAxis(CategoryPlot plot, /*@NonNegative*/ int index) { + protected ValueAxis getRangeAxis(CategoryPlot plot, @NonNegative int index) { ValueAxis result = plot.getRangeAxis(index); if (result == null) { result = plot.getRangeAxis(); @@ -1593,7 +1593,7 @@ public LegendItemCollection getLegendItems() { return result; } @SuppressWarnings("index") // guaranteed index: this.plot.getIndexOf(this) is always non negative, since this.plot is the plot associated with the renderer - /*@NonNegative*/ int index = this.plot.getIndexOf(this); + @NonNegative int index = this.plot.getIndexOf(this); CategoryDataset dataset = this.plot.getDataset(index); if (dataset == null) { return result; @@ -1708,7 +1708,7 @@ public void setLegendItemURLGenerator( * @param hotspot the hotspot ({@code null} not permitted). */ protected void addItemEntity(EntityCollection entities, - CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, Shape hotspot) { + CategoryDataset dataset, @NonNegative int row, @NonNegative int column, Shape hotspot) { Args.nullNotPermitted(hotspot, "hotspot"); if (!getItemCreateEntity(row, column)) { return; @@ -1745,7 +1745,7 @@ protected void addItemEntity(EntityCollection entities, * @since 1.0.13 */ protected void addEntity(EntityCollection entities, Shape hotspot, - CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + CategoryDataset dataset, @NonNegative int row, @NonNegative int column, double entityX, double entityY) { if (!getItemCreateEntity(row, column)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java index fd402cd08..acde54c6e 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java @@ -74,9 +74,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Paint; @@ -161,7 +161,7 @@ public void setEndType(AreaRendererEndType type) { * @return The legend item. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { // if there is no plot, there is no dataset to access... CategoryPlot cp = getPlot(); @@ -225,7 +225,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegativ @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { // do nothing if item is not visible or null @@ -325,7 +325,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { // submit the current data point as a crosshair candidate @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), yy1, datasetIndex, x1, y1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/category/BarPainter.java b/src/main/java/org/jfree/chart/renderer/category/BarPainter.java index 48b3b77d5..869126a0d 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarPainter.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.geom.RectangularShape; @@ -73,7 +73,7 @@ public interface BarPainter { * @param base the base of the bar. */ public void paintBar(Graphics2D g2, BarRenderer renderer, - /*@NonNegative*/ int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base); + @NonNegative int row, @NonNegative int column, RectangularShape bar, RectangleEdge base); /** * Paints the shadow for a single bar on behalf of a renderer. @@ -87,7 +87,7 @@ public void paintBar(Graphics2D g2, BarRenderer renderer, * @param pegShadow peg the shadow to the base of the bar? */ public void paintBarShadow(Graphics2D g2, BarRenderer renderer, - /*@NonNegative*/ int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, + @NonNegative int row, @NonNegative int column, RectangularShape bar, RectangleEdge base, boolean pegShadow); } diff --git a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java index ac36ef620..eef2a90a2 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java @@ -95,11 +95,11 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.common.value.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -748,7 +748,7 @@ public double getUpperClip() { */ @Override public CategoryItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, CategoryPlot plot, /*@NonNegative*/ int rendererIndex, + Rectangle2D dataArea, CategoryPlot plot, @NonNegative int rendererIndex, PlotRenderingInfo info) { CategoryItemRendererState state = super.initialise(g2, dataArea, plot, @@ -776,7 +776,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, */ protected void calculateBarWidth(CategoryPlot plot, Rectangle2D dataArea, - /*@NonNegative*/ int rendererIndex, + @NonNegative int rendererIndex, CategoryItemRendererState state) { CategoryAxis domainAxis = getDomainAxis(plot, rendererIndex); @@ -832,7 +832,7 @@ else if (orientation == PlotOrientation.VERTICAL) { protected double calculateBarW0(CategoryPlot plot, PlotOrientation orientation, Rectangle2D dataArea, CategoryAxis domainAxis, CategoryItemRendererState state, - /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @NonNegative int row, @NonNegative int column) { // calculate bar width... double space; if (orientation == PlotOrientation.HORIZONTAL) { @@ -870,7 +870,7 @@ protected double calculateBarW0(CategoryPlot plot, * @return The coordinates for each end of the bar (or {@code null} if * the bar is not visible for the current axis range). */ - protected double /*@ArrayLen(2)*/ [] calculateBarL0L1(double value) { + protected double @ArrayLen(2) [] calculateBarL0L1(double value) { double lclip = getLowerClip(); double uclip = getUpperClip(); double barLow = Math.min(this.base, value); @@ -922,7 +922,7 @@ public Range findRangeBounds(CategoryDataset dataset, * @return The legend item (possibly {@code null}). */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { CategoryPlot cp = getPlot(); if (cp == null) { @@ -989,8 +989,8 @@ urlText, true, shape, true, paint, isDrawBarOutline(), @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, int pass) { + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, + @NonNegative int column, int pass) { // nothing is drawn if the row index is not included in the list with // the indices of the visible rows... @@ -1086,7 +1086,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, // submit the current data point as a crosshair candidate @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), value, datasetIndex, barW0, barL0, orientation); @@ -1110,7 +1110,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, * @return The width of one series. */ protected double calculateSeriesWidth(double space, CategoryAxis axis, - int categories, /*@NonNegative*/ int series) { + int categories, @NonNegative int series) { double factor = 1.0 - getItemMargin() - axis.getLowerMargin() - axis.getUpperMargin(); if (categories > 1) { @@ -1134,8 +1134,8 @@ protected double calculateSeriesWidth(double space, CategoryAxis axis, */ protected void drawItemLabel(Graphics2D g2, CategoryDataset data, - /*@NonNegative*/ int row, - /*@NonNegative*/ int column, + @NonNegative int row, + @NonNegative int column, CategoryPlot plot, CategoryItemLabelGenerator generator, Rectangle2D bar, diff --git a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java index 41afd1eaf..9535936a2 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java @@ -91,9 +91,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Color; import java.awt.Graphics2D; @@ -455,7 +455,7 @@ public void setWhiskerWidth(double width) { * @return The legend item (possibly {@code null}). */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { CategoryPlot cp = getPlot(); if (cp == null) { @@ -527,7 +527,7 @@ public Range findRangeBounds(CategoryDataset dataset) { */ @Override public CategoryItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, CategoryPlot plot, /*@NonNegative*/ int rendererIndex, + Rectangle2D dataArea, CategoryPlot plot, @NonNegative int rendererIndex, PlotRenderingInfo info) { CategoryItemRendererState state = super.initialise(g2, dataArea, plot, @@ -588,7 +588,7 @@ else if (orientation == PlotOrientation.VERTICAL) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { // do nothing if item is not visible @@ -634,7 +634,7 @@ else if (orientation == PlotOrientation.VERTICAL) { public void drawHorizontalItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, - CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + CategoryDataset dataset, @NonNegative int row, @NonNegative int column) { BoxAndWhiskerCategoryDataset bawDataset = (BoxAndWhiskerCategoryDataset) dataset; @@ -777,7 +777,7 @@ public void drawHorizontalItem(Graphics2D g2, */ public void drawVerticalItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column) { BoxAndWhiskerCategoryDataset bawDataset = (BoxAndWhiskerCategoryDataset) dataset; diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java index 85e781d4b..741b71544 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java @@ -97,9 +97,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Font; import java.awt.Graphics2D; @@ -152,7 +152,7 @@ public interface CategoryItemRenderer extends LegendItemSource { * * @return The pass count. */ - public /*@NonNegative*/ int getPassCount(); + public @NonNegative int getPassCount(); /** * Returns the plot that the renderer has been assigned to (where @@ -223,7 +223,7 @@ public interface CategoryItemRenderer extends LegendItemSource { public CategoryItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, CategoryPlot plot, - /*@NonNegative*/ int rendererIndex, + @NonNegative int rendererIndex, PlotRenderingInfo info); /** @@ -235,7 +235,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @return A boolean. */ - public boolean getItemVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public boolean getItemVisible(@NonNegative int series, @NonNegative int item); /** * Returns a boolean that indicates whether or not the specified series @@ -245,7 +245,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @return A boolean. */ - public boolean isSeriesVisible(/*@NonNegative*/ int series); + public boolean isSeriesVisible(@NonNegative int series); /** * Returns the flag that controls whether a series is visible. @@ -256,7 +256,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #setSeriesVisible(int, Boolean) */ - public Boolean getSeriesVisible(/*@NonNegative*/ int series); + public Boolean getSeriesVisible(@NonNegative int series); /** * Sets the flag that controls whether a series is visible and sends a @@ -267,7 +267,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible); + public void setSeriesVisible(@NonNegative int series, Boolean visible); /** * Sets the flag that controls whether a series is visible and, if @@ -280,7 +280,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify); + public void setSeriesVisible(@NonNegative int series, Boolean visible, boolean notify); /** * Returns the default visibility for all series. @@ -322,7 +322,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @return A boolean. */ - public boolean isSeriesVisibleInLegend(/*@NonNegative*/ int series); + public boolean isSeriesVisibleInLegend(@NonNegative int series); /** * Returns the flag that controls whether a series is visible in the @@ -336,7 +336,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #setSeriesVisibleInLegend(int, Boolean) */ - public Boolean getSeriesVisibleInLegend(/*@NonNegative*/ int series); + public Boolean getSeriesVisibleInLegend(@NonNegative int series); /** * Sets the flag that controls whether a series is visible in the legend @@ -347,7 +347,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible); + public void setSeriesVisibleInLegend(@NonNegative int series, Boolean visible); /** * Sets the flag that controls whether a series is visible in the legend @@ -360,7 +360,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible, + public void setSeriesVisibleInLegend(@NonNegative int series, Boolean visible, boolean notify); /** @@ -404,7 +404,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Paint getItemPaint(@NonNegative int row, @NonNegative int column); /** * Returns the paint used to fill an item drawn by the renderer. @@ -415,7 +415,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesPaint(int, Paint) */ - public Paint getSeriesPaint(/*@NonNegative*/ int series); + public Paint getSeriesPaint(@NonNegative int series); /** * Sets the paint used for a series and sends a {@link RendererChangeEvent} @@ -426,9 +426,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint); + public void setSeriesPaint(@NonNegative int series, Paint paint); - public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint, boolean notify); + public void setSeriesPaint(@NonNegative int series, Paint paint, boolean notify); /** * Returns the default paint. @@ -461,7 +461,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemFillPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Paint getItemFillPaint(@NonNegative int row, @NonNegative int column); /** * Returns the paint used to fill an item drawn by the renderer. @@ -472,7 +472,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesFillPaint(int, Paint) */ - public Paint getSeriesFillPaint(/*@NonNegative*/ int series); + public Paint getSeriesFillPaint(@NonNegative int series); /** * Sets the paint used for a series outline and sends a @@ -483,7 +483,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesFillPaint(int) */ - public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint); + public void setSeriesFillPaint(@NonNegative int series, Paint paint); /** * Returns the default outline paint. @@ -514,7 +514,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemOutlinePaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Paint getItemOutlinePaint(@NonNegative int row, @NonNegative int column); /** * Returns the paint used to outline an item drawn by the renderer. @@ -525,7 +525,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesOutlinePaint(int, Paint) */ - public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series); + public Paint getSeriesOutlinePaint(@NonNegative int series); /** * Sets the paint used for a series outline and sends a @@ -536,9 +536,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesOutlinePaint(int) */ - public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint); + public void setSeriesOutlinePaint(@NonNegative int series, Paint paint); - public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint, boolean notify); + public void setSeriesOutlinePaint(@NonNegative int series, Paint paint, boolean notify); /** * Returns the default outline paint. @@ -571,7 +571,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The stroke (never {@code null}). */ - public Stroke getItemStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Stroke getItemStroke(@NonNegative int row, @NonNegative int column); /** * Returns the stroke used to draw the items in a series. @@ -582,7 +582,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesStroke(int, Stroke) */ - public Stroke getSeriesStroke(/*@NonNegative*/ int series); + public Stroke getSeriesStroke(@NonNegative int series); /** * Sets the stroke used for a series and sends a @@ -593,9 +593,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesStroke(int) */ - public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke); + public void setSeriesStroke(@NonNegative int series, Stroke stroke); - public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify); + public void setSeriesStroke(@NonNegative int series, Stroke stroke, boolean notify); /** * Returns the default stroke. @@ -632,7 +632,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The stroke (never {@code null}). */ - public Stroke getItemOutlineStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Stroke getItemOutlineStroke(@NonNegative int row, @NonNegative int column); /** * Returns the stroke used to outline the items in a series. @@ -643,7 +643,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesOutlineStroke(int, Stroke) */ - public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series); + public Stroke getSeriesOutlineStroke(@NonNegative int series); /** * Sets the outline stroke used for a series and sends a @@ -654,9 +654,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesOutlineStroke(int) */ - public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke); + public void setSeriesOutlineStroke(@NonNegative int series, Stroke stroke); - public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify); + public void setSeriesOutlineStroke(@NonNegative int series, Stroke stroke, boolean notify); /** * Returns the default outline stroke. @@ -689,7 +689,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The shape (never {@code null}). */ - public Shape getItemShape(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Shape getItemShape(@NonNegative int row, @NonNegative int column); /** * Returns a shape used to represent the items in a series. @@ -700,7 +700,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesShape(int, Shape) */ - public Shape getSeriesShape(/*@NonNegative*/ int series); + public Shape getSeriesShape(@NonNegative int series); /** * Sets the shape used for a series and sends a {@link RendererChangeEvent} @@ -711,9 +711,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesShape(int) */ - public void setSeriesShape(/*@NonNegative*/ int series, Shape shape); + public void setSeriesShape(@NonNegative int series, Shape shape); - public void setSeriesShape(/*@NonNegative*/ int series, Shape shape, boolean notify); + public void setSeriesShape(@NonNegative int series, Shape shape, boolean notify); /** * Returns the default shape. @@ -747,7 +747,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return A boolean. */ - public boolean isItemLabelVisible(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public boolean isItemLabelVisible(@NonNegative int row, @NonNegative int column); /** * Returns {@code true} if the item labels for a series are visible, @@ -759,7 +759,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesItemLabelsVisible(int, Boolean) */ - public boolean isSeriesItemLabelsVisible(/*@NonNegative*/ int series); + public boolean isSeriesItemLabelsVisible(@NonNegative int series); /** * Sets a flag that controls the visibility of the item labels for a series. @@ -769,7 +769,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, boolean visible); + public void setSeriesItemLabelsVisible(@NonNegative int series, boolean visible); /** * Sets a flag that controls the visibility of the item labels for a series. @@ -779,7 +779,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible); + public void setSeriesItemLabelsVisible(@NonNegative int series, Boolean visible); /** * Sets the visibility of item labels for a series and, if requested, sends @@ -792,7 +792,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible, + public void setSeriesItemLabelsVisible(@NonNegative int series, Boolean visible, boolean notify); /** @@ -839,7 +839,7 @@ public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visi * * @return The generator (possibly {@code null}). */ - public CategoryItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int series, + public CategoryItemLabelGenerator getItemLabelGenerator(@NonNegative int series, int item); /** @@ -851,7 +851,7 @@ public CategoryItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int ser * * @see #setSeriesItemLabelGenerator(int, CategoryItemLabelGenerator) */ - public CategoryItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int series); + public CategoryItemLabelGenerator getSeriesItemLabelGenerator(@NonNegative int series); /** * Sets the item label generator for a series and sends a @@ -862,10 +862,10 @@ public CategoryItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int ser * * @see #getSeriesItemLabelGenerator(int) */ - public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, + public void setSeriesItemLabelGenerator(@NonNegative int series, CategoryItemLabelGenerator generator); - public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, + public void setSeriesItemLabelGenerator(@NonNegative int series, CategoryItemLabelGenerator generator, boolean notify); /** @@ -902,7 +902,7 @@ public void setDefaultItemLabelGenerator(CategoryItemLabelGenerator generator, * * @return The generator (possibly {@code null}). */ - public CategoryToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public CategoryToolTipGenerator getToolTipGenerator(@NonNegative int row, @NonNegative int column); /** * Returns the tool tip generator for the specified series (a "layer 1" @@ -914,7 +914,7 @@ public void setDefaultItemLabelGenerator(CategoryItemLabelGenerator generator, * * @see #setSeriesToolTipGenerator(int, CategoryToolTipGenerator) */ - public CategoryToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series); + public CategoryToolTipGenerator getSeriesToolTipGenerator(@NonNegative int series); /** * Sets the tool tip generator for a series and sends a @@ -926,10 +926,10 @@ public void setDefaultItemLabelGenerator(CategoryItemLabelGenerator generator, * * @see #getSeriesToolTipGenerator(int) */ - public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, + public void setSeriesToolTipGenerator(@NonNegative int series, CategoryToolTipGenerator generator); - public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, + public void setSeriesToolTipGenerator(@NonNegative int series, CategoryToolTipGenerator generator, boolean notify); /** @@ -965,7 +965,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @return The font (never {@code null}). */ - public Font getItemLabelFont(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Font getItemLabelFont(@NonNegative int row, @NonNegative int column); /** * Returns the font for all the item labels in a series. @@ -976,7 +976,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #setSeriesItemLabelFont(int, Font) */ - public Font getSeriesItemLabelFont(/*@NonNegative*/ int series); + public Font getSeriesItemLabelFont(@NonNegative int series); /** * Sets the item label font for a series and sends a @@ -987,9 +987,9 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #getSeriesItemLabelFont(int) */ - public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font); + public void setSeriesItemLabelFont(@NonNegative int series, Font font); - public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font, boolean notify); + public void setSeriesItemLabelFont(@NonNegative int series, Font font, boolean notify); /** * Returns the default item label font (this is used when no other font @@ -1023,7 +1023,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @return The paint (never {@code null}). */ - public Paint getItemLabelPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Paint getItemLabelPaint(@NonNegative int row, @NonNegative int column); /** * Returns the paint used to draw the item labels for a series. @@ -1034,7 +1034,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #setSeriesItemLabelPaint(int, Paint) */ - public Paint getSeriesItemLabelPaint(/*@NonNegative*/ int series); + public Paint getSeriesItemLabelPaint(@NonNegative int series); /** * Sets the item label paint for a series and sends a @@ -1045,9 +1045,9 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #getSeriesItemLabelPaint(int) */ - public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint); + public void setSeriesItemLabelPaint(@NonNegative int series, Paint paint); - public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint, boolean notify); + public void setSeriesItemLabelPaint(@NonNegative int series, Paint paint, boolean notify); /** * Returns the default item label paint. @@ -1080,7 +1080,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getPositiveItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public ItemLabelPosition getPositiveItemLabelPosition(@NonNegative int row, @NonNegative int column); /** * Returns the item label position for all positive values in a series. @@ -1091,7 +1091,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #setSeriesPositiveItemLabelPosition(int, ItemLabelPosition) */ - public ItemLabelPosition getSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series); + public ItemLabelPosition getSeriesPositiveItemLabelPosition(@NonNegative int series); /** * Sets the item label position for all positive values in a series and @@ -1102,7 +1102,7 @@ public void setDefaultToolTipGenerator(CategoryToolTipGenerator generator, * * @see #getSeriesPositiveItemLabelPosition(int) */ - public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesPositiveItemLabelPosition(@NonNegative int series, ItemLabelPosition position); /** @@ -1116,7 +1116,7 @@ public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, * * @see #getSeriesPositiveItemLabelPosition(int) */ - public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesPositiveItemLabelPosition(@NonNegative int series, ItemLabelPosition position, boolean notify); /** @@ -1162,7 +1162,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @return The item label position. */ - public ItemLabelPosition getNegativeItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public ItemLabelPosition getNegativeItemLabelPosition(@NonNegative int row, @NonNegative int column); /** * Returns the item label position for all negative values in a series. @@ -1173,7 +1173,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @see #setSeriesNegativeItemLabelPosition(int, ItemLabelPosition) */ - public ItemLabelPosition getSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series); + public ItemLabelPosition getSeriesNegativeItemLabelPosition(@NonNegative int series); /** * Sets the item label position for negative values in a series and sends a @@ -1184,7 +1184,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @see #getSeriesNegativeItemLabelPosition(int) */ - public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesNegativeItemLabelPosition(@NonNegative int series, ItemLabelPosition position); /** @@ -1198,7 +1198,7 @@ public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, * * @see #getSeriesNegativeItemLabelPosition(int) */ - public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesNegativeItemLabelPosition(@NonNegative int series, ItemLabelPosition position, boolean notify); /** @@ -1234,13 +1234,13 @@ public void setDefaultNegativeItemLabelPosition(ItemLabelPosition position, // CREATE ENTITIES - public boolean getItemCreateEntity(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public boolean getItemCreateEntity(@NonNegative int series, @NonNegative int item); - public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series); + public Boolean getSeriesCreateEntities(@NonNegative int series); - public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create); + public void setSeriesCreateEntities(@NonNegative int series, Boolean create); - public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, + public void setSeriesCreateEntities(@NonNegative int series, Boolean create, boolean notify); public boolean getDefaultCreateEntities(); @@ -1260,7 +1260,7 @@ public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, * * @return The item URL generator. */ - public CategoryURLGenerator getItemURLGenerator(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public CategoryURLGenerator getItemURLGenerator(@NonNegative int series, @NonNegative int item); /** * Returns the item URL generator for a series. @@ -1271,7 +1271,7 @@ public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, * * @see #setSeriesItemURLGenerator(int, CategoryURLGenerator) */ - public CategoryURLGenerator getSeriesItemURLGenerator(/*@NonNegative*/ int series); + public CategoryURLGenerator getSeriesItemURLGenerator(@NonNegative int series); /** * Sets the item URL generator for a series. @@ -1281,10 +1281,10 @@ public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, * * @see #getSeriesItemURLGenerator(int) */ - public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, + public void setSeriesItemURLGenerator(@NonNegative int series, CategoryURLGenerator generator); - public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, + public void setSeriesItemURLGenerator(@NonNegative int series, CategoryURLGenerator generator, boolean notify); /** @@ -1318,7 +1318,7 @@ public void setSeriesItemURLGenerator(/*@NonNegative*/ int series, * * @return The legend item (possibly {@code null}). */ - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series); + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series); /** * Draws a background for the data area. @@ -1356,7 +1356,7 @@ public void drawOutline(Graphics2D g2, CategoryPlot plot, */ public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass); /** diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java index 902a6088e..21f3a545d 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java @@ -44,7 +44,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import org.jfree.chart.plot.CategoryCrosshairState; import org.jfree.chart.plot.PlotRenderingInfo; @@ -63,7 +63,7 @@ public class CategoryItemRendererState extends RendererState { private double seriesRunningTotal; /** The array with the indices of the visible series.*/ - private /*@NonNegative*/ int[] visibleSeries; + private @NonNegative int[] visibleSeries; /** * State information for crosshairs in the plot (this is updated by the @@ -169,7 +169,7 @@ public void setCrosshairState(CategoryCrosshairState state) { * * @since 1.0.13 */ - public int getVisibleSeriesIndex(/*@NonNegative*/ int rowIndex) { + public int getVisibleSeriesIndex(@NonNegative int rowIndex) { if (this.visibleSeries == null) { return rowIndex; } @@ -206,7 +206,7 @@ public int getVisibleSeriesCount() { * @since 1.0.13 */ @SuppressWarnings("index") // this.visibleSeries only contains nonnegatives. The result array is a copy of this array - public /*@NonNegative*/ int[] getVisibleSeriesArray() { + public @NonNegative int[] getVisibleSeriesArray() { if (this.visibleSeries == null) { return null; } @@ -223,7 +223,7 @@ public int getVisibleSeriesCount() { * * @since 1.0.13 */ - public void setVisibleSeriesArray(/*@NonNegative*/ int[] visibleSeries) { + public void setVisibleSeriesArray(@NonNegative int[] visibleSeries) { this.visibleSeries = visibleSeries; } diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java index 21eb4e347..bb0d75a0f 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java @@ -51,9 +51,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Paint; @@ -170,7 +170,7 @@ public void setStagger(boolean shouldStagger) { * @return The legend item. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { CategoryPlot p = getPlot(); if (p == null) { @@ -277,8 +277,8 @@ else if (orientation == PlotOrientation.HORIZONTAL) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, int pass) { + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, + @NonNegative int column, int pass) { // do nothing if item is not visible if (!getItemVisible(row, column)) { diff --git a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java index ad8c24892..ee13e52be 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java @@ -54,7 +54,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; import java.awt.Graphics2D; @@ -243,8 +243,8 @@ public void setEndPercent(double percent) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, int pass) { + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, + @NonNegative int column, int pass) { if (dataset instanceof GanttCategoryDataset) { GanttCategoryDataset gcd = (GanttCategoryDataset) dataset; @@ -278,8 +278,8 @@ protected void drawTasks(Graphics2D g2, CategoryAxis domainAxis, ValueAxis rangeAxis, GanttCategoryDataset dataset, - /*@NonNegative*/ int row, - /*@NonNegative*/ int column) { + @NonNegative int row, + @NonNegative int column) { int count = dataset.getSubIntervalCount(row, column); if (count == 0) { @@ -385,7 +385,7 @@ else if (orientation == PlotOrientation.VERTICAL) { if (subinterval == count - 1) { // submit the current data point as a crosshair candidate @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); Comparable columnKey = dataset.getColumnKey(column); Comparable rowKey = dataset.getRowKey(row); double xx = domainAxis.getCategorySeriesMiddle(columnKey, @@ -427,8 +427,8 @@ protected void drawTask(Graphics2D g2, CategoryAxis domainAxis, ValueAxis rangeAxis, GanttCategoryDataset dataset, - /*@NonNegative*/ int row, - /*@NonNegative*/ int column) { + @NonNegative int row, + @NonNegative int column) { PlotOrientation orientation = plot.getOrientation(); RectangleEdge rangeAxisLocation = plot.getRangeAxisEdge(); @@ -536,7 +536,7 @@ else if (plot.getOrientation() == PlotOrientation.VERTICAL) { // submit the current data point as a crosshair candidate @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); Comparable columnKey = dataset.getColumnKey(column); Comparable rowKey = dataset.getRowKey(row); double xx = domainAxis.getCategorySeriesMiddle(columnKey, rowKey, diff --git a/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java b/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java index 62996bc76..98403c9af 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java @@ -41,9 +41,9 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; import java.awt.GradientPaint; @@ -106,8 +106,8 @@ public GradientBarPainter(double g1, double g2, double g3) { * bar. */ @Override - public void paintBar(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base) { + public void paintBar(Graphics2D g2, BarRenderer renderer, @NonNegative int row, + @NonNegative int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); @@ -208,8 +208,8 @@ else if (base == RectangleEdge.LEFT || base == RectangleEdge.RIGHT) { * @param pegShadow peg the shadow to the base of the bar? */ @Override - public void paintBarShadow(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, + public void paintBarShadow(Graphics2D g2, BarRenderer renderer, @NonNegative int row, + @NonNegative int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { // handle a special case - if the bar colour has alpha == 0, it is @@ -292,7 +292,7 @@ else if (base == RectangleEdge.RIGHT) { * * @return An array containing four subregions. */ - private Rectangle2D /*@ArrayLen(4)*/ [] splitVerticalBar(RectangularShape bar, double a, + private Rectangle2D @ArrayLen(4) [] splitVerticalBar(RectangularShape bar, double a, double b, double c) { Rectangle2D[] result = new Rectangle2D[4]; double x0 = bar.getMinX(); @@ -321,7 +321,7 @@ else if (base == RectangleEdge.RIGHT) { * * @return An array containing four subregions. */ - private Rectangle2D /*@ArrayLen(4)*/ [] splitHorizontalBar(RectangularShape bar, double a, + private Rectangle2D @ArrayLen(4) [] splitHorizontalBar(RectangularShape bar, double a, double b, double c) { Rectangle2D[] result = new Rectangle2D[4]; double y0 = bar.getMinY(); diff --git a/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java index 4ab965ce4..49ef6d775 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java @@ -48,7 +48,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -138,7 +138,7 @@ public Range findRangeBounds(CategoryDataset dataset) { */ @Override protected void calculateBarWidth(CategoryPlot plot, Rectangle2D dataArea, - /*@NonNegative*/ int rendererIndex, CategoryItemRendererState state) { + @NonNegative int rendererIndex, CategoryItemRendererState state) { // calculate the bar width CategoryAxis xAxis = plot.getDomainAxisForDataset(rendererIndex); @@ -197,7 +197,7 @@ else if (orientation == PlotOrientation.VERTICAL) { protected double calculateBarW0(CategoryPlot plot, PlotOrientation orientation, Rectangle2D dataArea, CategoryAxis domainAxis, CategoryItemRendererState state, - /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @NonNegative int row, @NonNegative int column) { // calculate bar width... double space; if (orientation == PlotOrientation.HORIZONTAL) { @@ -247,8 +247,8 @@ protected double calculateBarW0(CategoryPlot plot, @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, int pass) { + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, + @NonNegative int column, int pass) { // nothing is drawn for null values... Number dataValue = dataset.getValue(row, column); diff --git a/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java index 8889d0c32..74d0336c5 100644 --- a/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java @@ -68,7 +68,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -138,7 +138,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { if (dataset instanceof IntervalCategoryDataset) { @@ -167,8 +167,8 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, */ protected void drawInterval(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, IntervalCategoryDataset dataset, /*@NonNegative*/ int row, - /*@NonNegative*/ int column) { + ValueAxis rangeAxis, IntervalCategoryDataset dataset, @NonNegative int row, + @NonNegative int column) { int visibleRow = state.getVisibleSeriesIndex(row); if (visibleRow < 0) { diff --git a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java index 3c662d3fd..a304851a8 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java @@ -54,9 +54,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.GradientPaint; import java.awt.Graphics2D; @@ -109,7 +109,7 @@ public LayeredBarRenderer() { * * @return The width for the series (1.0=100%, it is the maximum). */ - public double getSeriesBarWidth(/*@NonNegative*/ int series) { + public double getSeriesBarWidth(@NonNegative int series) { double result = Double.NaN; Number n = (Number) this.seriesBarWidthList.get(series); if (n != null) { @@ -125,7 +125,7 @@ public double getSeriesBarWidth(/*@NonNegative*/ int series) { * @param width the width of the series bar in percentage (1.0=100%, it is * the maximum). */ - public void setSeriesBarWidth(/*@NonNegative*/ int series, double width) { + public void setSeriesBarWidth(@NonNegative int series, double width) { this.seriesBarWidthList.set(series, new Double(width)); } @@ -139,7 +139,7 @@ public void setSeriesBarWidth(/*@NonNegative*/ int series, double width) { */ @Override protected void calculateBarWidth(CategoryPlot plot, Rectangle2D dataArea, - /*@NonNegative*/ int rendererIndex, CategoryItemRendererState state) { + @NonNegative int rendererIndex, CategoryItemRendererState state) { // calculate the bar width - this calculation differs from the // BarRenderer calculation because the bars are layered on top of one @@ -192,7 +192,7 @@ else if (orientation == PlotOrientation.VERTICAL) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset data, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset data, @NonNegative int row, @NonNegative int column, int pass) { PlotOrientation orientation = plot.getOrientation(); @@ -222,7 +222,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, protected void drawHorizontalItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, - CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + CategoryDataset dataset, @NonNegative int row, @NonNegative int column) { // nothing is drawn for null values... Number dataValue = dataset.getValue(row, column); @@ -347,7 +347,7 @@ protected void drawHorizontalItem(Graphics2D g2, protected void drawVerticalItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, - CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + CategoryDataset dataset, @NonNegative int row, @NonNegative int column) { // nothing is drawn for null values... Number dataValue = dataset.getValue(row, column); diff --git a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java index 827070161..140f21667 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java @@ -51,9 +51,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Color; import java.awt.Graphics2D; @@ -184,7 +184,7 @@ public void setMaximumItemWidth(double percent) { */ @Override public CategoryItemRendererState initialise(Graphics2D g2, - Rectangle2D dataArea, CategoryPlot plot, /*@NonNegative*/ int rendererIndex, + Rectangle2D dataArea, CategoryPlot plot, @NonNegative int rendererIndex, PlotRenderingInfo info) { CategoryItemRendererState state = super.initialise(g2, dataArea, plot, rendererIndex, info); @@ -201,7 +201,7 @@ public CategoryItemRendererState initialise(Graphics2D g2, * @param state the renderer state. */ protected void calculateItemWidth(CategoryPlot plot, - Rectangle2D dataArea, /*@NonNegative*/ int rendererIndex, + Rectangle2D dataArea, @NonNegative int rendererIndex, CategoryItemRendererState state) { CategoryAxis domainAxis = getDomainAxis(plot, rendererIndex); @@ -254,7 +254,7 @@ protected void calculateItemWidth(CategoryPlot plot, */ protected double calculateBarW0(CategoryPlot plot, PlotOrientation orientation, Rectangle2D dataArea, - CategoryAxis domainAxis, CategoryItemRendererState state, /*@NonNegative*/ int row, + CategoryAxis domainAxis, CategoryItemRendererState state, @NonNegative int row, int column) { // calculate bar width... double space; @@ -302,7 +302,7 @@ protected double calculateBarW0(CategoryPlot plot, @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { // nothing is drawn if the row index is not included in the list with @@ -364,7 +364,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, // submit the current data point as a crosshair candidate @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), value, datasetIndex, barW0, barL, orientation); @@ -388,7 +388,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, * @return The width of one series. */ protected double calculateSeriesWidth(double space, CategoryAxis axis, - int categories, /*@NonNegative*/ int series) { + int categories, @NonNegative int series) { double factor = 1.0 - getItemMargin() - axis.getLowerMargin() - axis.getUpperMargin(); if (categories > 1) { diff --git a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java index caaacad47..d4cd6b639 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java @@ -94,9 +94,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Paint; @@ -234,7 +234,7 @@ public LineAndShapeRenderer(boolean lines, boolean shapes) { * * @return A boolean. */ - public boolean getItemLineVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemLineVisible(@NonNegative int series, @NonNegative int item) { Boolean flag = getSeriesLinesVisible(series); if (flag != null) { return flag; @@ -252,7 +252,7 @@ public boolean getItemLineVisible(/*@NonNegative*/ int series, /*@NonNegative*/ * * @see #setSeriesLinesVisible(int, Boolean) */ - public Boolean getSeriesLinesVisible(/*@NonNegative*/ int series) { + public Boolean getSeriesLinesVisible(@NonNegative int series) { return this.seriesLinesVisible.getBoolean(series); } @@ -265,7 +265,7 @@ public Boolean getSeriesLinesVisible(/*@NonNegative*/ int series) { * * @see #getSeriesLinesVisible(int) */ - public void setSeriesLinesVisible(/*@NonNegative*/ int series, Boolean flag) { + public void setSeriesLinesVisible(@NonNegative int series, Boolean flag) { this.seriesLinesVisible.setBoolean(series, flag); fireChangeEvent(); } @@ -279,7 +279,7 @@ public void setSeriesLinesVisible(/*@NonNegative*/ int series, Boolean flag) { * * @see #getSeriesLinesVisible(int) */ - public void setSeriesLinesVisible(/*@NonNegative*/ int series, boolean visible) { + public void setSeriesLinesVisible(@NonNegative int series, boolean visible) { setSeriesLinesVisible(series, Boolean.valueOf(visible)); } @@ -318,7 +318,7 @@ public void setDefaultLinesVisible(boolean flag) { * * @return A boolean. */ - public boolean getItemShapeVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemShapeVisible(@NonNegative int series, @NonNegative int item) { Boolean flag = getSeriesShapesVisible(series); if (flag != null) { return flag; @@ -336,7 +336,7 @@ public boolean getItemShapeVisible(/*@NonNegative*/ int series, /*@NonNegative*/ * * @see #setSeriesShapesVisible(int, Boolean) */ - public Boolean getSeriesShapesVisible(/*@NonNegative*/ int series) { + public Boolean getSeriesShapesVisible(@NonNegative int series) { return this.seriesShapesVisible.getBoolean(series); } @@ -349,7 +349,7 @@ public Boolean getSeriesShapesVisible(/*@NonNegative*/ int series) { * * @see #getSeriesShapesVisible(int) */ - public void setSeriesShapesVisible(/*@NonNegative*/ int series, boolean visible) { + public void setSeriesShapesVisible(@NonNegative int series, boolean visible) { setSeriesShapesVisible(series, Boolean.valueOf(visible)); } @@ -362,7 +362,7 @@ public void setSeriesShapesVisible(/*@NonNegative*/ int series, boolean visible) * * @see #getSeriesShapesVisible(int) */ - public void setSeriesShapesVisible(/*@NonNegative*/ int series, Boolean flag) { + public void setSeriesShapesVisible(@NonNegative int series, Boolean flag) { this.seriesShapesVisible.setBoolean(series, flag); fireChangeEvent(); } @@ -459,7 +459,7 @@ public void setUseOutlinePaint(boolean use) { * * @return A boolean. */ - public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemShapeFilled(@NonNegative int series, @NonNegative int item) { return getSeriesShapesFilled(series); } @@ -471,7 +471,7 @@ public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ * * @return A boolean. */ - public boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { + public boolean getSeriesShapesFilled(@NonNegative int series) { Boolean flag = this.seriesShapesFilled.getBoolean(series); if (flag != null) { return flag; @@ -488,7 +488,7 @@ public boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean filled) { + public void setSeriesShapesFilled(@NonNegative int series, Boolean filled) { this.seriesShapesFilled.setBoolean(series, filled); fireChangeEvent(); } @@ -502,7 +502,7 @@ public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean filled) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(/*@NonNegative*/ int series, boolean filled) { + public void setSeriesShapesFilled(@NonNegative int series, boolean filled) { // delegate setSeriesShapesFilled(series, Boolean.valueOf(filled)); } @@ -634,7 +634,7 @@ public void setItemMargin(double margin) { * @return The legend item. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { CategoryPlot cp = getPlot(); if (cp == null) { @@ -692,7 +692,7 @@ urlText, shapeVisible, shape, getItemShapeFilled(series, 0), * @return The pass count ({@code 2} for this renderer). */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 2; } @@ -713,7 +713,7 @@ urlText, shapeVisible, shape, getItemShapeFilled(series, 0), @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { // do nothing if item is not visible @@ -837,7 +837,7 @@ else if (orientation == PlotOrientation.VERTICAL) { // submit the current data point as a crosshair candidate @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(state.getCrosshairState(), dataset.getRowKey(row), dataset.getColumnKey(column), value, datasetIndex, x1, y1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java b/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java index f9bee7bc7..27ff88cd9 100644 --- a/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java @@ -59,7 +59,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; import java.awt.Color; @@ -324,7 +324,7 @@ public void setMinIcon(Icon icon) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { // first check the number we are plotting... diff --git a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java index 6df72653e..37e706229 100644 --- a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java @@ -45,9 +45,9 @@ package org.jfree.chart.renderer.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Paint; @@ -268,7 +268,7 @@ public void setUseOutlinePaint(boolean use) { * @param item the item index (zero-based). * @return A boolean. */ - public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemShapeFilled(@NonNegative int series, @NonNegative int item) { return getSeriesShapesFilled(series); } @@ -279,7 +279,7 @@ public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ * @param series the series index (zero-based). * @return A boolean. */ - public boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { + public boolean getSeriesShapesFilled(@NonNegative int series) { Boolean flag = this.seriesShapesFilled.getBoolean(series); if (flag != null) { return flag.booleanValue(); @@ -297,7 +297,7 @@ public boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { * @param series the series index (zero-based). * @param filled the flag. */ - public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean filled) { + public void setSeriesShapesFilled(@NonNegative int series, Boolean filled) { this.seriesShapesFilled.setBoolean(series, filled); fireChangeEvent(); } @@ -309,7 +309,7 @@ public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean filled) { * @param series the series index (zero-based). * @param filled the flag. */ - public void setSeriesShapesFilled(/*@NonNegative*/ int series, boolean filled) { + public void setSeriesShapesFilled(@NonNegative int series, boolean filled) { this.seriesShapesFilled.setBoolean(series, Boolean.valueOf(filled)); fireChangeEvent(); } @@ -389,7 +389,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { // do nothing if item is not visible @@ -466,7 +466,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return The legend item. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { CategoryPlot cp = getPlot(); if (cp == null) { diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java index 720e66c86..299d7c97d 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java @@ -67,9 +67,9 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -161,7 +161,7 @@ public void setRenderAsPercentages(boolean asPercentages) { * @return The number of passes required by the renderer. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 2; } @@ -203,7 +203,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { if (!isSeriesVisible(row)) { @@ -255,7 +255,7 @@ public void drawItem(Graphics2D g2, CategoryItemRendererState state, dataArea, plot.getDomainAxisEdge()); @SuppressWarnings("index") // Possible bug. I don't see anything that implies that there is an item in the dataset, but I might I have missed it - /*@Positive*/ int itemCount = dataset.getColumnCount(); + @Positive int itemCount = dataset.getColumnCount(); double y2 = 0.0; n = dataset.getValue(row, Math.min(column + 1, itemCount - 1)); if (n != null) { @@ -416,8 +416,8 @@ else if (pass == 1) { * for all series values up to but excluding {@code series} * for {@code index}. */ - protected double /*@ArrayLen(2)*/ [] getStackValues(CategoryDataset dataset, - int series, /*@NonNegative*/ int index, /*@NonNegative*/ int[] validRows) { + protected double @ArrayLen(2) [] getStackValues(CategoryDataset dataset, + int series, @NonNegative int index, @NonNegative int[] validRows) { double[] result = new double[2]; double total = 0.0; if (this.renderAsPercentages) { @@ -456,7 +456,7 @@ else if (pass == 1) { * * @return A pair of average stack values. */ - private double /*@ArrayLen(2)*/ [] averageStackValues(double /*@MinLen(2)*/ [] stack1, double /*@MinLen(2)*/ [] stack2) { + private double @ArrayLen(2) [] averageStackValues(double @MinLen(2) [] stack1, double @MinLen(2) [] stack2) { double[] result = new double[2]; result[0] = (stack1[0] + stack2[0]) / 2.0; result[1] = (stack1[1] + stack2[1]) / 2.0; @@ -473,7 +473,7 @@ else if (pass == 1) { * * @return A pair of average stack values. */ - private double /*@ArrayLen(2)*/ [] adjustedStackValues(double /*@MinLen(2)*/ [] stack1, double /*@MinLen(2)*/ [] stack2) { + private double @ArrayLen(2) [] adjustedStackValues(double @MinLen(2) [] stack1, double @MinLen(2) [] stack2) { double[] result = new double[2]; if (stack1[0] == 0.0 || stack2[0] == 0.0) { result[0] = 0.0; diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java index 075454c2c..6abbb6c58 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java @@ -93,7 +93,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -201,7 +201,7 @@ public void setRenderAsPercentages(boolean asPercentages) { * @return The number of passes required by the renderer. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 3; } @@ -236,7 +236,7 @@ public Range findRangeBounds(CategoryDataset dataset) { */ @Override protected void calculateBarWidth(CategoryPlot plot, Rectangle2D dataArea, - /*@NonNegative*/ int rendererIndex, CategoryItemRendererState state) { + @NonNegative int rendererIndex, CategoryItemRendererState state) { // calculate the bar width CategoryAxis xAxis = plot.getDomainAxisForDataset(rendererIndex); @@ -287,8 +287,8 @@ else if (orientation == PlotOrientation.VERTICAL) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, int pass) { + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, + @NonNegative int column, int pass) { if (!isSeriesVisible(row)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java b/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java index fefb0872f..29b138235 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java @@ -40,7 +40,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; import java.awt.GradientPaint; @@ -82,8 +82,8 @@ public StandardBarPainter() { * bar. */ @Override - public void paintBar(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base) { + public void paintBar(Graphics2D g2, BarRenderer renderer, @NonNegative int row, + @NonNegative int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); GradientPaintTransformer t = renderer.getGradientPaintTransformer(); @@ -120,8 +120,8 @@ public void paintBar(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int r * @param pegShadow peg the shadow to the base of the bar? */ @Override - public void paintBarShadow(Graphics2D g2, BarRenderer renderer, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, + public void paintBarShadow(Graphics2D g2, BarRenderer renderer, @NonNegative int row, + @NonNegative int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { // handle a special case - if the bar colour has alpha == 0, it is diff --git a/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java index a8d1cda01..96b350460 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java @@ -63,7 +63,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; import java.awt.Color; @@ -220,7 +220,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset data, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset data, @NonNegative int row, @NonNegative int column, int pass) { int visibleRow = state.getVisibleSeriesIndex(row); @@ -266,9 +266,9 @@ protected void drawHorizontalItem(Graphics2D g2, CategoryAxis domainAxis, ValueAxis rangeAxis, StatisticalCategoryDataset dataset, - /*@NonNegative*/ int visibleRow, - /*@NonNegative*/ int row, - /*@NonNegative*/ int column) { + @NonNegative int visibleRow, + @NonNegative int row, + @NonNegative int column) { // BAR Y double rectY = calculateBarW0(plot, PlotOrientation.HORIZONTAL, @@ -413,9 +413,9 @@ protected void drawVerticalItem(Graphics2D g2, CategoryAxis domainAxis, ValueAxis rangeAxis, StatisticalCategoryDataset dataset, - /*@NonNegative*/ int visibleRow, - /*@NonNegative*/ int row, - /*@NonNegative*/ int column) { + @NonNegative int visibleRow, + @NonNegative int row, + @NonNegative int column) { // BAR X double rectX = calculateBarW0(plot, PlotOrientation.VERTICAL, dataArea, diff --git a/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java index 702c2aa86..1ac098990 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java @@ -57,7 +57,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -222,7 +222,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { // do nothing if item is not visible diff --git a/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java index 0b6d23474..2136fc1e6 100644 --- a/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java @@ -59,7 +59,7 @@ */ package org.jfree.chart.renderer.category; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; import java.awt.GradientPaint; @@ -312,7 +312,7 @@ public Range findRangeBounds(CategoryDataset dataset) { @Override public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, - ValueAxis rangeAxis, CategoryDataset dataset, /*@NonNegative*/ int row, /*@NonNegative*/ int column, + ValueAxis rangeAxis, CategoryDataset dataset, @NonNegative int row, @NonNegative int column, int pass) { double previous = state.getSeriesRunningTotal(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java index ebd4cd878..6b705ff45 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java @@ -128,12 +128,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.AlphaComposite; import java.awt.Composite; @@ -270,7 +270,7 @@ protected AbstractXYItemRenderer() { * @return The pass count. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 1; } @@ -330,7 +330,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @since 1.0.20 */ protected void beginElementGroup(Graphics2D g2, Comparable seriesKey, - /*@NonNegative*/ int itemIndex) { + @NonNegative int itemIndex) { beginElementGroup(g2, new XYItemKey(seriesKey, itemIndex)); } @@ -348,7 +348,7 @@ protected void beginElementGroup(Graphics2D g2, Comparable seriesKey, * @return The generator (possibly {@code null}). */ @Override - public XYItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public XYItemLabelGenerator getItemLabelGenerator(@NonNegative int series, @NonNegative int item) { // otherwise look up the generator table XYItemLabelGenerator generator @@ -367,7 +367,7 @@ public XYItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int series, / * @return The generator (possibly {@code null}). */ @Override - public XYItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int series) { + public XYItemLabelGenerator getSeriesItemLabelGenerator(@NonNegative int series) { return this.itemLabelGeneratorMap.get(series); } @@ -379,7 +379,7 @@ public XYItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int ser * @param generator the generator ({@code null} permitted). */ @Override - public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, + public void setSeriesItemLabelGenerator(@NonNegative int series, XYItemLabelGenerator generator) { this.itemLabelGeneratorMap.put(series, generator); fireChangeEvent(); @@ -420,7 +420,7 @@ public void setDefaultItemLabelGenerator(XYItemLabelGenerator generator) { * @return The generator (possibly {@code null}). */ @Override - public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public XYToolTipGenerator getToolTipGenerator(@NonNegative int series, @NonNegative int item) { // otherwise look up the generator table XYToolTipGenerator generator @@ -439,7 +439,7 @@ public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int series, /*@No * @return The generator (possibly {@code null}). */ @Override - public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series) { + public XYToolTipGenerator getSeriesToolTipGenerator(@NonNegative int series) { return this.toolTipGeneratorMap.get(series); } @@ -451,7 +451,7 @@ public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series) * @param generator the generator ({@code null} permitted). */ @Override - public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, + public void setSeriesToolTipGenerator(@NonNegative int series, XYToolTipGenerator generator) { this.toolTipGeneratorMap.put(series, generator); fireChangeEvent(); @@ -812,7 +812,7 @@ public LegendItemCollection getLegendItems() { } LegendItemCollection result = new LegendItemCollection(); @SuppressWarnings("index") // guaranteed index: this is guaranteed to be a renderer for this.plot, so indexOf will return nonnegative - /*@NonNegative*/ int index = this.plot.getIndexOf(this); + @NonNegative int index = this.plot.getIndexOf(this); XYDataset dataset = this.plot.getDataset(index); if (dataset != null) { int seriesCount = dataset.getSeriesCount(); @@ -839,7 +839,7 @@ public LegendItemCollection getLegendItems() { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { XYPlot xyplot = getPlot(); if (xyplot == null) { return null; @@ -1585,7 +1585,7 @@ public DrawingSupplier getDrawingSupplier() { * @since 1.0.20 */ protected void updateCrosshairValues(CrosshairState crosshairState, - double x, double y, /*@NonNegative*/ int datasetIndex, + double x, double y, @NonNegative int datasetIndex, double transX, double transY, PlotOrientation orientation) { Args.nullNotPermitted(orientation, "orientation"); @@ -1626,7 +1626,7 @@ protected void updateCrosshairValues(CrosshairState crosshairState, * label position). */ protected void drawItemLabel(Graphics2D g2, PlotOrientation orientation, - XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#3.getSeries(#4)")*/ int item, double x, double y, + XYDataset dataset, @NonNegative int series, @IndexFor("#3.getSeries(#4)") int item, double x, double y, boolean negative) { XYItemLabelGenerator generator = getItemLabelGenerator(series, item); @@ -1684,7 +1684,7 @@ else if (layer.equals(Layer.BACKGROUND)) { throw new RuntimeException("Unknown layer."); } @SuppressWarnings("index") // guaranteed index: this is a renderer of this.plot by definition, so indexOf will return nonnegative - /*@NonNegative*/ int index = this.plot.getIndexOf(this); + @NonNegative int index = this.plot.getIndexOf(this); for (XYAnnotation annotation : toDraw) { annotation.draw(g2, this.plot, dataArea, domainAxis, rangeAxis, index, info); @@ -1710,7 +1710,7 @@ else if (layer.equals(Layer.BACKGROUND)) { * {@code hotspot} is {@code null}). */ protected void addEntity(EntityCollection entities, Shape hotspot, - XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#3.getSeries(#4)")*/ int item, double entityX, + XYDataset dataset, @NonNegative int series, @IndexFor("#3.getSeries(#4)") int item, double entityX, double entityY) { if (!getItemCreateEntity(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java index 824101fb1..cdc4f47e1 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java @@ -87,9 +87,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.AlphaComposite; import java.awt.Color; @@ -649,7 +649,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { boolean horiz; PlotOrientation orientation = plot.getOrientation(); @@ -671,7 +671,7 @@ else if (orientation == PlotOrientation.VERTICAL) { OHLCDataset highLowData = (OHLCDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("highLowData.getSeries(series)")*/ int highLowItem = item; + @IndexFor("highLowData.getSeries(series)") int highLowItem = item; double x = highLowData.getXValue(series, highLowItem); double yHigh = highLowData.getHighValue(series, highLowItem); @@ -732,7 +732,7 @@ else if (orientation == PlotOrientation.VERTICAL) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@NonNegative*/ /*@UpperBoundBottom*/ int intervalXYItem = item; + @NonNegative @UpperBoundBottom int intervalXYItem = item; double startPos = domainAxis.valueToJava2D( intervalDataset.getStartXValue(series, intervalXYItem), dataArea, plot.getDomainAxisEdge()); diff --git a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java index bc6282588..87e633108 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java @@ -65,7 +65,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -137,7 +137,7 @@ public ClusteredXYBarRenderer(double margin, * @return {@code 2}. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 2; } @@ -226,11 +226,11 @@ protected Range findDomainBoundsWithOffset(IntervalXYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; + @IndexFor("intervalDataset.getSeries(series)") int intervalXYItem = item; double y0; double y1; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 4fa9319cf..49745e6a0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -46,11 +46,11 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -150,7 +150,7 @@ public CyclicXYItemRenderer(int type, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { if ((!getPlotLines()) || ((!(domainAxis instanceof CyclicNumberAxis)) && (!(rangeAxis instanceof CyclicNumberAxis))) || (item <= 0)) { @@ -277,7 +277,7 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > } @SuppressWarnings("index") // newset is created from x and y, which are both arrays with at least two elements. So one is always a valid index to either - /*@LTLengthOf("newset.getSeries(series)")*/ int one = 1; + @LTLengthOf("newset.getSeries(series)") int one = 1; super.drawItem( g2, state, dataArea, info, plot, domainAxis, rangeAxis, newset, series, one, crosshairState, pass @@ -306,7 +306,7 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > } @SuppressWarnings("index") // newset is created from x and y, which are both arrays with at least two elements. But, if x and y were of length two we already returned. So, two is a valid index into newset. - /*@LTLengthOf("newset.getSeries(series)")*/ int two = 2; + @LTLengthOf("newset.getSeries(series)") int two = 2; super.drawItem(g2, state, dataArea, info, plot, domainAxis, rangeAxis, newset, series, two, crosshairState, pass); @@ -330,7 +330,7 @@ else if ((x.length == 3) && (y.length == 3) && (y[1] != y[2]) && ((ycycleBound > } @SuppressWarnings("index") // newset is created from x and y, which are both arrays with exactly four elements. - /*@LTLengthOf("newset.getSeries(series)")*/ int three = 3; + @LTLengthOf("newset.getSeries(series)") int three = 3; super.drawItem(g2, state, dataArea, info, plot, domainAxis, rangeAxis, newset, series, three, crosshairState, pass); @@ -363,7 +363,7 @@ protected static class OverwriteDataSet implements XYDataset { * @param delegateSet the dataset. */ @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 - public OverwriteDataSet(double /*@SameLen("#2")*/ [] x, double /*@SameLen("#1")*/ [] y, + public OverwriteDataSet(double @SameLen("#2") [] x, double @SameLen("#1") [] y, XYDataset delegateSet) { this.delegateSet = delegateSet; this.x = new Double[x.length]; this.y = new Double[y.length]; @@ -392,7 +392,7 @@ public DomainOrder getDomainOrder() { */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.x.length; } @@ -406,7 +406,7 @@ public DomainOrder getDomainOrder() { */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.x[item]; } @@ -420,7 +420,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number xx = getX(series, item); if (xx != null) { @@ -439,7 +439,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.y[item]; } @@ -453,7 +453,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The y-value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number yy = getY(series, item); if (yy != null) { @@ -468,7 +468,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.delegateSet.getSeriesCount(); } @@ -480,7 +480,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The series name. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { return this.delegateSet.getSeriesKey(series); } @@ -492,7 +492,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The index. */ @Override - public /*@GTENegativeOne*/ int indexOf(Comparable seriesName) { + public @GTENegativeOne int indexOf(Comparable seriesName) { return this.delegateSet.indexOf(seriesName); } @@ -541,7 +541,7 @@ public void setGroup(DatasetGroup group) { * A ghost method. Do not call. */ @Override - public Series getSeries(/*@NonNegative*/ int series) { + public Series getSeries(@NonNegative int series) { return null; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java index cd69b7380..cf9a2f2a0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java @@ -44,11 +44,11 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.AlphaComposite; import java.awt.Composite; @@ -93,13 +93,13 @@ public static class State extends XYLineAndShapeRenderer.State { * A list of coordinates for the upper y-values in the current series * (after translation into Java2D space). */ - public List<double /*@ArrayLen(2)*/ []> upperCoordinates; + public List<double @ArrayLen(2) []> upperCoordinates; /** * A list of coordinates for the lower y-values in the current series * (after translation into Java2D space). */ - public List<double /*@ArrayLen(2)*/ []> lowerCoordinates; + public List<double @ArrayLen(2) []> lowerCoordinates; /** * Creates a new state instance. @@ -218,7 +218,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return {@code 3}. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 3; } @@ -274,7 +274,7 @@ protected boolean isLinePass(int pass) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -286,7 +286,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; + @IndexFor("intervalDataset.getSeries(series)") int intervalXYItem = item; State drState = (State) state; @@ -330,7 +330,7 @@ else if (orientation == PlotOrientation.VERTICAL) { area.lineTo((float) coords[0], (float) coords[1]); } @SuppressWarnings("index") // upperCoordinates always has at least one entry, because first pass always adds one entry - /*@Positive*/ int count = drState.upperCoordinates.size(); + @Positive int count = drState.upperCoordinates.size(); coords = drState.upperCoordinates.get(count - 1); area.lineTo((float) coords[0], (float) coords[1]); for (int i = count - 2; i >= 0; i--) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java index ce1978291..0ddecbb71 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java @@ -40,9 +40,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; import java.awt.GradientPaint; @@ -105,8 +105,8 @@ public GradientXYBarPainter(double g1, double g2, double g3) { * bar. */ @Override - public void paintBar(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base) { + public void paintBar(Graphics2D g2, XYBarRenderer renderer, @NonNegative int row, + @NonNegative int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); @@ -206,8 +206,8 @@ else if (base == RectangleEdge.LEFT || base == RectangleEdge.RIGHT) { * @param pegShadow peg the shadow to the base of the bar? */ @Override - public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, + public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, @NonNegative int row, + @NonNegative int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { // handle a special case - if the bar colour has alpha == 0, it is @@ -290,7 +290,7 @@ else if (base == RectangleEdge.RIGHT) { * * @return An array containing four subregions. */ - private Rectangle2D /*@ArrayLen(4)*/ [] splitVerticalBar(RectangularShape bar, double a, + private Rectangle2D @ArrayLen(4) [] splitVerticalBar(RectangularShape bar, double a, double b, double c) { Rectangle2D[] result = new Rectangle2D[4]; double x0 = bar.getMinX(); @@ -319,7 +319,7 @@ else if (base == RectangleEdge.RIGHT) { * * @return An array containing four subregions. */ - private Rectangle2D /*@ArrayLen(4)*/ [] splitHorizontalBar(RectangularShape bar, double a, + private Rectangle2D @ArrayLen(4) [] splitHorizontalBar(RectangularShape bar, double a, double b, double c) { Rectangle2D[] result = new Rectangle2D[4]; double y0 = bar.getMinY(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java index 964749e63..267aef799 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java @@ -67,9 +67,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -323,7 +323,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); if (!domainAxis.getRange().contains(x)) { @@ -351,7 +351,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, OHLCDataset hld = (OHLCDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 - /*@IndexFor("hld.getSeries(series)")*/ int hldItem = item; + @IndexFor("hld.getSeries(series)") int hldItem = item; double yHigh = hld.getHighValue(series, hldItem); double yLow = hld.getLowValue(series, hldItem); diff --git a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java index 5b752e93b..273832c7b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java @@ -44,12 +44,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Shape; @@ -106,7 +106,7 @@ public SamplingXYLineRenderer() { * @return The pass count. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 1; } @@ -174,8 +174,8 @@ public State(PlotRenderingInfo info) { * @param passCount the number of passes. */ @Override - public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#1.getSeries(#2)")*/ int firstItem, /*@IndexFor("#1.getSeries(#2)")*/ int lastItem, int pass, int passCount) { + public void startSeriesPass(XYDataset dataset, @NonNegative int series, + @IndexFor("#1.getSeries(#2)") int firstItem, @IndexFor("#1.getSeries(#2)") int lastItem, int pass, int passCount) { this.seriesPath.reset(); this.intervalPath.reset(); this.lastPointGood = false; @@ -240,7 +240,7 @@ public XYItemRendererState initialise(Graphics2D g2, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java index 6b3b4f969..7936281e8 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java @@ -70,9 +70,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -347,7 +347,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return 2. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 2; } @@ -399,7 +399,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); StackedXYAreaRendererState areaState @@ -538,7 +538,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, ph1 + y1, datasetIndex, transX1, transY1, orientation); @@ -628,11 +628,11 @@ else if (plot.getOrientation() == PlotOrientation.HORIZONTAL) { * {@code series} for {@code index}. */ protected double getPreviousHeight(TableXYDataset dataset, - int series, /*@NonNegative*/ int index) { + int series, @NonNegative int index) { double result = 0.0; for (int i = 0; i < series; i++) { @SuppressWarnings("index") // precondition of this function is that index is an index into every series up to series - /*@IndexFor("dataset.getSeries(i)")*/ int iIndex = index; + @IndexFor("dataset.getSeries(i)") int iIndex = index; double value = dataset.getYValue(i, iIndex); if (!Double.isNaN(value)) { result += value; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java index 1c8d1ed42..9fdf19141 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java @@ -56,12 +56,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.MinLen; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.MinLen; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -197,7 +197,7 @@ public Range findRangeBounds(XYDataset dataset) { * @return 1. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 1; } @@ -222,7 +222,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; @@ -245,7 +245,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, // "hot spot" for the area (used by the chart entity)... @SuppressWarnings("index") // itemCount is at least one, so zero is an index - /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + @IndexFor("dataset.getSeries(series)") int zero = 0; double x0 = dataset.getXValue(series, Math.max(item - 1, zero)); double y0 = dataset.getYValue(series, Math.max(item - 1, zero)); @@ -256,7 +256,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, 0)); @SuppressWarnings("index") // itemCount must be positive if we have an index, which we do (item) - /*@Positive*/ int itemCount = dataset.getItemCount(series); + @Positive int itemCount = dataset.getItemCount(series); double x2 = dataset.getXValue(series, Math.min(item + 1, itemCount - 1)); double y2 = dataset.getYValue(series, Math.min(item + 1, @@ -470,12 +470,12 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * for all series values up to but excluding {@code series} * for {@code index}. */ - private double /*@MinLen(2)*/ [] getStackValues(TableXYDataset dataset, - /*@NonNegative*/ int series, /*@NonNegative*/ int index) { + private double @MinLen(2) [] getStackValues(TableXYDataset dataset, + @NonNegative int series, @NonNegative int index) { double[] result = new double[2]; for (int i = 0; i < series; i++) { @SuppressWarnings("index") // index must be an index into all series < series is a precondition of this function - /*@IndexFor("dataset.getSeries(i)")*/ int iIndex = index; + @IndexFor("dataset.getSeries(i)") int iIndex = index; double v = dataset.getYValue(i, iIndex); if (!Double.isNaN(v)) { if (v >= 0.0) { @@ -498,7 +498,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * * @return A pair of average stack values. */ - private double /*@ArrayLen(2)*/ [] averageStackValues(double /*@MinLen(2)*/ [] stack1, double /*@MinLen(2)*/ [] stack2) { + private double @ArrayLen(2) [] averageStackValues(double @MinLen(2) [] stack1, double @MinLen(2) [] stack2) { double[] result = new double[2]; result[0] = (stack1[0] + stack2[0]) / 2.0; result[1] = (stack1[1] + stack2[1]) / 2.0; @@ -515,7 +515,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * * @return A pair of average stack values. */ - private double /*@ArrayLen(2)*/ [] adjustedStackValues(double /*@MinLen(2)*/ [] stack1, double /*@MinLen(2)*/ [] stack2) { + private double @ArrayLen(2) [] adjustedStackValues(double @MinLen(2) [] stack1, double @MinLen(2) [] stack2) { double[] result = new double[2]; if (stack1[0] == 0.0 || stack2[0] == 0.0) { result[0] = 0.0; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java index 647f898e4..5e2de3a56 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java @@ -54,9 +54,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; @@ -169,7 +169,7 @@ public void setRenderAsPercentages(boolean asPercentages) { * @return {@code 2}. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 3; } @@ -240,7 +240,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; @@ -267,7 +267,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalXYItem = item; + @IndexFor("intervalDataset.getSeries(series)") int intervalXYItem = item; double value = intervalDataset.getYValue(series, intervalXYItem); if (Double.isNaN(value)) { return; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java index 8cac43bc9..b27f108ae 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; import java.awt.GradientPaint; @@ -81,8 +81,8 @@ public StandardXYBarPainter() { * bar. */ @Override - public void paintBar(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base) { + public void paintBar(Graphics2D g2, XYBarRenderer renderer, @NonNegative int row, + @NonNegative int column, RectangularShape bar, RectangleEdge base) { Paint itemPaint = renderer.getItemPaint(row, column); GradientPaintTransformer t = renderer.getGradientPaintTransformer(); @@ -119,8 +119,8 @@ public void paintBar(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int * @param pegShadow peg the shadow to the base of the bar? */ @Override - public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, /*@NonNegative*/ int row, - /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, + public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, @NonNegative int row, + @NonNegative int column, RectangularShape bar, RectangleEdge base, boolean pegShadow) { // handle a special case - if the bar colour has alpha == 0, it is diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index 50f1b4a78..d3b5e1720 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -110,11 +110,11 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Image; @@ -331,7 +331,7 @@ public void setBaseShapesVisible(boolean flag) { * * @see #getSeriesShapesFilled(int) */ - public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemShapeFilled(@NonNegative int series, @NonNegative int item) { // otherwise look up the paint table Boolean flag = this.seriesShapesFilled.getBoolean(series); @@ -351,7 +351,7 @@ public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ * * @return A boolean. */ - public Boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { + public Boolean getSeriesShapesFilled(@NonNegative int series) { return this.seriesShapesFilled.getBoolean(series); } @@ -364,7 +364,7 @@ public Boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean flag) { + public void setSeriesShapesFilled(@NonNegative int series, Boolean flag) { this.seriesShapesFilled.setBoolean(series, flag); fireChangeEvent(); } @@ -579,7 +579,7 @@ public void setLegendLine(Shape line) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { XYPlot plot = getPlot(); if (plot == null) { return null; @@ -635,7 +635,7 @@ public static class State extends XYItemRendererState { public GeneralPath seriesPath; /** The series index. */ - private /*@GTENegativeOne*/ int seriesIndex; + private @GTENegativeOne int seriesIndex; /** * A flag that indicates if the last (x, y) point was 'good' @@ -677,7 +677,7 @@ public void setLastPointGood(boolean good) { * * @return The series index for the current path. */ - public /*@GTENegativeOne*/ int getSeriesIndex() { + public @GTENegativeOne int getSeriesIndex() { return this.seriesIndex; } @@ -686,7 +686,7 @@ public void setLastPointGood(boolean good) { * * @param index the index. */ - public void setSeriesIndex(/*@NonNegative*/ int index) { + public void setSeriesIndex(@NonNegative int index) { this.seriesIndex = index; } } @@ -740,7 +740,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { boolean itemVisible = getItemVisible(series, item); @@ -820,9 +820,9 @@ else if (item != 0 && itemVisible) { // only draw a line if the gap between the current and // previous data point is within the threshold @SuppressWarnings("index") // item is an index, but it's not equal to zero. This implies that there must be at least two items. - /*@Positive*/ int numX = dataset.getItemCount(series); + @Positive int numX = dataset.getItemCount(series); @SuppressWarnings("index") // zero is an index, because itemCount >= 2 - /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + @IndexFor("dataset.getSeries(series)") int zero = 0; double minX = dataset.getXValue(series, zero); double maxX = dataset.getXValue(series, numX - 1); if (this.gapThresholdType == UnitType.ABSOLUTE) { @@ -920,7 +920,7 @@ else if (orientation == PlotOrientation.VERTICAL) { } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); @@ -1018,7 +1018,7 @@ public Object clone() throws CloneNotSupportedException { * * @see #getPlotImages() */ - protected Image getImage(Plot plot, /*@NonNegative*/ int series, /*@NonNegative*/ int item, + protected Image getImage(Plot plot, @NonNegative int series, @NonNegative int item, double x, double y) { // this method must be overridden if you want to display images return null; @@ -1041,7 +1041,7 @@ protected Image getImage(Plot plot, /*@NonNegative*/ int series, /*@NonNegative* * * @return The hotspot used to draw the data item. */ - protected Point getImageHotspot(Plot plot, /*@NonNegative*/ int series, /*@NonNegative*/ int item, + protected Point getImageHotspot(Plot plot, @NonNegative int series, @NonNegative int item, double x, double y, Image image) { int height = image.getHeight(null); diff --git a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java index b6975f2ab..4a2a305e9 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java @@ -46,9 +46,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.geom.GeneralPath; @@ -225,7 +225,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); @@ -234,7 +234,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (dataset instanceof VectorXYDataset) { VectorXYDataset vectorXYDataset = (VectorXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("vectorXYDataset.getSeries(series)")*/ int vectorXYItem = item; + @IndexFor("vectorXYDataset.getSeries(series)") int vectorXYItem = item; dx = vectorXYDataset.getVectorXValue(series, vectorXYItem); dy = vectorXYDataset.getVectorYValue(series, vectorXYItem); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java index acc43a374..8e332b6c5 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java @@ -56,9 +56,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; import java.awt.Font; @@ -121,11 +121,11 @@ public WindItemRenderer() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D plotArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { WindDataset windData = (WindDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("windData.getSeries(series)")*/ int windItem = item; + @IndexFor("windData.getSeries(series)") int windItem = item; Paint seriesPaint = getItemPaint(series, item); Stroke seriesStroke = getItemStroke(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index 6690a5562..0846f0805 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -87,12 +87,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.BasicStroke; import java.awt.GradientPaint; @@ -441,7 +441,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { LegendItem result = null; XYPlot xyplot = getPlot(); if (xyplot != null) { @@ -499,7 +499,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegativ public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; @@ -520,9 +520,9 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, // get the previous point and the next point so we can calculate a // "hot spot" for the area (used by the chart entity)... @SuppressWarnings("index") // itemCount needs to be at least 1 if we have an index (which we do - item). - /*@Positive*/ int itemCount = dataset.getItemCount(series); + @Positive int itemCount = dataset.getItemCount(series); @SuppressWarnings("index") // itemCount is at least one, so zero is an index - /*@IndexFor("dataset.getSeries(series)")*/ int zero_const = 0; + @IndexFor("dataset.getSeries(series)") int zero_const = 0; double x0 = dataset.getXValue(series, Math.max(item - 1, zero_const)); double y0 = dataset.getYValue(series, Math.max(item - 1, zero_const)); if (Double.isNaN(y0)) { @@ -655,7 +655,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java index f261c92bc..649eba33e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java @@ -85,12 +85,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Paint; @@ -235,7 +235,7 @@ public void setLegendArea(Shape area) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { LegendItem result = null; XYPlot xyplot = getPlot(); if (xyplot != null) { @@ -293,7 +293,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegativ public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; @@ -311,7 +311,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, plot.getRangeAxisEdge()); @SuppressWarnings("index") // itemCount is at least one, so zero is an index - /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + @IndexFor("dataset.getSeries(series)") int zero = 0; // get the previous point and the next point so we can calculate a // "hot spot" for the area (used by the chart entity)... @@ -326,7 +326,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, plot.getRangeAxisEdge()); @SuppressWarnings("index") // itemCount must be positive, since we have an index (item) - /*@Positive*/ int itemCount = dataset.getItemCount(series); + @Positive int itemCount = dataset.getItemCount(series); double x2 = dataset.getXValue(series, Math.min(item + 1, itemCount - 1)); double y2 = dataset.getYValue(series, Math.min(item + 1, @@ -380,7 +380,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java index 58cc104f6..2ce0d0611 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java @@ -39,7 +39,7 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.geom.RectangularShape; @@ -73,7 +73,7 @@ public interface XYBarPainter { * @param base the base of the bar. */ public void paintBar(Graphics2D g2, XYBarRenderer renderer, - /*@NonNegative*/ int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base); + @NonNegative int row, @NonNegative int column, RectangularShape bar, RectangleEdge base); /** * Paints the shadow for a single bar on behalf of a renderer. @@ -87,7 +87,7 @@ public void paintBar(Graphics2D g2, XYBarRenderer renderer, * @param pegShadow peg the shadow to the base of the bar? */ public void paintBarShadow(Graphics2D g2, XYBarRenderer renderer, - /*@NonNegative*/ int row, /*@NonNegative*/ int column, RectangularShape bar, RectangleEdge base, + @NonNegative int row, @NonNegative int column, RectangularShape bar, RectangleEdge base, boolean pegShadow); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index cc60eeb3e..779f467de 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -105,11 +105,11 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Font; import java.awt.Graphics2D; @@ -737,7 +737,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { XYPlot xyplot = getPlot(); if (xyplot == null) { return null; @@ -809,7 +809,7 @@ public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegativ public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { if (!getItemVisible(series, item)) { return; @@ -817,7 +817,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalItem = item; + @IndexFor("intervalDataset.getSeries(series)") int intervalItem = item; double value0; double value1; @@ -949,7 +949,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double transY1 = rangeAxis.valueToJava2D(y1, dataArea, plot.getRangeAxisEdge()); @SuppressWarnings("index") // plot and dataset must be associated with each other. This is assumed but not checked. A bug? - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, plot.getOrientation()); @@ -977,7 +977,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * @param negative a flag indicating a negative value. */ protected void drawItemLabel(Graphics2D g2, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#2.getSeries(#3)")*/ int item, XYPlot plot, XYItemLabelGenerator generator, + @NonNegative int series, @IndexFor("#2.getSeries(#3)") int item, XYPlot plot, XYItemLabelGenerator generator, Rectangle2D bar, boolean negative) { if (generator == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 83f824424..6e0cfb2df 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -46,9 +46,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; import java.awt.Graphics2D; @@ -352,7 +352,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); @@ -360,7 +360,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (dataset instanceof XYZDataset) { XYZDataset xyzDataset = ((XYZDataset) dataset); @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("xyzDataset.getSeries(series)")*/ int xyzItem = item; + @IndexFor("xyzDataset.getSeries(series)") int xyzItem = item; z = xyzDataset.getZValue(series, xyzItem); } @@ -396,7 +396,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); double transX = domainAxis.valueToJava2D(x, dataArea, plot.getDomainAxisEdge()); double transY = rangeAxis.valueToJava2D(y, dataArea, diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index 4472cea27..d0183d38c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -77,12 +77,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Color; import java.awt.Graphics2D; @@ -309,7 +309,7 @@ public Range findRangeBounds(XYDataset dataset) { * * @since 1.0.10 */ - protected Paint lookupBoxPaint(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + protected Paint lookupBoxPaint(@NonNegative int series, @NonNegative int item) { Paint p = getBoxPaint(); if (p != null) { return p; @@ -344,7 +344,7 @@ protected Paint lookupBoxPaint(/*@NonNegative*/ int series, /*@NonNegative*/ int public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); @@ -379,8 +379,8 @@ else if (orientation == PlotOrientation.VERTICAL) { */ public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, - ValueAxis rangeAxis, XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#7.getSeries(#8)")*/ int item, CrosshairState crosshairState, int pass) { + ValueAxis rangeAxis, XYDataset dataset, @NonNegative int series, + @IndexFor("#7.getSeries(#8)") int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; @@ -392,7 +392,7 @@ public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, = (BoxAndWhiskerXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("boxAndWhiskerData.getSeries(series)")*/ int boxAndWhiskerItem = item; + @IndexFor("boxAndWhiskerData.getSeries(series)") int boxAndWhiskerItem = item; Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); Number yMax = boxAndWhiskerData.getMaxRegularValue(series, boxAndWhiskerItem); @@ -522,8 +522,8 @@ else if (exactBoxWidth > maxBoxWidth) { */ public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, - ValueAxis rangeAxis, XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#7.getSeries(#8)")*/ int item, CrosshairState crosshairState, int pass) { + ValueAxis rangeAxis, XYDataset dataset, @NonNegative int series, + @IndexFor("#7.getSeries(#8)") int item, CrosshairState crosshairState, int pass) { // setup for collecting optional entity info... EntityCollection entities = null; @@ -535,7 +535,7 @@ public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, = (BoxAndWhiskerXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("boxAndWhiskerData.getSeries(series)")*/ int boxAndWhiskerItem = item; + @IndexFor("boxAndWhiskerData.getSeries(series)") int boxAndWhiskerItem = item; Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); Number yMax = boxAndWhiskerData.getMaxRegularValue(series, boxAndWhiskerItem); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index a2ab932f8..d77551447 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -63,12 +63,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Paint; @@ -181,7 +181,7 @@ public int getScaleType() { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { // return straight away if the item is not visible if (!getItemVisible(series, item)) { @@ -198,7 +198,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, XYZDataset xyzData = (XYZDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("xyzData.getSeries(series)")*/ int xyzItem = item; + @IndexFor("xyzData.getSeries(series)") int xyzItem = item; z = xyzData.getZValue(series, xyzItem); } if (!Double.isNaN(z)) { @@ -279,7 +279,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); } @@ -296,7 +296,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { LegendItem result = null; XYPlot plot = getPlot(); if (plot == null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index f99e0accb..67f578fbc 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -83,10 +83,10 @@ package org.jfree.chart.renderer.xy; -/*>>> + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; - */ + import java.awt.Color; import java.awt.Graphics2D; @@ -348,7 +348,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, * @return The number of passes required by the renderer. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 2; } @@ -374,7 +374,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { if (pass == 0) { drawItemPass0(g2, dataArea, info, plot, domainAxis, rangeAxis, @@ -410,8 +410,8 @@ protected void drawItemPass0(Graphics2D x_graphics, ValueAxis x_domainAxis, ValueAxis x_rangeAxis, XYDataset x_dataset, - /*@NonNegative*/ int x_series, - /*@IndexFor("#7.getSeries(#8)")*/ int x_item, + @NonNegative int x_series, + @IndexFor("#7.getSeries(#8)") int x_item, CrosshairState x_crosshairState) { if (!((0 == x_series) && (0 == x_item))) { @@ -440,9 +440,9 @@ protected void drawItemPass0(Graphics2D x_graphics, // state @SuppressWarnings("index") // one of the guarantees of a non-degenerate series is that it has at least one item - /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItem = 0; + @IndexFor("x_dataset.getSeries(0)") int l_minuendItem = 0; @SuppressWarnings("index") // the call to isEitherSeriesDegenerate above guarantees this is true - /*@Positive*/ int l_minuendItemCount = x_dataset.getItemCount(0); + @Positive int l_minuendItemCount = x_dataset.getItemCount(0); Double l_minuendCurX = null; Double l_minuendNextX = null; Double l_minuendCurY = null; @@ -451,7 +451,7 @@ protected void drawItemPass0(Graphics2D x_graphics, double l_minuendMinY = Double.POSITIVE_INFINITY; @SuppressWarnings("index") // one of the guarantees of a non-degenerate series is that it has at least one item - /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItem = 0; + @IndexFor("x_dataset.getSeries(1)") int l_subtrahendItem = 0; int l_subtrahendItemCount = 0; // actual value set below Double l_subtrahendCurX = null; Double l_subtrahendNextX = null; @@ -465,7 +465,7 @@ protected void drawItemPass0(Graphics2D x_graphics, //l_subtrahendItem = 0; l_subtrahendItemCount = 2; @SuppressWarnings("index") // itemCount is positive for series zero, so zero is an index into that series - /*@IndexFor("x_dataset.getSeries(0)")*/ int zero = 0; + @IndexFor("x_dataset.getSeries(0)") int zero = 0; l_subtrahendCurX = new Double(x_dataset.getXValue(0, zero)); l_subtrahendNextX = new Double(x_dataset.getXValue(0, (l_minuendItemCount - 1))); @@ -506,7 +506,7 @@ protected void drawItemPass0(Graphics2D x_graphics, l_x1 = x_dataset.getXValue(0, l_minuendItem); l_y1 = x_dataset.getYValue(0, l_minuendItem); @SuppressWarnings("index") // non-degenerate series always have both x and y coordinates - /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItemPlusOne = l_minuendItem + 1; + @IndexFor("x_dataset.getSeries(0)") int l_minuendItemPlusOne = l_minuendItem + 1; l_x2 = x_dataset.getXValue(0, l_minuendItemPlusOne); l_y2 = x_dataset.getYValue(0, l_minuendItemPlusOne); @@ -525,7 +525,7 @@ protected void drawItemPass0(Graphics2D x_graphics, l_x3 = x_dataset.getXValue(1, l_subtrahendItem); l_y3 = x_dataset.getYValue(1, l_subtrahendItem); @SuppressWarnings("index") // non-degenerate series always have both x and y coordinates - /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItemPlusOne = l_subtrahendItem + 1; + @IndexFor("x_dataset.getSeries(1)") int l_subtrahendItemPlusOne = l_subtrahendItem + 1; l_x4 = x_dataset.getXValue(1, l_subtrahendItemPlusOne); l_y4 = x_dataset.getYValue(1, l_subtrahendItemPlusOne); @@ -537,7 +537,7 @@ protected void drawItemPass0(Graphics2D x_graphics, if (l_x2 <= l_x3) { @SuppressWarnings("index") // minuend needs to be fast forwarded - /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItemTmp = l_minuendItem + 1; + @IndexFor("x_dataset.getSeries(0)") int l_minuendItemTmp = l_minuendItem + 1; l_minuendItem = l_minuendItemTmp; b_minuendFastForward = true; continue; @@ -545,7 +545,7 @@ protected void drawItemPass0(Graphics2D x_graphics, if (l_x4 <= l_x1) { @SuppressWarnings("index") // subtrahend needs to be fast forwarded - /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItemTmp = l_subtrahendItem + 1; + @IndexFor("x_dataset.getSeries(1)") int l_subtrahendItemTmp = l_subtrahendItem + 1; l_subtrahendItem = l_subtrahendItemTmp; b_subtrahendFastForward = true; continue; @@ -599,7 +599,7 @@ protected void drawItemPass0(Graphics2D x_graphics, l_minuendMinY = Math.min(l_minuendMinY, l_y1); @SuppressWarnings("index") // non-degenerate series always have both x and y coordinates - /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItemPlusOne = l_minuendItem + 1; + @IndexFor("x_dataset.getSeries(0)") int l_minuendItemPlusOne = l_minuendItem + 1; l_x2 = x_dataset.getXValue(0, l_minuendItemPlusOne); l_y2 = x_dataset.getYValue(0, l_minuendItemPlusOne); @@ -624,7 +624,7 @@ protected void drawItemPass0(Graphics2D x_graphics, l_subtrahendMinY = Math.min(l_subtrahendMinY, l_y3); @SuppressWarnings("index") // non-degenerate series always have both x and y coordinates - /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItemPlusOne = l_subtrahendItem + 1; + @IndexFor("x_dataset.getSeries(1)") int l_subtrahendItemPlusOne = l_subtrahendItem + 1; l_x4 = x_dataset.getXValue(1, l_subtrahendItemPlusOne); l_y4 = x_dataset.getYValue(1, l_subtrahendItemPlusOne); @@ -787,7 +787,7 @@ protected void drawItemPass0(Graphics2D x_graphics, if (l_x2 <= l_x4) { @SuppressWarnings("index") // advance the minuend if needed - /*@IndexFor("x_dataset.getSeries(0)")*/ int l_minuendItemTmp = l_minuendItem + 1; + @IndexFor("x_dataset.getSeries(0)") int l_minuendItemTmp = l_minuendItem + 1; l_minuendItem = l_minuendItemTmp; b_minuendAdvanced = true; } @@ -797,7 +797,7 @@ protected void drawItemPass0(Graphics2D x_graphics, if (l_x4 <= l_x2) { @SuppressWarnings("index") // advance the subtrahend if needed - /*@IndexFor("x_dataset.getSeries(1)")*/ int l_subtrahendItemTmp = l_subtrahendItem + 1; + @IndexFor("x_dataset.getSeries(1)") int l_subtrahendItemTmp = l_subtrahendItem + 1; l_subtrahendItem = l_subtrahendItemTmp; b_subtrahendAdvanced = true; } @@ -887,8 +887,8 @@ protected void drawItemPass1(Graphics2D x_graphics, ValueAxis x_domainAxis, ValueAxis x_rangeAxis, XYDataset x_dataset, - /*@NonNegative*/ int x_series, - /*@IndexFor("#7.getSeries(#8)")*/ int x_item, + @NonNegative int x_series, + @IndexFor("#7.getSeries(#8)") int x_item, CrosshairState x_crosshairState) { Shape l_entityArea = null; @@ -961,7 +961,7 @@ protected void drawItemPass1(Graphics2D x_graphics, } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = x_plot.indexOf(x_dataset); + @NonNegative int datasetIndex = x_plot.indexOf(x_dataset); updateCrosshairValues(x_crosshairState, l_x0, l_y0, datasetIndex, l_x1, l_y1, l_orientation); @@ -1020,9 +1020,9 @@ private boolean isEitherSeriesDegenerate(XYDataset x_dataset, private boolean areSeriesDisjoint(XYDataset x_dataset) { @SuppressWarnings("index") // This method can only called on XYDataset_s with at least one item. See drawItemPass0 - /*@Positive*/ int l_minuendItemCount = x_dataset.getItemCount(0); + @Positive int l_minuendItemCount = x_dataset.getItemCount(0); @SuppressWarnings("index") // This method can only called on XYDataset_s with at least one item. See drawItemPass0 - /*@IndexFor({"x_dataset.getSeries(0)", "x_dataset.getSeries(1)"})*/ int zero = 0; + @IndexFor({"x_dataset.getSeries(0)", "x_dataset.getSeries(1)"}) int zero = 0; double l_minuendFirst = x_dataset.getXValue(0, zero); double l_minuendLast = x_dataset.getXValue(0, l_minuendItemCount - 1); @@ -1067,9 +1067,9 @@ private void createPolygon (Graphics2D x_graphics, RectangleEdge l_rangeAxisLocation = x_plot.getRangeAxisEdge(); @SuppressWarnings({"index", "value"}) // documentation bug: x_xValues should have at least 1 element - Object /*@MinLen(1)*/ [] l_xValues = x_xValues.toArray(); + Object @MinLen(1) [] l_xValues = x_xValues.toArray(); @SuppressWarnings({"index", "value"}) // documentation bug: x_yValues should have at least 1 element, and the two linked lists need to be coordinated - Object /*@MinLen(1)*/ /*@SameLen("l_xValues")*/ [] l_yValues = x_yValues.toArray(); + Object @MinLen(1) @SameLen("l_xValues") [] l_yValues = x_yValues.toArray(); GeneralPath l_path = new GeneralPath(); @@ -1147,7 +1147,7 @@ private void createPolygon (Graphics2D x_graphics, * @return A legend item for the series. */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { LegendItem result = null; XYPlot p = getPlot(); if (p != null) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java index 8d6436392..54c7cada5 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java @@ -54,12 +54,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Paint; @@ -234,7 +234,7 @@ public void setLegendShape(Shape shape) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -266,7 +266,7 @@ else if (orientation == PlotOrientation.VERTICAL) { } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); } @@ -282,7 +282,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return A legend item for the series (possibly {@code null}). */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { // if the renderer isn't assigned to a plot, then we don't have a // dataset... diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java index b9eff6915..709697d7c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java @@ -42,9 +42,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -307,14 +307,14 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { if (pass == 0 && dataset instanceof IntervalXYDataset && getItemVisible(series, item)) { IntervalXYDataset ixyd = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("ixyd.getSeries(series)")*/ int ixydItem = item; + @IndexFor("ixyd.getSeries(series)") int ixydItem = item; PlotOrientation orientation = plot.getOrientation(); if (this.drawXError) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java index 6a6ae08b3..456b538b9 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java @@ -85,11 +85,11 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Font; import java.awt.Graphics2D; @@ -146,7 +146,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return The pass count. */ - public /*@NonNegative*/ int getPassCount(); + public @NonNegative int getPassCount(); /** * Returns the lower and upper bounds (range) of the x-values in the @@ -202,7 +202,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return A boolean. */ - public boolean getItemVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public boolean getItemVisible(@NonNegative int series, @NonNegative int item); /** * Returns a boolean that indicates whether or not the specified series @@ -212,7 +212,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return A boolean. */ - public boolean isSeriesVisible(/*@NonNegative*/ int series); + public boolean isSeriesVisible(@NonNegative int series); /** * Returns the flag that controls whether a series is visible. @@ -223,7 +223,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #setSeriesVisible(int, Boolean) */ - public Boolean getSeriesVisible(/*@NonNegative*/ int series); + public Boolean getSeriesVisible(@NonNegative int series); /** * Sets the flag that controls whether a series is visible and sends a @@ -234,7 +234,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible); + public void setSeriesVisible(@NonNegative int series, Boolean visible); /** * Sets the flag that controls whether a series is visible and, if @@ -247,7 +247,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #getSeriesVisible(int) */ - public void setSeriesVisible(/*@NonNegative*/ int series, Boolean visible, boolean notify); + public void setSeriesVisible(@NonNegative int series, Boolean visible, boolean notify); /** * Returns the default visibility for all series. @@ -289,7 +289,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @return A boolean. */ - public boolean isSeriesVisibleInLegend(/*@NonNegative*/ int series); + public boolean isSeriesVisibleInLegend(@NonNegative int series); /** * Returns the flag that controls whether a series is visible in the @@ -303,7 +303,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #setSeriesVisibleInLegend(int, Boolean) */ - public Boolean getSeriesVisibleInLegend(/*@NonNegative*/ int series); + public Boolean getSeriesVisibleInLegend(@NonNegative int series); /** * Sets the flag that controls whether a series is visible in the legend @@ -314,7 +314,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible); + public void setSeriesVisibleInLegend(@NonNegative int series, Boolean visible); /** * Sets the flag that controls whether a series is visible in the legend @@ -327,7 +327,7 @@ public interface XYItemRenderer extends LegendItemSource { * * @see #getSeriesVisibleInLegend(int) */ - public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visible, + public void setSeriesVisibleInLegend(@NonNegative int series, Boolean visible, boolean notify); /** @@ -371,7 +371,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Paint getItemPaint(@NonNegative int row, @NonNegative int column); /** * Returns the paint used to color an item drawn by the renderer. @@ -382,7 +382,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesPaint(int, Paint) */ - public Paint getSeriesPaint(/*@NonNegative*/ int series); + public Paint getSeriesPaint(@NonNegative int series); /** * Sets the paint used for a series and sends a {@link RendererChangeEvent} @@ -393,9 +393,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesPaint(int) */ - public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint); + public void setSeriesPaint(@NonNegative int series, Paint paint); - public void setSeriesPaint(/*@NonNegative*/ int series, Paint paint, boolean notify); + public void setSeriesPaint(@NonNegative int series, Paint paint, boolean notify); /** * Returns the default paint. @@ -428,7 +428,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemFillPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Paint getItemFillPaint(@NonNegative int row, @NonNegative int column); /** * Returns the paint used to fill an item drawn by the renderer. @@ -437,7 +437,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (possibly {@code null}). */ - public Paint getSeriesFillPaint(/*@NonNegative*/ int series); + public Paint getSeriesFillPaint(@NonNegative int series); /** * Sets the paint used for a series and sends a @@ -446,9 +446,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * @param series the series index (zero-based). * @param paint the paint ({@code null} permitted). */ - public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint); + public void setSeriesFillPaint(@NonNegative int series, Paint paint); - public void setSeriesFillPaint(/*@NonNegative*/ int series, Paint paint, boolean notify); + public void setSeriesFillPaint(@NonNegative int series, Paint paint, boolean notify); /** * Returns the default paint. @@ -477,7 +477,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The paint (never {@code null}). */ - public Paint getItemOutlinePaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Paint getItemOutlinePaint(@NonNegative int row, @NonNegative int column); /** * Returns the paint used to outline an item drawn by the renderer. @@ -488,7 +488,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesOutlinePaint(int, Paint) */ - public Paint getSeriesOutlinePaint(/*@NonNegative*/ int series); + public Paint getSeriesOutlinePaint(@NonNegative int series); /** * Sets the paint used for a series outline and sends a @@ -499,9 +499,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesOutlinePaint(int) */ - public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint); + public void setSeriesOutlinePaint(@NonNegative int series, Paint paint); - public void setSeriesOutlinePaint(/*@NonNegative*/ int series, Paint paint, boolean notify); + public void setSeriesOutlinePaint(@NonNegative int series, Paint paint, boolean notify); /** * Returns the default outline paint. @@ -534,7 +534,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The stroke (never {@code null}). */ - public Stroke getItemStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Stroke getItemStroke(@NonNegative int row, @NonNegative int column); /** * Returns the stroke used to draw the items in a series. @@ -545,7 +545,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesStroke(int, Stroke) */ - public Stroke getSeriesStroke(/*@NonNegative*/ int series); + public Stroke getSeriesStroke(@NonNegative int series); /** * Sets the stroke used for a series and sends a @@ -556,9 +556,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesStroke(int) */ - public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke); + public void setSeriesStroke(@NonNegative int series, Stroke stroke); - public void setSeriesStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify); + public void setSeriesStroke(@NonNegative int series, Stroke stroke, boolean notify); /** * Returns the default stroke. @@ -593,7 +593,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The stroke (never {@code null}). */ - public Stroke getItemOutlineStroke(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Stroke getItemOutlineStroke(@NonNegative int row, @NonNegative int column); /** * Returns the stroke used to outline the items in a series. @@ -604,7 +604,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesOutlineStroke(int, Stroke) */ - public Stroke getSeriesOutlineStroke(/*@NonNegative*/ int series); + public Stroke getSeriesOutlineStroke(@NonNegative int series); /** * Sets the outline stroke used for a series and sends a @@ -615,9 +615,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesOutlineStroke(int) */ - public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke); + public void setSeriesOutlineStroke(@NonNegative int series, Stroke stroke); - public void setSeriesOutlineStroke(/*@NonNegative*/ int series, Stroke stroke, boolean notify); + public void setSeriesOutlineStroke(@NonNegative int series, Stroke stroke, boolean notify); /** * Returns the default outline stroke. @@ -650,7 +650,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The shape (never {@code null}). */ - public Shape getItemShape(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Shape getItemShape(@NonNegative int row, @NonNegative int column); /** * Returns a shape used to represent the items in a series. @@ -661,7 +661,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesShape(int, Shape) */ - public Shape getSeriesShape(/*@NonNegative*/ int series); + public Shape getSeriesShape(@NonNegative int series); /** * Sets the shape used for a series and sends a {@link RendererChangeEvent} @@ -672,9 +672,9 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesShape(int) */ - public void setSeriesShape(/*@NonNegative*/ int series, Shape shape); + public void setSeriesShape(@NonNegative int series, Shape shape); - public void setSeriesShape(/*@NonNegative*/ int series, Shape shape, boolean notify); + public void setSeriesShape(@NonNegative int series, Shape shape, boolean notify); /** * Returns the default shape. @@ -708,7 +708,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The legend item (possibly {@code null}). */ - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series); + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series); //// LEGEND ITEM LABEL GENERATOR ////////////////////////////////////////// @@ -741,7 +741,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @return The generator (possibly {@code null}). */ - public XYToolTipGenerator getToolTipGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public XYToolTipGenerator getToolTipGenerator(@NonNegative int row, @NonNegative int column); /** * Returns the tool tip generator for a series. @@ -752,7 +752,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #setSeriesToolTipGenerator(int, XYToolTipGenerator) */ - public XYToolTipGenerator getSeriesToolTipGenerator(/*@NonNegative*/ int series); + public XYToolTipGenerator getSeriesToolTipGenerator(@NonNegative int series); /** * Sets the tool tip generator for a series and sends a @@ -763,7 +763,7 @@ public void setSeriesVisibleInLegend(/*@NonNegative*/ int series, Boolean visibl * * @see #getSeriesToolTipGenerator(int) */ - public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, + public void setSeriesToolTipGenerator(@NonNegative int series, XYToolTipGenerator generator); /** @@ -812,7 +812,7 @@ public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, * * @return A boolean. */ - public boolean isItemLabelVisible(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public boolean isItemLabelVisible(@NonNegative int row, @NonNegative int column); /** * Returns {@code true} if the item labels for a series are visible, @@ -822,7 +822,7 @@ public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, * * @return A boolean. */ - public boolean isSeriesItemLabelsVisible(/*@NonNegative*/ int series); + public boolean isSeriesItemLabelsVisible(@NonNegative int series); /** * Sets a flag that controls the visibility of the item labels for a @@ -834,7 +834,7 @@ public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, boolean visible); + public void setSeriesItemLabelsVisible(@NonNegative int series, boolean visible); /** * Sets a flag that controls the visibility of the item labels for a series. @@ -844,7 +844,7 @@ public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible); + public void setSeriesItemLabelsVisible(@NonNegative int series, Boolean visible); /** * Sets the visibility of item labels for a series and, if requested, @@ -857,7 +857,7 @@ public void setSeriesToolTipGenerator(/*@NonNegative*/ int series, * * @see #isSeriesItemLabelsVisible(int) */ - public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visible, + public void setSeriesItemLabelsVisible(@NonNegative int series, Boolean visible, boolean notify); /** @@ -901,7 +901,7 @@ public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visi * * @return The generator (possibly {@code null}). */ - public XYItemLabelGenerator getItemLabelGenerator(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public XYItemLabelGenerator getItemLabelGenerator(@NonNegative int row, @NonNegative int column); /** * Returns the item label generator for a series. @@ -912,7 +912,7 @@ public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visi * * @see #setSeriesItemLabelGenerator(int, XYItemLabelGenerator) */ - public XYItemLabelGenerator getSeriesItemLabelGenerator(/*@NonNegative*/ int series); + public XYItemLabelGenerator getSeriesItemLabelGenerator(@NonNegative int series); /** * Sets the item label generator for a series and sends a @@ -923,7 +923,7 @@ public void setSeriesItemLabelsVisible(/*@NonNegative*/ int series, Boolean visi * * @see #getSeriesItemLabelGenerator(int) */ - public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, + public void setSeriesItemLabelGenerator(@NonNegative int series, XYItemLabelGenerator generator); /** @@ -955,7 +955,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @return The font (never {@code null}). */ - public Font getItemLabelFont(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Font getItemLabelFont(@NonNegative int row, @NonNegative int column); /** * Returns the font for all the item labels in a series. @@ -964,7 +964,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @return The font (possibly {@code null}). */ - public Font getSeriesItemLabelFont(/*@NonNegative*/ int series); + public Font getSeriesItemLabelFont(@NonNegative int series); /** * Sets the item label font for a series and sends a @@ -975,7 +975,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @see #getSeriesItemLabelFont(int) */ - public void setSeriesItemLabelFont(/*@NonNegative*/ int series, Font font); + public void setSeriesItemLabelFont(@NonNegative int series, Font font); /** * Returns the default item label font (this is used when no other font @@ -1007,7 +1007,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @return The paint (never {@code null}). */ - public Paint getItemLabelPaint(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Paint getItemLabelPaint(@NonNegative int row, @NonNegative int column); /** * Returns the paint used to draw the item labels for a series. @@ -1018,7 +1018,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @see #setSeriesItemLabelPaint(int, Paint) */ - public Paint getSeriesItemLabelPaint(/*@NonNegative*/ int series); + public Paint getSeriesItemLabelPaint(@NonNegative int series); /** * Sets the item label paint for a series and sends a @@ -1029,7 +1029,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @see #getSeriesItemLabelPaint(int) */ - public void setSeriesItemLabelPaint(/*@NonNegative*/ int series, Paint paint); + public void setSeriesItemLabelPaint(@NonNegative int series, Paint paint); /** * Returns the default item label paint. @@ -1056,7 +1056,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getPositiveItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public ItemLabelPosition getPositiveItemLabelPosition(@NonNegative int row, @NonNegative int column); /** * Returns the item label position for all positive values in a series. @@ -1065,7 +1065,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series); + public ItemLabelPosition getSeriesPositiveItemLabelPosition(@NonNegative int series); /** * Sets the item label position for all positive values in a series and @@ -1074,7 +1074,7 @@ public void setSeriesItemLabelGenerator(/*@NonNegative*/ int series, * @param series the series index (zero-based). * @param position the position ({@code null} permitted). */ - public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesPositiveItemLabelPosition(@NonNegative int series, ItemLabelPosition position); /** @@ -1086,7 +1086,7 @@ public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, * @param position the position ({@code null} permitted). * @param notify notify registered listeners? */ - public void setSeriesPositiveItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesPositiveItemLabelPosition(@NonNegative int series, ItemLabelPosition position, boolean notify); /** @@ -1126,7 +1126,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getNegativeItemLabelPosition(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public ItemLabelPosition getNegativeItemLabelPosition(@NonNegative int row, @NonNegative int column); /** * Returns the item label position for all negative values in a series. @@ -1135,7 +1135,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * * @return The item label position (never {@code null}). */ - public ItemLabelPosition getSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series); + public ItemLabelPosition getSeriesNegativeItemLabelPosition(@NonNegative int series); /** * Sets the item label position for negative values in a series and sends a @@ -1144,7 +1144,7 @@ public void setDefaultPositiveItemLabelPosition(ItemLabelPosition position, * @param series the series index (zero-based). * @param position the position ({@code null} permitted). */ - public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesNegativeItemLabelPosition(@NonNegative int series, ItemLabelPosition position); /** @@ -1156,7 +1156,7 @@ public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, * @param position the position ({@code null} permitted). * @param notify notify registered listeners? */ - public void setSeriesNegativeItemLabelPosition(/*@NonNegative*/ int series, + public void setSeriesNegativeItemLabelPosition(@NonNegative int series, ItemLabelPosition position, boolean notify); /** @@ -1187,13 +1187,13 @@ public void setDefaultNegativeItemLabelPosition(ItemLabelPosition position, // CREATE ENTITIES - public boolean getItemCreateEntity(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public boolean getItemCreateEntity(@NonNegative int series, @NonNegative int item); - public Boolean getSeriesCreateEntities(/*@NonNegative*/ int series); + public Boolean getSeriesCreateEntities(@NonNegative int series); - public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create); + public void setSeriesCreateEntities(@NonNegative int series, Boolean create); - public void setSeriesCreateEntities(/*@NonNegative*/ int series, Boolean create, + public void setSeriesCreateEntities(@NonNegative int series, Boolean create, boolean notify); public boolean getDefaultCreateEntities(); @@ -1298,7 +1298,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass); + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass); /** * Fills a band between two values on the axis. This can be used to color diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java index a60e11347..b3f5663c7 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java @@ -47,12 +47,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.geom.Line2D; @@ -71,14 +71,14 @@ public class XYItemRendererState extends RendererState { * * @since 1.0.11 */ - private /*@NonNegative*/ int firstItemIndex; + private @NonNegative int firstItemIndex; /** * The last item in the current series that will be displayed. * * @since 1.0.11 */ - private /*@NonNegative*/ int lastItemIndex; + private @NonNegative int lastItemIndex; /** * A line object that the renderer can reuse to save instantiating a lot @@ -173,8 +173,8 @@ public int getLastItemIndex() { * * @since 1.0.11 */ - public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int firstItem, - /*@IndexFor("#1.getSeries(#2)")*/ int lastItem, int pass, int passCount) { + public void startSeriesPass(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int firstItem, + @IndexFor("#1.getSeries(#2)") int lastItem, int pass, int passCount) { this.firstItemIndex = firstItem; this.lastItemIndex = lastItem; } @@ -196,7 +196,7 @@ public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, /*@I * * @since 1.0.11 */ - public void endSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, int firstItem, + public void endSeriesPass(XYDataset dataset, @NonNegative int series, int firstItem, int lastItem, int pass, int passCount) { // do nothing...this is just a hook for subclasses } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index e8618dcb0..46967877e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -72,12 +72,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Paint; @@ -245,7 +245,7 @@ public void setDrawSeriesLineAsPath(boolean flag) { * @return The pass count. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 2; } @@ -260,7 +260,7 @@ public void setDrawSeriesLineAsPath(boolean flag) { * * @return A boolean. */ - public boolean getItemLineVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemLineVisible(@NonNegative int series, @NonNegative int item) { Boolean flag = getSeriesLinesVisible(series); if (flag != null) { return flag; @@ -278,7 +278,7 @@ public boolean getItemLineVisible(/*@NonNegative*/ int series, /*@NonNegative*/ * * @see #setSeriesLinesVisible(int, Boolean) */ - public Boolean getSeriesLinesVisible(/*@NonNegative*/ int series) { + public Boolean getSeriesLinesVisible(@NonNegative int series) { return this.seriesLinesVisible.getBoolean(series); } @@ -291,7 +291,7 @@ public Boolean getSeriesLinesVisible(/*@NonNegative*/ int series) { * * @see #getSeriesLinesVisible(int) */ - public void setSeriesLinesVisible(/*@NonNegative*/ int series, Boolean flag) { + public void setSeriesLinesVisible(@NonNegative int series, Boolean flag) { this.seriesLinesVisible.setBoolean(series, flag); fireChangeEvent(); } @@ -305,7 +305,7 @@ public void setSeriesLinesVisible(/*@NonNegative*/ int series, Boolean flag) { * * @see #getSeriesLinesVisible(int) */ - public void setSeriesLinesVisible(/*@NonNegative*/ int series, boolean visible) { + public void setSeriesLinesVisible(@NonNegative int series, boolean visible) { setSeriesLinesVisible(series, Boolean.valueOf(visible)); } @@ -373,7 +373,7 @@ public void setLegendLine(Shape line) { * * @return A boolean. */ - public boolean getItemShapeVisible(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemShapeVisible(@NonNegative int series, @NonNegative int item) { Boolean flag = getSeriesShapesVisible(series); if (flag != null) { return flag; @@ -391,7 +391,7 @@ public boolean getItemShapeVisible(/*@NonNegative*/ int series, /*@NonNegative*/ * * @see #setSeriesShapesVisible(int, Boolean) */ - public Boolean getSeriesShapesVisible(/*@NonNegative*/ int series) { + public Boolean getSeriesShapesVisible(@NonNegative int series) { return this.seriesShapesVisible.getBoolean(series); } @@ -404,7 +404,7 @@ public Boolean getSeriesShapesVisible(/*@NonNegative*/ int series) { * * @see #getSeriesShapesVisible(int) */ - public void setSeriesShapesVisible(/*@NonNegative*/ int series, boolean visible) { + public void setSeriesShapesVisible(@NonNegative int series, boolean visible) { setSeriesShapesVisible(series, Boolean.valueOf(visible)); } @@ -417,7 +417,7 @@ public void setSeriesShapesVisible(/*@NonNegative*/ int series, boolean visible) * * @see #getSeriesShapesVisible(int) */ - public void setSeriesShapesVisible(/*@NonNegative*/ int series, Boolean flag) { + public void setSeriesShapesVisible(@NonNegative int series, Boolean flag) { this.seriesShapesVisible.setBoolean(series, flag); fireChangeEvent(); } @@ -461,7 +461,7 @@ public void setDefaultShapesVisible(boolean flag) { * * @return A boolean. */ - public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public boolean getItemShapeFilled(@NonNegative int series, @NonNegative int item) { Boolean flag = getSeriesShapesFilled(series); if (flag != null) { return flag; @@ -480,7 +480,7 @@ public boolean getItemShapeFilled(/*@NonNegative*/ int series, /*@NonNegative*/ * * @see #setSeriesShapesFilled(int, Boolean) */ - public Boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { + public Boolean getSeriesShapesFilled(@NonNegative int series) { return this.seriesShapesFilled.getBoolean(series); } @@ -493,7 +493,7 @@ public Boolean getSeriesShapesFilled(/*@NonNegative*/ int series) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(/*@NonNegative*/ int series, boolean flag) { + public void setSeriesShapesFilled(@NonNegative int series, boolean flag) { setSeriesShapesFilled(series, Boolean.valueOf(flag)); } @@ -506,7 +506,7 @@ public void setSeriesShapesFilled(/*@NonNegative*/ int series, boolean flag) { * * @see #getSeriesShapesFilled(int) */ - public void setSeriesShapesFilled(/*@NonNegative*/ int series, Boolean flag) { + public void setSeriesShapesFilled(@NonNegative int series, Boolean flag) { this.seriesShapesFilled.setBoolean(series, flag); fireChangeEvent(); } @@ -684,8 +684,8 @@ public void setLastPointGood(boolean good) { * @param passCount the number of passes. */ @Override - public void startSeriesPass(XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#1.getSeries(#2)")*/ int firstItem, /*@IndexFor("#1.getSeries(#2)")*/ int lastItem, int pass, int passCount) { + public void startSeriesPass(XYDataset dataset, @NonNegative int series, + @IndexFor("#1.getSeries(#2)") int firstItem, @IndexFor("#1.getSeries(#2)") int lastItem, int pass, int passCount) { this.seriesPath.reset(); this.lastPointGood = false; super.startSeriesPass(dataset, series, firstItem, lastItem, pass, @@ -738,7 +738,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -817,8 +817,8 @@ protected void drawPrimaryLine(XYItemRendererState state, XYPlot plot, XYDataset dataset, int pass, - /*@NonNegative*/ int series, - /*@IndexFor("#4.getSeries(#6)")*/ int item, + @NonNegative int series, + @IndexFor("#4.getSeries(#6)") int item, ValueAxis domainAxis, ValueAxis rangeAxis, Rectangle2D dataArea) { @@ -877,8 +877,8 @@ else if (orientation == PlotOrientation.VERTICAL) { * @param item the item index. * @param shape the shape. */ - protected void drawFirstPassShape(Graphics2D g2, int pass, /*@NonNegative*/ int series, - /*@NonNegative*/ int item, Shape shape) { + protected void drawFirstPassShape(Graphics2D g2, int pass, @NonNegative int series, + @NonNegative int item, Shape shape) { g2.setStroke(getItemStroke(series, item)); g2.setPaint(getItemPaint(series, item)); g2.draw(shape); @@ -905,7 +905,7 @@ protected void drawFirstPassShape(Graphics2D g2, int pass, /*@NonNegative*/ int */ protected void drawPrimaryLineAsPath(XYItemRendererState state, Graphics2D g2, XYPlot plot, XYDataset dataset, int pass, - /*@NonNegative*/ int series, /*@IndexFor("#4.getSeries(#6)")*/ int item, ValueAxis domainAxis, ValueAxis rangeAxis, + @NonNegative int series, @IndexFor("#4.getSeries(#6)") int item, ValueAxis domainAxis, ValueAxis rangeAxis, Rectangle2D dataArea) { RectangleEdge xAxisLocation = plot.getDomainAxisEdge(); @@ -964,7 +964,7 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, * @param entities the entity collection. */ protected void drawSecondaryPass(Graphics2D g2, XYPlot plot, - XYDataset dataset, int pass, /*@NonNegative*/ int series, /*@IndexFor("#3.getSeries(#5)")*/ int item, + XYDataset dataset, int pass, @NonNegative int series, @IndexFor("#3.getSeries(#5)") int item, ValueAxis domainAxis, Rectangle2D dataArea, ValueAxis rangeAxis, CrosshairState crosshairState, EntityCollection entities) { @@ -1031,7 +1031,7 @@ else if (orientation == PlotOrientation.VERTICAL) { } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); @@ -1052,7 +1052,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * @return A legend item for the series (possibly {@code null}). */ @Override - public LegendItem getLegendItem(/*@NonNegative*/ int datasetIndex, /*@NonNegative*/ int series) { + public LegendItem getLegendItem(@NonNegative int datasetIndex, @NonNegative int series) { XYPlot plot = getPlot(); if (plot == null) { return null; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index fc07605c4..18c8586bd 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -46,12 +46,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.BasicStroke; import java.awt.Color; @@ -409,7 +409,7 @@ public Range findZBounds(XYZDataset dataset) { * @return {@code 2}. */ @Override - public /*@NonNegative*/ int getPassCount() { + public @NonNegative int getPassCount() { return 2; } @@ -433,7 +433,7 @@ public Range findZBounds(XYZDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { Shape hotspot; EntityCollection entities = null; @@ -496,7 +496,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } } @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot See XYDotRenderer#drawItem - this is the same problem - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x, y, datasetIndex, transX, transY, orientation); @@ -516,7 +516,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, * * @return The paint. */ - protected Paint getPaint(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + protected Paint getPaint(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { Paint p; if (dataset instanceof XYZDataset) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java index e20bc7af2..3f28c73e5 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java @@ -48,8 +48,8 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.awt.GradientPaint; import java.awt.Graphics2D; @@ -301,7 +301,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, @Override protected void drawPrimaryLineAsPath(XYItemRendererState state, Graphics2D g2, XYPlot plot, XYDataset dataset, int pass, - /*@NonNegative*/ int series, /*@IndexFor("#4.getSeries(#6)")*/ int item, ValueAxis xAxis, ValueAxis yAxis, + @NonNegative int series, @IndexFor("#4.getSeries(#6)") int item, ValueAxis xAxis, ValueAxis yAxis, Rectangle2D dataArea) { XYSplineState s = (XYSplineState) state; @@ -377,7 +377,7 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, } else { // construct spline @SuppressWarnings({"index", "value"}) // array-list interop: s.points is minlen 3 at this point - /*@IntRange(from = 3)*/ int np = s.points.size(); // number of points + @IntRange(from = 3) int np = s.points.size(); // number of points float[] d = new float[np]; // Newton form coefficients float[] x = new float[np]; // x-coordinates of nodes float y, oldy; @@ -464,7 +464,7 @@ protected void drawPrimaryLineAsPath(XYItemRendererState state, } private void solveTridiag(float[] sub, float[] diag, float[] sup, - float[] b, /*@IndexFor({"#1", "#2", "#3", "#4"})*/ int n) { + float[] b, @IndexFor({"#1", "#2", "#3", "#4"}) int n) { /* solve linear system with tridiagonal n by n matrix a using Gaussian elimination *without* pivoting where a(i,i-1) = sub[i] for 2<=i<=n diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java index b71d12876..f20c4910c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java @@ -57,9 +57,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -397,7 +397,7 @@ public XYItemRendererState initialise(Graphics2D g2, Rectangle2D dataArea, public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); @@ -561,7 +561,7 @@ else if (orientation == PlotOrientation.HORIZONTAL) { // do we need to update the crosshair values? if (!Double.isNaN(y1)) { @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java index fab5e634b..e26118d65 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java @@ -72,9 +72,9 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -203,7 +203,7 @@ public void setStepPoint(double stepPoint) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -277,7 +277,7 @@ else if (orientation == PlotOrientation.VERTICAL) { // submit this data item as a candidate for the crosshair point @SuppressWarnings("index") // documentation bug: dataset is assumed to be associated with plot - /*@NonNegative*/ int datasetIndex = plot.indexOf(dataset); + @NonNegative int datasetIndex = plot.indexOf(dataset); updateCrosshairValues(crosshairState, x1, y1, datasetIndex, transX1, transY1, orientation); diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index 5ef714e92..07610a059 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -49,12 +49,12 @@ */ package org.jfree.chart.renderer.xy; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Font; import java.awt.Graphics2D; @@ -183,7 +183,7 @@ public Range findRangeBounds(XYDataset dataset) { public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, - /*@NonNegative*/ int series, /*@IndexFor("#8.getSeries(#9)")*/ int item, CrosshairState crosshairState, int pass) { + @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { // do nothing if item is not visible if (!getItemVisible(series, item)) { @@ -198,7 +198,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - /*@IndexFor("intervalDataset.getSeries(series)")*/ int intervalItem = item; + @IndexFor("intervalDataset.getSeries(series)") int intervalItem = item; double x = intervalDataset.getXValue(series, intervalItem); double yLow = intervalDataset.getStartYValue(series, intervalItem); @@ -269,8 +269,8 @@ else if (orientation == PlotOrientation.VERTICAL) { * @param y the y coordinate (in Java2D space). */ private void drawAdditionalItemLabel(Graphics2D g2, - PlotOrientation orientation, XYDataset dataset, /*@NonNegative*/ int series, - /*@IndexFor("#3.getSeries(#4)")*/ int item, double x, double y) { + PlotOrientation orientation, XYDataset dataset, @NonNegative int series, + @IndexFor("#3.getSeries(#4)") int item, double x, double y) { if (this.additionalItemLabelGenerator == null) { return; diff --git a/src/main/java/org/jfree/chart/text/G2TextMeasurer.java b/src/main/java/org/jfree/chart/text/G2TextMeasurer.java index 7c0b0c435..8c48f81a6 100644 --- a/src/main/java/org/jfree/chart/text/G2TextMeasurer.java +++ b/src/main/java/org/jfree/chart/text/G2TextMeasurer.java @@ -27,8 +27,8 @@ */ package org.jfree.chart.text; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; import java.awt.FontMetrics; import java.awt.Graphics2D; @@ -61,7 +61,7 @@ public G2TextMeasurer(Graphics2D g2) { * @return The string width. */ @Override - public float getStringWidth(String text, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int end) { + public float getStringWidth(String text, @IndexOrHigh("#1") int start, @IndexOrHigh("#1") int end) { FontMetrics fm = this.g2.getFontMetrics(); Rectangle2D bounds = TextUtils.getTextBounds(text.substring(start, end), this.g2, fm); diff --git a/src/main/java/org/jfree/chart/text/TextBlock.java b/src/main/java/org/jfree/chart/text/TextBlock.java index 17d087a79..de58e93fe 100644 --- a/src/main/java/org/jfree/chart/text/TextBlock.java +++ b/src/main/java/org/jfree/chart/text/TextBlock.java @@ -28,9 +28,9 @@ package org.jfree.chart.text; -/*>>> + import org.checkerframework.common.value.qual.ArrayLen; - */ + import java.awt.Font; import java.awt.Graphics2D; @@ -243,7 +243,7 @@ else if (this.lineAlignment == HorizontalAlignment.RIGHT) { * * @return The offsets (float[0] = x offset, float[1] = y offset). */ - private float /*@ArrayLen(2)*/ [] calculateOffsets(TextBlockAnchor anchor, double width, + private float @ArrayLen(2) [] calculateOffsets(TextBlockAnchor anchor, double width, double height) { float[] result = new float[2]; float xAdj = 0.0f; diff --git a/src/main/java/org/jfree/chart/text/TextMeasurer.java b/src/main/java/org/jfree/chart/text/TextMeasurer.java index 99089fa09..3554a00f0 100644 --- a/src/main/java/org/jfree/chart/text/TextMeasurer.java +++ b/src/main/java/org/jfree/chart/text/TextMeasurer.java @@ -27,7 +27,7 @@ */ package org.jfree.chart.text; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; /** * An object that can measure text. @@ -44,7 +44,7 @@ public interface TextMeasurer { * * @return The width of the string in Java2D units. */ - public float getStringWidth(String text, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int end); + public float getStringWidth(String text, @IndexOrHigh("#1") int start, @IndexOrHigh("#1") int end); } diff --git a/src/main/java/org/jfree/chart/text/TextUtils.java b/src/main/java/org/jfree/chart/text/TextUtils.java index 39743e3a2..626d6306f 100644 --- a/src/main/java/org/jfree/chart/text/TextUtils.java +++ b/src/main/java/org/jfree/chart/text/TextUtils.java @@ -27,10 +27,10 @@ */ package org.jfree.chart.text; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; import java.awt.Font; import java.awt.FontMetrics; @@ -165,7 +165,7 @@ public static TextBlock createTextBlock(String text, Font font, TextBlock result = new TextBlock(); BreakIterator iterator = BreakIterator.getLineInstance(); iterator.setText(text); - /*@NonNegative*/ int current = 0; + @NonNegative int current = 0; int lines = 0; int length = text.length(); while (current < length && lines < maxLines) { @@ -179,7 +179,7 @@ public static TextBlock createTextBlock(String text, Font font, } @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: next is either < current < text.length, or next = current + 1 <= text.length - /*@IndexOrHigh("text")*/ int next1 = next; + @IndexOrHigh("text") int next1 = next; result.addLine(text.substring(current, next1), font, paint); lines++; @@ -218,7 +218,7 @@ public static TextBlock createTextBlock(String text, Font font, * * @return The index of the next line break. */ - private static /*@GTENegativeOne*/ int nextLineBreak(String text, /*@IndexOrHigh("#1")*/ int start, float width, + private static @GTENegativeOne int nextLineBreak(String text, @IndexOrHigh("#1") int start, float width, BreakIterator iterator, TextMeasurer measurer) { // this method is (loosely) based on code in JFreeReport's @@ -372,7 +372,7 @@ public static Rectangle2D drawAlignedString(String text, Graphics2D g2, * * @return The offsets. */ - private static float /*@ArrayLen(3)*/ [] deriveTextBoundsAnchorOffsets(Graphics2D g2, + private static float @ArrayLen(3) [] deriveTextBoundsAnchorOffsets(Graphics2D g2, String text, TextAnchor anchor, Rectangle2D textBounds) { float[] result = new float[3]; @@ -593,7 +593,7 @@ public static Shape calculateRotatedStringBounds(String text, Graphics2D g2, * * @return The offsets. */ - private static float /*@ArrayLen(2)*/ [] deriveTextBoundsAnchorOffsets(Graphics2D g2, + private static float @ArrayLen(2) [] deriveTextBoundsAnchorOffsets(Graphics2D g2, String text, TextAnchor anchor) { float[] result = new float[2]; @@ -648,7 +648,7 @@ else if (anchor.isBottom()) { * * @return The offsets. */ - private static float /*@ArrayLen(2)*/ [] deriveRotationAnchorOffsets(Graphics2D g2, + private static float @ArrayLen(2) [] deriveRotationAnchorOffsets(Graphics2D g2, String text, TextAnchor anchor) { float[] result = new float[2]; diff --git a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java index 38841422c..e5af10d5f 100644 --- a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java +++ b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java @@ -42,9 +42,9 @@ package org.jfree.chart.title; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Graphics2D; import java.awt.Shape; @@ -85,7 +85,7 @@ public class LegendItemBlockContainer extends BlockContainer { private int datasetIndex; /** The series index. */ - private /*@NonNegative*/ int series; + private @NonNegative int series; /** The tool tip text (can be {@code null}). */ private String toolTipText; @@ -136,7 +136,7 @@ public Comparable getSeriesKey() { * * @return The series index. */ - public /*@NonNegative*/ int getSeriesIndex() { + public @NonNegative int getSeriesIndex() { return this.series; } diff --git a/src/main/java/org/jfree/chart/ui/LCBLayout.java b/src/main/java/org/jfree/chart/ui/LCBLayout.java index 76ce48e7d..5dc9b887c 100644 --- a/src/main/java/org/jfree/chart/ui/LCBLayout.java +++ b/src/main/java/org/jfree/chart/ui/LCBLayout.java @@ -27,10 +27,10 @@ */ package org.jfree.chart.ui; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; import java.awt.Component; import java.awt.Container; @@ -51,7 +51,7 @@ public class LCBLayout implements LayoutManager, Serializable { private static final int COLUMNS = 3; /** Tracks the column widths. */ - private int /*@ArrayLen(3)*/ [] colWidth; + private int @ArrayLen(3) [] colWidth; /** Tracks the row heights. */ private int[] rowHeight; @@ -70,7 +70,7 @@ public class LCBLayout implements LayoutManager, Serializable { * * @param maxrows the maximum number of rows. */ - public LCBLayout(/*@NonNegative*/ int maxrows) { + public LCBLayout(@NonNegative int maxrows) { this.labelGap = 10; this.buttonGap = 6; this.vGap = 2; @@ -92,7 +92,7 @@ public Dimension preferredLayoutSize(Container parent) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); @SuppressWarnings("index") // documentation bug: (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash, and that should be documented, or this will crash. I believe this is by design, but it's not good code. - /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; + @IndexOrHigh("this.rowHeight") int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { Component component = parent.getComponent(r * COLUMNS + c); @@ -134,7 +134,7 @@ public Dimension minimumLayoutSize(Container parent) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); @SuppressWarnings("index") // documentation bug: (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash, and that should be documented, or this will crash. I believe this is by design, but it's not good code. - /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; + @IndexOrHigh("this.rowHeight") int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { Component component = parent.getComponent(r * COLUMNS + c); @@ -174,7 +174,7 @@ public void layoutContainer(Container parent) { Insets insets = parent.getInsets(); int ncomponents = parent.getComponentCount(); @SuppressWarnings("index") // documentation bug: (parent's components / COLUMNS) must be less than the max rows for this LCBLayout, or this will crash, and that should be documented, or this will crash. I believe this is by design, but it's not good code. - /*@IndexOrHigh("this.rowHeight")*/ int nrows = ncomponents / COLUMNS; + @IndexOrHigh("this.rowHeight") int nrows = ncomponents / COLUMNS; for (int c = 0; c < COLUMNS; c++) { for (int r = 0; r < nrows; r++) { Component component = parent.getComponent(r * COLUMNS + c); diff --git a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java index 0b3aee726..9e58c16f6 100644 --- a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java +++ b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java @@ -27,7 +27,7 @@ */ package org.jfree.chart.ui; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Component; import java.text.NumberFormat; @@ -66,7 +66,7 @@ public NumberCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + boolean hasFocus, @NonNegative int row, @NonNegative int column) { setFont(null); NumberFormat nf = NumberFormat.getNumberInstance(); diff --git a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java index ac8eae126..3d8ebe58c 100644 --- a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java @@ -52,9 +52,9 @@ package org.jfree.chart.urls; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.category.CategoryDataset; @@ -76,7 +76,7 @@ public interface CategoryURLGenerator { * * @return A string containing the URL. */ - public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, - /*@NonNegative*/ int category); + public String generateURL(CategoryDataset dataset, @NonNegative int series, + @NonNegative int category); } diff --git a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java index 2a032529a..c6e6c018f 100644 --- a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java @@ -41,9 +41,9 @@ */ package org.jfree.chart.urls; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.ArrayList; @@ -73,7 +73,7 @@ public CustomCategoryURLGenerator() { * * @return The list count. */ - public /*@NonNegative*/ int getListCount() { + public @NonNegative int getListCount() { return this.urlSeries.size(); } @@ -84,7 +84,7 @@ public CustomCategoryURLGenerator() { * * @return The URL count. */ - public int getURLCount(/*@NonNegative*/ int list) { + public int getURLCount(@NonNegative int list) { int result = 0; List urls = (List) this.urlSeries.get(list); if (urls != null) { @@ -101,7 +101,7 @@ public int getURLCount(/*@NonNegative*/ int list) { * * @return The URL (possibly {@code null}). */ - public String getURL(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String getURL(@NonNegative int series, @NonNegative int item) { String result = null; if (series < getListCount()) { List urls = (List) this.urlSeries.get(series); @@ -124,7 +124,7 @@ public String getURL(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return A string containing the URL (possibly {@code null}). */ @Override - public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateURL(CategoryDataset dataset, @NonNegative int series, @NonNegative int item) { return getURL(series, item); } diff --git a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java index 03231f3ce..43fb7ba7f 100644 --- a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java @@ -41,12 +41,12 @@ */ package org.jfree.chart.urls; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; -*/ + import java.io.Serializable; import java.util.ArrayList; @@ -93,7 +93,7 @@ public CustomPieURLGenerator() { */ @Override public String generateURL(PieDataset dataset, Comparable key, - /*@NonNegative*/ int pieIndex) { + @NonNegative int pieIndex) { return getURL(key, pieIndex); } @@ -104,7 +104,7 @@ public String generateURL(PieDataset dataset, Comparable key, * * @see #addURLs(Map) */ - public /*@NonNegative*/ int getListCount() { + public @NonNegative int getListCount() { return this.urls.size(); } @@ -118,7 +118,7 @@ public String generateURL(PieDataset dataset, Comparable key, * * @see #getListCount() */ - public int getURLCount(/*@NonNegative*/ int list) { + public int getURLCount(@NonNegative int list) { int result = 0; Map urlMap = (Map) this.urls.get(list); if (urlMap != null) { @@ -135,7 +135,7 @@ public int getURLCount(/*@NonNegative*/ int list) { * * @return The URL. */ - public String getURL(Comparable key, /*@NonNegative*/ int mapIndex) { + public String getURL(Comparable key, @NonNegative int mapIndex) { String result = null; if (mapIndex < getListCount()) { Map urlMap = (Map) this.urls.get(mapIndex); diff --git a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java index 546f8b0ba..6fea2e53e 100644 --- a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java @@ -47,9 +47,9 @@ package org.jfree.chart.urls; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.ArrayList; @@ -82,7 +82,7 @@ public CustomXYURLGenerator() { * * @return The list count. */ - public /*@NonNegative*/ int getListCount() { + public @NonNegative int getListCount() { return this.urlSeries.size(); } @@ -93,7 +93,7 @@ public CustomXYURLGenerator() { * * @return The URL count. */ - public int getURLCount(/*@NonNegative*/ int list) { + public int getURLCount(@NonNegative int list) { int result = 0; List urls = (List) this.urlSeries.get(list); if (urls != null) { @@ -110,7 +110,7 @@ public int getURLCount(/*@NonNegative*/ int list) { * * @return The URL (possibly {@code null}). */ - public String getURL(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String getURL(@NonNegative int series, @NonNegative int item) { String result = null; if (series < getListCount()) { List urls = (List) this.urlSeries.get(series); @@ -133,7 +133,7 @@ public String getURL(/*@NonNegative*/ int series, /*@NonNegative*/ int item) { * @return A string containing the URL (possibly {@code null}). */ @Override - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateURL(XYDataset dataset, @NonNegative int series, @NonNegative int item) { return getURL(series, item); } diff --git a/src/main/java/org/jfree/chart/urls/PieURLGenerator.java b/src/main/java/org/jfree/chart/urls/PieURLGenerator.java index 45a09f108..e55b86bb1 100644 --- a/src/main/java/org/jfree/chart/urls/PieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/PieURLGenerator.java @@ -46,7 +46,7 @@ */ package org.jfree.chart.urls; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import org.jfree.data.general.PieDataset; @@ -76,6 +76,6 @@ public interface PieURLGenerator { * * @return A string containing the URL. */ - public String generateURL(PieDataset dataset, Comparable key, /*@NonNegative*/ int pieIndex); + public String generateURL(PieDataset dataset, Comparable key, @NonNegative int pieIndex); } diff --git a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java index 5d5d63de5..a37d44954 100644 --- a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java @@ -55,9 +55,9 @@ package org.jfree.chart.urls; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.io.UnsupportedEncodingException; @@ -136,8 +136,8 @@ public StandardCategoryURLGenerator(String prefix, * @return The generated URL. */ @Override - public String generateURL(CategoryDataset dataset, /*@NonNegative*/ int series, - /*@NonNegative*/ int category) { + public String generateURL(CategoryDataset dataset, @NonNegative int series, + @NonNegative int category) { String url = this.prefix; Comparable seriesKey = dataset.getRowKey(series); Comparable categoryKey = dataset.getColumnKey(category); diff --git a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java index bbf82776e..d80b9857e 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java @@ -49,9 +49,9 @@ package org.jfree.chart.urls; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import org.jfree.chart.util.ObjectUtils; @@ -133,7 +133,7 @@ public StandardXYURLGenerator(String prefix, String seriesParameterName, * @return The generated URL. */ @Override - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateURL(XYDataset dataset, @NonNegative int series, @NonNegative int item) { // TODO: URLEncode? String url = this.prefix; boolean firstParameter = url.indexOf("?") == -1; diff --git a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java index 07be34d64..a0a53feb5 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java @@ -40,9 +40,9 @@ package org.jfree.chart.urls; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.xy.XYZDataset; @@ -62,7 +62,7 @@ public class StandardXYZURLGenerator extends StandardXYURLGenerator * @return A string containing the generated URL. */ @Override - public String generateURL(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item) { + public String generateURL(XYZDataset dataset, @NonNegative int series, @NonNegative int item) { return super.generateURL(dataset, series, item); } diff --git a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java index 50921f99d..de9c5f4c4 100644 --- a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java @@ -50,11 +50,11 @@ */ package org.jfree.chart.urls; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.io.UnsupportedEncodingException; @@ -170,7 +170,7 @@ public String getItemParameterName() { * @return The generated URL. */ @Override - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item) { + public String generateURL(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { String result = this.prefix; boolean firstParameter = !result.contains("?"); Comparable seriesKey = dataset.getSeriesKey(series); diff --git a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java index 65fb9f3f7..b7ca67184 100644 --- a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java @@ -44,11 +44,11 @@ */ package org.jfree.chart.urls; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.xy.XYDataset; @@ -71,6 +71,6 @@ public interface XYURLGenerator { * @return A string containing the generated URL (possibly * {@code null}). */ - public String generateURL(XYDataset dataset, /*@NonNegative*/ int series, /*@IndexFor("#1.getSeries(#2)")*/ int item); + public String generateURL(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item); } diff --git a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java index 2f5e4295c..12911181e 100644 --- a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java @@ -41,9 +41,9 @@ package org.jfree.chart.urls; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.xy.XYZDataset; @@ -65,6 +65,6 @@ public interface XYZURLGenerator extends XYURLGenerator { * * @return A string containing the generated URL. */ - public String generateURL(XYZDataset dataset, /*@NonNegative*/ int series, /*@NonNegative*/ int item); + public String generateURL(XYZDataset dataset, @NonNegative int series, @NonNegative int item); } diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index f430fce74..f90056179 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -28,14 +28,14 @@ package org.jfree.chart.util; -/*>>> + import org.checkerframework.common.value.qual.IntVal; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.index.qual.GTENegativeOne; import org.checkerframework.checker.index.qual.LengthOf; import org.checkerframework.checker.index.qual.LTLengthOf; import org.checkerframework.checker.index.qual.IndexFor; - */ + import java.io.IOException; import java.io.ObjectInputStream; @@ -52,16 +52,16 @@ public class AbstractObjectList implements Cloneable, Serializable { private static final long serialVersionUID = 7789833772597351595L; /** The default initial capacity of the list. */ - public static final /*@NonNegative*/ int DEFAULT_INITIAL_CAPACITY = 8; + public static final @NonNegative int DEFAULT_INITIAL_CAPACITY = 8; /** Storage for the objects. */ private transient Object[] objects; /** The current list size. */ - private /*@LengthOf("this.objects")*/ int size = 0; + private @LengthOf("this.objects") int size = 0; /** The default increment. */ - private /*@NonNegative*/ int increment = DEFAULT_INITIAL_CAPACITY; + private @NonNegative int increment = DEFAULT_INITIAL_CAPACITY; /** * Creates a new list with the default initial capacity. @@ -75,7 +75,7 @@ protected AbstractObjectList() { * * @param initialCapacity the initial capacity. */ - protected AbstractObjectList(/*@NonNegative*/ int initialCapacity) { + protected AbstractObjectList(@NonNegative int initialCapacity) { this (initialCapacity, initialCapacity); } @@ -85,7 +85,7 @@ protected AbstractObjectList(/*@NonNegative*/ int initialCapacity) { * @param initialCapacity the initial capacity. * @param increment the increment. */ - protected AbstractObjectList(/*@NonNegative*/ int initialCapacity, /*@NonNegative*/ int increment) { + protected AbstractObjectList(@NonNegative int initialCapacity, @NonNegative int increment) { this.objects = new Object[initialCapacity]; this.increment = increment; } @@ -98,7 +98,7 @@ protected AbstractObjectList(/*@NonNegative*/ int initialCapacity, /*@NonNegativ * * @return The object or {@code null}. */ - protected Object get(/*@NonNegative*/ int index) { + protected Object get(@NonNegative int index) { Object result = null; if (index >= 0 && index < this.size) { result = this.objects[index]; @@ -112,19 +112,19 @@ protected Object get(/*@NonNegative*/ int index) { * @param index the object index. * @param object the object ({@code null} permitted). */ - protected void set(/*@NonNegative*/ int index, Object object) { + protected void set(@NonNegative int index, Object object) { if (index < 0) { throw new IllegalArgumentException("Requires index >= 0."); } if (index >= this.objects.length) { Object[] enlarged = new Object[index + this.increment]; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/176 - /*@LTLengthOf(value={"this.objects", "enlarged"}, offset={"0 - 1", "0 - 1"})*/ int tmp = this.objects.length; + @LTLengthOf(value={"this.objects", "enlarged"}, offset={"0 - 1", "0 - 1"}) int tmp = this.objects.length; System.arraycopy(this.objects, 0, enlarged, 0, tmp); this.objects = enlarged; } @SuppressWarnings("index") // if index wasn't large enough before, this.objects was enlarged by the code above - /*@IndexFor("this.objects")*/ int newIndex = index; + @IndexFor("this.objects") int newIndex = index; index = newIndex; this.objects[index] = object; this.size = Math.max(this.size, index + 1); @@ -155,7 +155,7 @@ public int size() { * * @return The index or -1. */ - protected /*@GTENegativeOne*/ int indexOf(Object object) { + protected @GTENegativeOne int indexOf(Object object) { for (int index = 0; index < this.size; index++) { if (this.objects[index] == object) { return (index); @@ -269,7 +269,7 @@ private void readObject(ObjectInputStream stream) final int count = stream.readInt(); for (int i = 0; i < count; i++) { @SuppressWarnings("index") // stream only contains GTEN1 ints? or is this a bug? - final /*@GTENegativeOne*/ int index = stream.readInt(); + final @GTENegativeOne int index = stream.readInt(); if (index != -1) { set(index, stream.readObject()); } diff --git a/src/main/java/org/jfree/chart/util/AttrStringUtils.java b/src/main/java/org/jfree/chart/util/AttrStringUtils.java index e5607d73c..b9adc90a9 100644 --- a/src/main/java/org/jfree/chart/util/AttrStringUtils.java +++ b/src/main/java/org/jfree/chart/util/AttrStringUtils.java @@ -40,8 +40,8 @@ */ package org.jfree.chart.util; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; import java.awt.font.TextLayout; @@ -176,7 +176,7 @@ public static void drawRotatedString(AttributedString text, Graphics2D g2, y + textAdj[1] + rotateAdj[1]); } - private static float /*@ArrayLen(3)*/ [] deriveTextBoundsAnchorOffsets(Graphics2D g2, + private static float @ArrayLen(3) [] deriveTextBoundsAnchorOffsets(Graphics2D g2, AttributedString text, TextAnchor anchor, Rectangle2D textBounds) { TextLayout layout = new TextLayout(text.getIterator(), g2.getFontRenderContext()); @@ -233,7 +233,7 @@ else if (isBottom(anchor)) { * * @return The offsets. */ - private static float /*@ArrayLen(2)*/ [] deriveRotationAnchorOffsets(Graphics2D g2, + private static float @ArrayLen(2) [] deriveRotationAnchorOffsets(Graphics2D g2, AttributedString text, TextAnchor anchor) { float[] result = new float[2]; diff --git a/src/main/java/org/jfree/chart/util/BooleanList.java b/src/main/java/org/jfree/chart/util/BooleanList.java index 1ccfcb471..1d53eeb20 100644 --- a/src/main/java/org/jfree/chart/util/BooleanList.java +++ b/src/main/java/org/jfree/chart/util/BooleanList.java @@ -27,7 +27,7 @@ */ package org.jfree.chart.util; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; /** * A list of {@code Boolean} objects. @@ -50,7 +50,7 @@ public BooleanList() { * * @return a {@link Boolean} from the list. */ - public Boolean getBoolean(/*@NonNegative*/ int index) { + public Boolean getBoolean(@NonNegative int index) { return (Boolean) get(index); } @@ -61,7 +61,7 @@ public Boolean getBoolean(/*@NonNegative*/ int index) { * @param index the index (zero-based). * @param b the boolean. */ - public void setBoolean(/*@NonNegative*/ int index, Boolean b) { + public void setBoolean(@NonNegative int index, Boolean b) { set(index, b); } diff --git a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java index 89ab2562c..cad1920bf 100644 --- a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java +++ b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java @@ -41,8 +41,8 @@ */ package org.jfree.chart.util; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; import java.awt.Color; import java.awt.Graphics2D; @@ -64,7 +64,7 @@ public class DefaultShadowGenerator implements ShadowGenerator, Serializable { private static final long serialVersionUID = 2732993885591386064L; /** The shadow size. */ - private /*@NonNegative*/ int shadowSize; + private @NonNegative int shadowSize; /** The shadow color. */ private Color shadowColor; @@ -94,7 +94,7 @@ public DefaultShadowGenerator() { * @param distance the shadow offset distance. * @param angle the shadow offset angle (in radians). */ - public DefaultShadowGenerator(/*@NonNegative*/ int size, Color color, float opacity, + public DefaultShadowGenerator(@NonNegative int size, Color color, float opacity, int distance, double angle) { Args.nullNotPermitted(color, "color"); this.shadowSize = size; @@ -240,7 +240,7 @@ protected void applyShadow(BufferedImage image) { int dead = (dataBuffer[bufferOffset] = a << 24 | shadowRgb); @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: historyIdx is always less than this.shadowSize, which is the length of aHistory - /*@IndexFor("aHistory")*/ int historyIdx1 = historyIdx; + @IndexFor("aHistory") int historyIdx1 = historyIdx; // substract the oldest pixel from the sum aSum -= aHistory[historyIdx1]; @@ -278,7 +278,7 @@ protected void applyShadow(BufferedImage image) { int dead = (dataBuffer[bufferOffset] = a << 24 | shadowRgb); @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: historyIdx is always less than this.shadowSize, which is the length of aHistory - /*@IndexFor("aHistory")*/ int historyIdx1 = historyIdx; + @IndexFor("aHistory") int historyIdx1 = historyIdx; // substract the oldest pixel from the sum aSum -= aHistory[historyIdx1]; diff --git a/src/main/java/org/jfree/chart/util/ObjectList.java b/src/main/java/org/jfree/chart/util/ObjectList.java index c3e0fb64d..be1c4c7a8 100644 --- a/src/main/java/org/jfree/chart/util/ObjectList.java +++ b/src/main/java/org/jfree/chart/util/ObjectList.java @@ -27,11 +27,11 @@ */ package org.jfree.chart.util; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * A list of objects that can grow as required. @@ -51,7 +51,7 @@ public ObjectList() { * * @param initialCapacity the initial capacity. */ - public ObjectList(/*@NonNegative*/ int initialCapacity) { + public ObjectList(@NonNegative int initialCapacity) { super(initialCapacity); } @@ -69,7 +69,7 @@ public ObjectList(/*@NonNegative*/ int initialCapacity) { * @return The object or {@code null}. */ @Override - public Object get(/*@NonNegative*/ int index) { + public Object get(@NonNegative int index) { return super.get(index); } @@ -80,7 +80,7 @@ public Object get(/*@NonNegative*/ int index) { * @param object the object ({@code null} permitted). */ @Override - public void set(/*@NonNegative*/ int index, Object object) { + public void set(@NonNegative int index, Object object) { super.set(index, object); } @@ -92,7 +92,7 @@ public void set(/*@NonNegative*/ int index, Object object) { * @return The index or -1. */ @Override - public /*@GTENegativeOne*/ int indexOf(Object object) { + public @GTENegativeOne int indexOf(Object object) { return super.indexOf(object); } diff --git a/src/main/java/org/jfree/chart/util/PaintAlpha.java b/src/main/java/org/jfree/chart/util/PaintAlpha.java index 918043fe7..56497a7e3 100644 --- a/src/main/java/org/jfree/chart/util/PaintAlpha.java +++ b/src/main/java/org/jfree/chart/util/PaintAlpha.java @@ -43,8 +43,8 @@ package org.jfree.chart.util; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; import java.awt.Color; import java.awt.GradientPaint; @@ -254,7 +254,7 @@ private static TexturePaint darkerTexturePaint(TexturePaint paint) { final int wid = ras.getWidth(); @SuppressWarnings("index") // wid is NN, as is img.getSampleModel().getNumBands(). Both require JDK annotations on classes in java.awt.image - /*@NonNegative*/ int pixLength = wid * img.getSampleModel().getNumBands(); + @NonNegative int pixLength = wid * img.getSampleModel().getNumBands(); /**/ int[] pix = new int[pixLength]; /* (pix-buffer is large enough for all pixels of one row) */ diff --git a/src/main/java/org/jfree/chart/util/PaintList.java b/src/main/java/org/jfree/chart/util/PaintList.java index 144698819..a039b8147 100644 --- a/src/main/java/org/jfree/chart/util/PaintList.java +++ b/src/main/java/org/jfree/chart/util/PaintList.java @@ -28,9 +28,9 @@ package org.jfree.chart.util; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Paint; import java.io.IOException; @@ -58,7 +58,7 @@ public PaintList() { * * @return The object. */ - public Paint getPaint(/*@NonNegative*/ int index) { + public Paint getPaint(@NonNegative int index) { return (Paint) get(index); } @@ -68,7 +68,7 @@ public Paint getPaint(/*@NonNegative*/ int index) { * @param index the index (zero-based). * @param paint the {@link Paint}. */ - public void setPaint(/*@NonNegative*/ int index, Paint paint) { + public void setPaint(@NonNegative int index, Paint paint) { set(index, paint); } diff --git a/src/main/java/org/jfree/chart/util/ShapeList.java b/src/main/java/org/jfree/chart/util/ShapeList.java index a9af2d641..21d0e31a0 100644 --- a/src/main/java/org/jfree/chart/util/ShapeList.java +++ b/src/main/java/org/jfree/chart/util/ShapeList.java @@ -27,7 +27,7 @@ */ package org.jfree.chart.util; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Shape; import java.io.IOException; @@ -53,7 +53,7 @@ public ShapeList() { * * @return The object. */ - public Shape getShape(/*@NonNegative*/ int index) { + public Shape getShape(@NonNegative int index) { return (Shape) get(index); } @@ -64,7 +64,7 @@ public Shape getShape(/*@NonNegative*/ int index) { * @param index the index (zero-based). * @param shape the {@link Shape}. */ - public void setShape(/*@NonNegative*/ int index, Shape shape) { + public void setShape(@NonNegative int index, Shape shape) { set(index, shape); } diff --git a/src/main/java/org/jfree/chart/util/StringUtils.java b/src/main/java/org/jfree/chart/util/StringUtils.java index a9fa132a9..4b17399ef 100644 --- a/src/main/java/org/jfree/chart/util/StringUtils.java +++ b/src/main/java/org/jfree/chart/util/StringUtils.java @@ -28,7 +28,7 @@ package org.jfree.chart.util; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; /** * String utilities. @@ -70,7 +70,7 @@ public static boolean endsWithIgnoreCase(String base, String end) { } @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/154 - /*@NonNegative*/ int toffset = base.length() - end.length(); + @NonNegative int toffset = base.length() - end.length(); return base.regionMatches(true, toffset, end, 0, end.length()); } diff --git a/src/main/java/org/jfree/chart/util/StrokeList.java b/src/main/java/org/jfree/chart/util/StrokeList.java index e6f92a6f6..7fa9170c7 100644 --- a/src/main/java/org/jfree/chart/util/StrokeList.java +++ b/src/main/java/org/jfree/chart/util/StrokeList.java @@ -28,9 +28,9 @@ package org.jfree.chart.util; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.awt.Stroke; import java.io.IOException; @@ -56,7 +56,7 @@ public StrokeList() { * * @return The object. */ - public Stroke getStroke(/*@NonNegative*/ int index) { + public Stroke getStroke(@NonNegative int index) { return (Stroke) get(index); } @@ -66,7 +66,7 @@ public Stroke getStroke(/*@NonNegative*/ int index) { * @param index the index (zero-based). * @param stroke the {@link Stroke}. */ - public void setStroke(/*@NonNegative*/ int index, Stroke stroke) { + public void setStroke(@NonNegative int index, Stroke stroke) { set(index, stroke); } diff --git a/src/main/java/org/jfree/data/ComparableObjectSeries.java b/src/main/java/org/jfree/data/ComparableObjectSeries.java index f3d30ee36..11ddd3c3a 100644 --- a/src/main/java/org/jfree/data/ComparableObjectSeries.java +++ b/src/main/java/org/jfree/data/ComparableObjectSeries.java @@ -41,8 +41,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Collections; @@ -66,7 +66,7 @@ public class ComparableObjectSeries extends Series protected List data; /** The maximum number of items for the series. */ - private /*@NonNegative*/ int maximumItemCount = Integer.MAX_VALUE; + private @NonNegative int maximumItemCount = Integer.MAX_VALUE; /** A flag that controls whether the items are automatically sorted. */ private boolean autoSort; @@ -130,7 +130,7 @@ public boolean getAllowDuplicateXValues() { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.data.size(); } @@ -141,7 +141,7 @@ public boolean getAllowDuplicateXValues() { * @return The maximum item count. * @see #setMaximumItemCount(int) */ - public /*@NonNegative*/ int getMaximumItemCount() { + public @NonNegative int getMaximumItemCount() { return this.maximumItemCount; } @@ -159,7 +159,7 @@ public boolean getAllowDuplicateXValues() { * * @param maximum the maximum number of items for the series. */ - public void setMaximumItemCount(/*@NonNegative*/ int maximum) { + public void setMaximumItemCount(@NonNegative int maximum) { this.maximumItemCount = maximum; boolean dataRemoved = false; while (this.data.size() > maximum) { @@ -221,7 +221,7 @@ protected void add(ComparableObjectItem item, boolean notify) { int index = Collections.binarySearch(this.data, item); if (index < 0) { @SuppressWarnings("index") // binary search on list - /*@NonNegative*/ int reverseIndex = -index - 1; + @NonNegative int reverseIndex = -index - 1; this.data.add(reverseIndex, item); } else { @@ -318,7 +318,7 @@ protected void update(Comparable x, Object y) { * @param index the item (zero based index). * @param y the new value ({@code null} permitted). */ - protected void updateByIndex(/*@NonNegative*/ int index, Object y) { + protected void updateByIndex(@NonNegative int index, Object y) { ComparableObjectItem item = getDataItem(index); item.setObject(y); fireSeriesChanged(); @@ -331,7 +331,7 @@ protected void updateByIndex(/*@NonNegative*/ int index, Object y) { * * @return The data item with the specified index. */ - protected ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { + protected ComparableObjectItem getDataItem(@NonNegative int index) { return (ComparableObjectItem) this.data.get(index); } @@ -342,7 +342,7 @@ protected ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { * @param start the start index (zero-based). * @param end the end index (zero-based). */ - protected void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { + protected void delete(@NonNegative int start, @NonNegative int end) { for (int i = start; i <= end; i++) { this.data.remove(start); } @@ -369,7 +369,7 @@ public void clear() { * * @return The item removed. */ - protected ComparableObjectItem remove(/*@NonNegative*/ int index) { + protected ComparableObjectItem remove(@NonNegative int index) { ComparableObjectItem result = (ComparableObjectItem) this.data.remove( index); fireSeriesChanged(); diff --git a/src/main/java/org/jfree/data/DataUtils.java b/src/main/java/org/jfree/data/DataUtils.java index 0e91398fa..8f0c9787d 100644 --- a/src/main/java/org/jfree/data/DataUtils.java +++ b/src/main/java/org/jfree/data/DataUtils.java @@ -47,9 +47,9 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.util.Arrays; import org.jfree.chart.util.Args; @@ -101,7 +101,7 @@ public static boolean equal(double[][] a, double[][] b) { * * @since 1.0.13 */ - public static double /*@SameLen("#1")*/ [][] clone(double[][] source) { + public static double @SameLen("#1") [][] clone(double[][] source) { Args.nullNotPermitted(source, "source"); double[][] clone = new double[source.length][]; for (int i = 0; i < source.length; i++) { @@ -123,7 +123,7 @@ public static boolean equal(double[][] a, double[][] b) { * * @return The total of the values in the specified column. */ - public static double calculateColumnTotal(Values2D data, /*@NonNegative*/ int column) { + public static double calculateColumnTotal(Values2D data, @NonNegative int column) { Args.nullNotPermitted(data, "data"); double total = 0.0; int rowCount = data.getRowCount(); @@ -148,8 +148,8 @@ public static double calculateColumnTotal(Values2D data, /*@NonNegative*/ int co * * @since 1.0.13 */ - public static double calculateColumnTotal(Values2D data, /*@NonNegative*/ int column, - /*@NonNegative*/ int[] validRows) { + public static double calculateColumnTotal(Values2D data, @NonNegative int column, + @NonNegative int[] validRows) { Args.nullNotPermitted(data, "data"); double total = 0.0; int rowCount = data.getRowCount(); @@ -174,7 +174,7 @@ public static double calculateColumnTotal(Values2D data, /*@NonNegative*/ int co * * @return The total of the values in the specified row. */ - public static double calculateRowTotal(Values2D data, /*@NonNegative*/ int row) { + public static double calculateRowTotal(Values2D data, @NonNegative int row) { Args.nullNotPermitted(data, "data"); double total = 0.0; int columnCount = data.getColumnCount(); @@ -199,8 +199,8 @@ public static double calculateRowTotal(Values2D data, /*@NonNegative*/ int row) * * @since 1.0.13 */ - public static double calculateRowTotal(Values2D data, /*@NonNegative*/ int row, - /*@NonNegative*/ int[] validCols) { + public static double calculateRowTotal(Values2D data, @NonNegative int row, + @NonNegative int[] validCols) { Args.nullNotPermitted(data, "data"); double total = 0.0; int colCount = data.getColumnCount(); @@ -242,7 +242,7 @@ public static Number[] createNumberArray(double[] data) { * @return An array of {@code double}. */ @SuppressWarnings("value") // the result array is manifestly the same size as the parameter - public static Number /*@SameLen("#1")*/ /*@PolyValue*/ [][] createNumberArray2D(double /*@PolyValue*/ [][] data) { + public static Number @SameLen("#1") /*@PolyValue*/ [][] createNumberArray2D(double @PolyValue [][] data) { Args.nullNotPermitted(data, "data"); int l1 = data.length; Number[][] result = new Number[data.length][]; diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues.java b/src/main/java/org/jfree/data/DefaultKeyedValues.java index ac35f8156..59508fbfb 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues.java @@ -59,8 +59,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.ArrayList; @@ -109,7 +109,7 @@ public DefaultKeyedValues() { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.indexMap.size(); } @@ -123,7 +123,7 @@ public DefaultKeyedValues() { * @throws IndexOutOfBoundsException if {@code item} is out of bounds. */ @Override - public Number getValue(/*@NonNegative*/ int item) { + public Number getValue(@NonNegative int item) { return (Number) this.values.get(item); } @@ -137,7 +137,7 @@ public Number getValue(/*@NonNegative*/ int item) { * @throws IndexOutOfBoundsException if {@code item} is out of bounds. */ @Override - public Comparable getKey(/*@NonNegative*/ int index) { + public Comparable getKey(@NonNegative int index) { return (Comparable) this.keys.get(index); } @@ -152,14 +152,14 @@ public Comparable getKey(/*@NonNegative*/ int index) { * {@code null}. */ @Override - public /*@GTENegativeOne*/ int getIndex(Comparable key) { + public @GTENegativeOne int getIndex(Comparable key) { Args.nullNotPermitted(key, "key"); final Integer i = (Integer) this.indexMap.get(key); if (i == null) { return -1; // key not found } @SuppressWarnings("index") // the map only contains indices, so if the value is in the map, then result is non-negative - /*@NonNegative*/ int result = i.intValue(); + @NonNegative int result = i.intValue(); return result; } @@ -258,7 +258,7 @@ public void setValue(Comparable key, Number value) { * * @since 1.0.6 */ - public void insertValue(/*@NonNegative*/ int position, Comparable key, double value) { + public void insertValue(@NonNegative int position, Comparable key, double value) { insertValue(position, key, new Double(value)); } @@ -273,7 +273,7 @@ public void insertValue(/*@NonNegative*/ int position, Comparable key, double va * * @since 1.0.6 */ - public void insertValue(/*@NonNegative*/ int position, Comparable key, Number value) { + public void insertValue(@NonNegative int position, Comparable key, Number value) { if (position < 0 || position > getItemCount()) { throw new IllegalArgumentException("'position' out of bounds."); } @@ -316,7 +316,7 @@ private void rebuildIndex () { * @throws IndexOutOfBoundsException if {@code index} is not within * the specified range. */ - public void removeValue(/*@NonNegative*/ int index) { + public void removeValue(@NonNegative int index) { this.keys.remove(index); this.values.remove(index); rebuildIndex(); diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java index 1031e5acc..1f877ad40 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java @@ -57,9 +57,9 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Collections; @@ -119,7 +119,7 @@ public DefaultKeyedValues2D(boolean sortRowKeys) { * @see #getColumnCount() */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.rowKeys.size(); } @@ -131,8 +131,8 @@ public DefaultKeyedValues2D(boolean sortRowKeys) { * @see #getRowCount() */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { return this.columnKeys.size(); } @@ -147,8 +147,8 @@ public DefaultKeyedValues2D(boolean sortRowKeys) { * @see #getValue(Comparable, Comparable) */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { Number result = null; DefaultKeyedValues rowData = (DefaultKeyedValues) this.rows.get(row); if (rowData != null) { @@ -174,7 +174,7 @@ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { * @see #getColumnKey(int) */ @Override - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return (Comparable) this.rowKeys.get(row); } @@ -190,7 +190,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { */ @Override @SuppressWarnings("index") // I think this is a bug. Binary search can return a search index, inconsistent with docs on this method - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { Args.nullNotPermitted(key, "key"); if (this.sortRowKeys) { return Collections.binarySearch(this.rowKeys, key); @@ -224,7 +224,7 @@ public List getRowKeys() { * @see #getRowKey(int) */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return (Comparable) this.columnKeys.get(column); } @@ -239,7 +239,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getRowIndex(Comparable) */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { Args.nullNotPermitted(key, "key"); return this.columnKeys.indexOf(key); } @@ -367,7 +367,7 @@ public void removeValue(Comparable rowKey, Comparable columnKey) { // 1. check whether the row is now empty. boolean allNull = true; @SuppressWarnings("index") // array-list interop: this method assumes that the rowKey is valid, which can't be checked b/c it's a list - /*@NonNegative*/ int rowIndex = getRowIndex(rowKey); + @NonNegative int rowIndex = getRowIndex(rowKey); DefaultKeyedValues row = (DefaultKeyedValues) this.rows.get(rowIndex); for (int item = 0, itemCount = row.getItemCount(); item < itemCount; @@ -418,7 +418,7 @@ public void removeValue(Comparable rowKey, Comparable columnKey) { * @see #removeRow(Comparable) * @see #removeColumn(int) */ - public void removeRow(/*@NonNegative*/ int rowIndex) { + public void removeRow(@NonNegative int rowIndex) { this.rowKeys.remove(rowIndex); this.rows.remove(rowIndex); } @@ -453,7 +453,7 @@ public void removeRow(Comparable rowKey) { * @see #removeColumn(Comparable) * @see #removeRow(int) */ - public void removeColumn(/*@NonNegative*/ int columnIndex) { + public void removeColumn(@NonNegative int columnIndex) { Comparable columnKey = getColumnKey(columnIndex); removeColumn(columnKey); } diff --git a/src/main/java/org/jfree/data/KeyToGroupMap.java b/src/main/java/org/jfree/data/KeyToGroupMap.java index a98644c85..a6583681f 100644 --- a/src/main/java/org/jfree/data/KeyToGroupMap.java +++ b/src/main/java/org/jfree/data/KeyToGroupMap.java @@ -44,8 +44,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; import java.lang.reflect.Method; @@ -101,8 +101,8 @@ public KeyToGroupMap(Comparable defaultGroup) { * * @return The number of groups in the map. */ - /*@Pure*/ - public /*@Positive*/ int getGroupCount() { + @Pure + public @Positive int getGroupCount() { return this.groups.size() + 1; } @@ -134,7 +134,7 @@ public List getGroups() { * @return The group index (or -1 if the group is not represented within * the map). */ - public /*@GTENegativeOne*/ int getGroupIndex(Comparable group) { + public @GTENegativeOne int getGroupIndex(Comparable group) { int result = this.groups.indexOf(group); if (result < 0) { if (this.defaultGroup.equals(group)) { @@ -205,7 +205,7 @@ public void mapKeyToGroup(Comparable key, Comparable group) { * * @return The key count. */ - public /*@NonNegative*/ int getKeyCount(Comparable group) { + public @NonNegative int getKeyCount(Comparable group) { Args.nullNotPermitted(group, "group"); int result = 0; Iterator iterator = this.keyToGroupMap.values().iterator(); diff --git a/src/main/java/org/jfree/data/KeyedObjects.java b/src/main/java/org/jfree/data/KeyedObjects.java index 1f9e042a5..33d9bf4d8 100644 --- a/src/main/java/org/jfree/data/KeyedObjects.java +++ b/src/main/java/org/jfree/data/KeyedObjects.java @@ -43,8 +43,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Iterator; @@ -75,7 +75,7 @@ public KeyedObjects() { * * @return The item count. */ - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.data.size(); } @@ -88,7 +88,7 @@ public KeyedObjects() { * * @throws IndexOutOfBoundsException if {@code item} is out of bounds. */ - public Object getObject(/*@NonNegative*/ int item) { + public Object getObject(@NonNegative int item) { Object result = null; KeyedObject kobj = (KeyedObject) this.data.get(item); if (kobj != null) { @@ -108,7 +108,7 @@ public Object getObject(/*@NonNegative*/ int item) { * * @see #getIndex(Comparable) */ - public Comparable getKey(/*@NonNegative*/ int index) { + public Comparable getKey(@NonNegative int index) { Comparable result = null; KeyedObject item = (KeyedObject) this.data.get(index); if (item != null) { @@ -126,7 +126,7 @@ public Comparable getKey(/*@NonNegative*/ int index) { * * @see #getKey(int) */ - public /*@GTENegativeOne*/ int getIndex(Comparable key) { + public @GTENegativeOne int getIndex(Comparable key) { Args.nullNotPermitted(key, "key"); int i = 0; Iterator iterator = this.data.iterator(); @@ -246,7 +246,7 @@ public void insertValue(int position, Comparable key, Object value) { * * @see #removeValue(Comparable) */ - public void removeValue(/*@NonNegative*/ int index) { + public void removeValue(@NonNegative int index) { this.data.remove(index); } diff --git a/src/main/java/org/jfree/data/KeyedObjects2D.java b/src/main/java/org/jfree/data/KeyedObjects2D.java index 49e5ec9f2..6062cd994 100644 --- a/src/main/java/org/jfree/data/KeyedObjects2D.java +++ b/src/main/java/org/jfree/data/KeyedObjects2D.java @@ -44,8 +44,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Collections; @@ -87,7 +87,7 @@ public KeyedObjects2D() { * * @see #getColumnCount() */ - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.rowKeys.size(); } @@ -98,7 +98,7 @@ public KeyedObjects2D() { * * @see #getRowCount() */ - public /*@NonNegative*/ int getColumnCount() { + public @NonNegative int getColumnCount() { return this.columnKeys.size(); } @@ -112,7 +112,7 @@ public KeyedObjects2D() { * * @see #getObject(Comparable, Comparable) */ - public Object getObject(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Object getObject(@NonNegative int row, @NonNegative int column) { Object result = null; KeyedObjects rowData = (KeyedObjects) this.rows.get(row); if (rowData != null) { @@ -136,7 +136,7 @@ public Object getObject(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { * * @see #getRowIndex(Comparable) */ - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return (Comparable) this.rowKeys.get(row); } @@ -150,7 +150,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * * @see #getRowKey(int) */ - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { Args.nullNotPermitted(key, "key"); return this.rowKeys.indexOf(key); } @@ -175,7 +175,7 @@ public List getRowKeys() { * * @see #getColumnIndex(Comparable) */ - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return (Comparable) this.columnKeys.get(column); } @@ -189,7 +189,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * * @see #getColumnKey(int) */ - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { Args.nullNotPermitted(key, "key"); return this.columnKeys.indexOf(key); } @@ -354,7 +354,7 @@ public void removeObject(Comparable rowKey, Comparable columnKey) { * * @see #removeColumn(int) */ - public void removeRow(/*@NonNegative*/ int rowIndex) { + public void removeRow(@NonNegative int rowIndex) { this.rowKeys.remove(rowIndex); this.rows.remove(rowIndex); } @@ -384,7 +384,7 @@ public void removeRow(Comparable rowKey) { * * @see #removeRow(int) */ - public void removeColumn(/*@NonNegative*/ int columnIndex) { + public void removeColumn(@NonNegative int columnIndex) { Comparable columnKey = getColumnKey(columnIndex); removeColumn(columnKey); } diff --git a/src/main/java/org/jfree/data/KeyedValues.java b/src/main/java/org/jfree/data/KeyedValues.java index 89a36bc48..aa965e731 100644 --- a/src/main/java/org/jfree/data/KeyedValues.java +++ b/src/main/java/org/jfree/data/KeyedValues.java @@ -43,8 +43,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.util.List; @@ -70,7 +70,7 @@ public interface KeyedValues extends Values { * @throws IndexOutOfBoundsException if {@code index} is not in the * specified range. */ - public Comparable getKey(/*@NonNegative*/ int index); + public Comparable getKey(@NonNegative int index); /** * Returns the index for a given key. @@ -81,7 +81,7 @@ public interface KeyedValues extends Values { * * @throws IllegalArgumentException if {@code key} is {@code null}. */ - public /*@GTENegativeOne*/ int getIndex(Comparable key); + public @GTENegativeOne int getIndex(Comparable key); /** * Returns the keys for the values in the collection. Note that you can diff --git a/src/main/java/org/jfree/data/KeyedValues2D.java b/src/main/java/org/jfree/data/KeyedValues2D.java index d646208cf..63aa43b5f 100644 --- a/src/main/java/org/jfree/data/KeyedValues2D.java +++ b/src/main/java/org/jfree/data/KeyedValues2D.java @@ -40,8 +40,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.util.List; @@ -60,7 +60,7 @@ public interface KeyedValues2D extends Values2D { * * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ - public Comparable getRowKey(/*@NonNegative*/ int row); + public Comparable getRowKey(@NonNegative int row); /** * Returns the row index for a given key. @@ -69,7 +69,7 @@ public interface KeyedValues2D extends Values2D { * * @return The row index, or {@code -1} if the key is unrecognised. */ - public /*@GTENegativeOne*/ int getRowIndex(Comparable key); + public @GTENegativeOne int getRowIndex(Comparable key); /** * Returns the row keys. @@ -87,7 +87,7 @@ public interface KeyedValues2D extends Values2D { * * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ - public Comparable getColumnKey(/*@NonNegative*/ int column); + public Comparable getColumnKey(@NonNegative int column); /** * Returns the column index for a given key. @@ -96,7 +96,7 @@ public interface KeyedValues2D extends Values2D { * * @return The column index, or {@code -1} if the key is unrecognised. */ - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key); + public @GTENegativeOne int getColumnIndex(Comparable key); /** * Returns the column keys. diff --git a/src/main/java/org/jfree/data/Values.java b/src/main/java/org/jfree/data/Values.java index ea1b74ee5..095c4121e 100644 --- a/src/main/java/org/jfree/data/Values.java +++ b/src/main/java/org/jfree/data/Values.java @@ -42,7 +42,7 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; /** * An interface through which (single-dimension) data values can be accessed. @@ -54,7 +54,7 @@ public interface Values { * * @return The item count (possibly zero). */ - public /*@NonNegative*/ int getItemCount(); + public @NonNegative int getItemCount(); /** * Returns the value with the specified index. @@ -67,6 +67,6 @@ public interface Values { * @throws IndexOutOfBoundsException if {@code index} is not in the * specified range. */ - public Number getValue(/*@NonNegative*/ int index); + public Number getValue(@NonNegative int index); } diff --git a/src/main/java/org/jfree/data/Values2D.java b/src/main/java/org/jfree/data/Values2D.java index 817dc4b4c..80fbf724b 100644 --- a/src/main/java/org/jfree/data/Values2D.java +++ b/src/main/java/org/jfree/data/Values2D.java @@ -39,8 +39,8 @@ */ package org.jfree.data; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.NonNegative; /** * A general purpose interface that can be used to access a table of values. @@ -52,15 +52,15 @@ public interface Values2D { * * @return The row count. */ - public /*@NonNegative*/ int getRowCount(); + public @NonNegative int getRowCount(); /** * Returns the number of columns in the table. * * @return The column count. */ - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount(); + @Pure + public @NonNegative int getColumnCount(); /** * Returns a value from the table. @@ -73,7 +73,7 @@ public interface Values2D { * @throws IndexOutOfBoundsException if the {@code row} * or {@code column} is out of bounds. */ - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column); } diff --git a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java index 65d8fabb7..4d3e96341 100644 --- a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java +++ b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java @@ -48,8 +48,8 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.util.Collections; import java.util.List; @@ -78,7 +78,7 @@ public class CategoryToPieDataset extends AbstractDataset private TableOrder extract; /** The row or column index. */ - private /*@NonNegative*/ int index; + private @NonNegative int index; /** * An adaptor class that converts any {@link CategoryDataset} into a @@ -93,7 +93,7 @@ public class CategoryToPieDataset extends AbstractDataset * @param index the row or column index. */ public CategoryToPieDataset(CategoryDataset source, TableOrder extract, - /*@NonNegative*/ int index) { + @NonNegative int index) { Args.nullNotPermitted(extract, "extract"); this.source = source; if (this.source != null) { @@ -133,7 +133,7 @@ public TableOrder getExtractType() { * * @since 1.0.2 */ - public /*@NonNegative*/ int getExtractIndex() { + public @NonNegative int getExtractIndex() { return this.index; } @@ -144,7 +144,7 @@ public TableOrder getExtractType() { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { int result = 0; if (this.source != null) { if (this.extract == TableOrder.BY_ROW) { @@ -168,7 +168,7 @@ else if (this.extract == TableOrder.BY_COLUMN) { * range {@code 0} to {@code getItemCount() -1}. */ @Override - public Number getValue(/*@NonNegative*/ int item) { + public Number getValue(@NonNegative int item) { Number result = null; if (item < 0 || item >= getItemCount()) { // this will include the case where the underlying dataset is null @@ -196,7 +196,7 @@ else if (this.extract == TableOrder.BY_COLUMN) { * specified range. */ @Override - public Comparable getKey(/*@NonNegative*/ int index) { + public Comparable getKey(@NonNegative int index) { Comparable result = null; if (index < 0 || index >= getItemCount()) { // this includes the case where the underlying dataset is null @@ -220,7 +220,7 @@ else if (this.extract == TableOrder.BY_COLUMN) { * @return The index for the key, or {@code -1}. */ @Override - public /*@GTENegativeOne*/ int getIndex(Comparable key) { + public @GTENegativeOne int getIndex(Comparable key) { int result = -1; if (this.source != null) { if (this.extract == TableOrder.BY_ROW) { diff --git a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java index 773de7641..21cad0b39 100644 --- a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java @@ -47,9 +47,9 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.List; @@ -87,7 +87,7 @@ public DefaultCategoryDataset() { * @see #getColumnCount() */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.data.getRowCount(); } @@ -99,8 +99,8 @@ public DefaultCategoryDataset() { * @see #getRowCount() */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { return this.data.getColumnCount(); } @@ -116,8 +116,8 @@ public DefaultCategoryDataset() { * @see #removeValue(Comparable, Comparable) */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { return this.data.getValue(row, column); } @@ -133,7 +133,7 @@ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { * @see #getColumnKey(int) */ @Override - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return this.data.getRowKey(row); } @@ -147,7 +147,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getRowKey(int) */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -174,7 +174,7 @@ public List getRowKeys() { * @see #getColumnIndex(Comparable) */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return this.data.getColumnKey(column); } @@ -188,7 +188,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getColumnKey(int) */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { // defer null argument check return this.data.getColumnIndex(key); } @@ -326,7 +326,7 @@ public void removeValue(Comparable rowKey, Comparable columnKey) { * * @see #removeColumn(int) */ - public void removeRow(/*@NonNegative*/ int rowIndex) { + public void removeRow(@NonNegative int rowIndex) { this.data.removeRow(rowIndex); fireDatasetChanged(); } @@ -352,7 +352,7 @@ public void removeRow(Comparable rowKey) { * * @see #removeRow(int) */ - public void removeColumn(/*@NonNegative*/ int columnIndex) { + public void removeColumn(@NonNegative int columnIndex) { this.data.removeColumn(columnIndex); fireDatasetChanged(); } diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index df5b7a412..ffe957acc 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -47,9 +47,9 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.util.ArrayList; import java.util.Arrays; @@ -96,7 +96,7 @@ public class DefaultIntervalCategoryDataset extends AbstractSeriesDataset * permitted). */ @SuppressWarnings("index") // results of DataUtils.createNumberArray should have the same length as their inputs, but SameLens don't propagate correctly :( - public DefaultIntervalCategoryDataset(double /*@SameLen({"#1", "#2"})*/ [][] starts, double /*@SameLen({"#1", "#2"})*/ [][] ends) { + public DefaultIntervalCategoryDataset(double @SameLen({"#1", "#2"}) [][] starts, double @SameLen({"#1", "#2"}) [][] ends) { this(DataUtils.createNumberArray2D(starts), DataUtils.createNumberArray2D(ends)); } @@ -112,7 +112,7 @@ public DefaultIntervalCategoryDataset(double /*@SameLen({"#1", "#2"})*/ [][] sta * @param starts the start values data. * @param ends the end values data. */ - public DefaultIntervalCategoryDataset(Number /*@SameLen({"#1", "#2"})*/ [][] starts, Number /*@SameLen({"#1", "#2"})*/ [][] ends) { + public DefaultIntervalCategoryDataset(Number @SameLen({"#1", "#2"}) [][] starts, Number @SameLen({"#1", "#2"}) [][] ends) { this(null, null, starts, ends); } @@ -129,8 +129,8 @@ public DefaultIntervalCategoryDataset(Number /*@SameLen({"#1", "#2"})*/ [][] sta * @param ends the end values data, indexed as data[series][category]. */ public DefaultIntervalCategoryDataset(String[] seriesNames, - Number /*@SameLen({"#2", "#3"})*/ [][] starts, - Number /*@SameLen({"#2", "#3"})*/ [][] ends) { + Number @SameLen({"#2", "#3"}) [][] starts, + Number @SameLen({"#2", "#3"}) [][] ends) { this(seriesNames, null, starts, ends); @@ -150,8 +150,8 @@ public DefaultIntervalCategoryDataset(String[] seriesNames, */ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, Comparable[] categoryKeys, - Number /*@SameLen("#4")*/ [][] starts, - Number /*@SameLen("#3")*/ [][] ends) { + Number @SameLen("#4") [][] starts, + Number @SameLen("#3") [][] ends) { this.startData = starts; this.endData = ends; @@ -173,11 +173,11 @@ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, if (seriesCount > 0) { @SuppressWarnings({"index", "value"}) // seriesCount is the length of starts, so checking it against zero implies minlen(1) - Number /*@MinLen(1)*/ [][] starts1 = starts; + Number @MinLen(1) [][] starts1 = starts; starts = starts1; @SuppressWarnings({"index", "value"}) // seriesCount is the length of starts, so checking it against zero implies minlen(1) - Number /*@MinLen(1)*/ [][] ends1 = ends; + Number @MinLen(1) [][] ends1 = ends; ends = ends1; // set up the series names... @@ -238,7 +238,7 @@ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, * @see #getCategoryCount() */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { int result = 0; if (this.startData != null) { result = this.startData.length; @@ -256,7 +256,7 @@ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, * @see #getRowIndex(Comparable) * @see #getSeriesKey(int) */ - public /*@GTENegativeOne*/ int getSeriesIndex(Comparable seriesKey) { + public @GTENegativeOne int getSeriesIndex(Comparable seriesKey) { int result = -1; for (int i = 0; i < this.seriesKeys.length; i++) { if (seriesKey.equals(this.seriesKeys[i])) { @@ -277,7 +277,7 @@ public DefaultIntervalCategoryDataset(Comparable[] seriesKeys, * @see #getSeriesIndex(Comparable) */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { if ((series >= getSeriesCount()) || (series < 0)) { throw new IllegalArgumentException("No such series : " + series); } @@ -312,7 +312,7 @@ public void setSeriesKeys(Comparable[] seriesKeys) { * * @see #getColumnCount() */ - public /*@NonNegative*/ int getCategoryCount() { + public @NonNegative int getCategoryCount() { int result = 0; if (this.startData != null) { if (getSeriesCount() > 0) { @@ -411,8 +411,8 @@ public Number getValue(Comparable series, Comparable category) { * @see #getEndValue(int, int) */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { + @Pure + public Number getValue(@NonNegative int series, @NonNegative int category) { return getEndValue(series, category); } @@ -452,7 +452,7 @@ public Number getStartValue(Comparable series, Comparable category) { * @see #getStartValue(Comparable, Comparable) */ @Override - public Number getStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { + public Number getStartValue(@NonNegative int series, @NonNegative int category) { // check arguments... if ((series < 0) || (series >= getSeriesCount())) { @@ -507,7 +507,7 @@ public Number getEndValue(Comparable series, Comparable category) { * @see #getEndValue(Comparable, Comparable) */ @Override - public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { + public Number getEndValue(@NonNegative int series, @NonNegative int category) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException( "DefaultIntervalCategoryDataset.getValue(): " @@ -534,7 +534,7 @@ public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int cate * * @see #setEndValue(int, Comparable, Number) */ - public void setStartValue(/*@NonNegative*/ int series, Comparable category, Number value) { + public void setStartValue(@NonNegative int series, Comparable category, Number value) { // does the series exist? if ((series < 0) || (series > getSeriesCount() - 1)) { @@ -568,7 +568,7 @@ public void setStartValue(/*@NonNegative*/ int series, Comparable category, Numb * * @see #setStartValue(int, Comparable, Number) */ - public void setEndValue(/*@NonNegative*/ int series, Comparable category, Number value) { + public void setEndValue(@NonNegative int series, Comparable category, Number value) { // does the series exist? if ((series < 0) || (series > getSeriesCount() - 1)) { @@ -601,7 +601,7 @@ public void setEndValue(/*@NonNegative*/ int series, Comparable category, Number * * @see #getColumnIndex(Comparable) */ - public /*@GTENegativeOne*/ int getCategoryIndex(Comparable category) { + public @GTENegativeOne int getCategoryIndex(Comparable category) { int result = -1; for (int i = 0; i < this.categoryKeys.length; i++) { if (category.equals(this.categoryKeys[i])) { @@ -621,7 +621,7 @@ public void setEndValue(/*@NonNegative*/ int series, Comparable category, Number * * @return An array of <i>prefixN</i> with N = { 1 .. count}. */ - private Comparable[] generateKeys(/*@NonNegative*/ int count, String prefix) { + private Comparable[] generateKeys(@NonNegative int count, String prefix) { Comparable[] result = new Comparable[count]; String name; for (int i = 0; i < count; i++) { @@ -642,7 +642,7 @@ private Comparable[] generateKeys(/*@NonNegative*/ int count, String prefix) { */ @Override @SuppressWarnings("index") // array-list interop: because this underlying array isn't exposed by the interface this method is inherited from, there is no way to write an upperbound annotation on column - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return this.categoryKeys[column]; } @@ -656,7 +656,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getCategoryIndex(Comparable) */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable columnKey) { + public @GTENegativeOne int getColumnIndex(Comparable columnKey) { Args.nullNotPermitted(columnKey, "columnKey"); return getCategoryIndex(columnKey); } @@ -671,7 +671,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getSeriesIndex(Comparable) */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable rowKey) { + public @GTENegativeOne int getRowIndex(Comparable rowKey) { return getSeriesIndex(rowKey); } @@ -706,7 +706,7 @@ public List getRowKeys() { */ @Override @SuppressWarnings("index") // array-list interop: because this underlying array isn't exposed by the interface this method is inherited from, there is no way to write an upperbound annotation on column - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { if ((row >= getRowCount()) || (row < 0)) { throw new IllegalArgumentException( "The 'row' argument is out of bounds."); @@ -724,8 +724,8 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getRowCount() */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { return this.categoryKeys.length; } @@ -738,7 +738,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getColumnCount() */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.seriesKeys.length; } diff --git a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java index 46fd81026..951680b44 100644 --- a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java @@ -46,9 +46,9 @@ package org.jfree.data.category; -/*>>> + import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * A category dataset that defines a value range for each series/category @@ -66,7 +66,7 @@ public interface IntervalCategoryDataset extends CategoryDataset { * * @see #getEndValue(int, int) */ - public Number getStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category); + public Number getStartValue(@NonNegative int series, @NonNegative int category); /** * Returns the start value for the interval for a given series and category. @@ -90,7 +90,7 @@ public interface IntervalCategoryDataset extends CategoryDataset { * * @see #getStartValue(int, int) */ - public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category); + public Number getEndValue(@NonNegative int series, @NonNegative int category); /** * Returns the end value for the interval for a given series and category. diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index a5d109c33..d189361a1 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -40,9 +40,9 @@ */ package org.jfree.data.category; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.util.Collections; import java.util.List; @@ -67,10 +67,10 @@ public class SlidingCategoryDataset extends AbstractDataset private CategoryDataset underlying; /** The index of the first category to present. */ - private /*@NonNegative*/ int firstCategoryIndex; + private @NonNegative int firstCategoryIndex; /** The maximum number of categories to present. */ - private /*@NonNegative*/ int maximumCategoryCount; + private @NonNegative int maximumCategoryCount; /** * Creates a new instance. @@ -81,8 +81,8 @@ public class SlidingCategoryDataset extends AbstractDataset * underlying dataset. * @param maxColumns the maximumColumnCount. */ - public SlidingCategoryDataset(CategoryDataset underlying, /*@NonNegative*/ int firstColumn, - /*@NonNegative*/ int maxColumns) { + public SlidingCategoryDataset(CategoryDataset underlying, @NonNegative int firstColumn, + @NonNegative int maxColumns) { this.underlying = underlying; this.firstCategoryIndex = firstColumn; this.maximumCategoryCount = maxColumns; @@ -104,7 +104,7 @@ public CategoryDataset getUnderlyingDataset() { * * @see #setFirstCategoryIndex(int) */ - public /*@NonNegative*/ int getFirstCategoryIndex() { + public @NonNegative int getFirstCategoryIndex() { return this.firstCategoryIndex; } @@ -117,7 +117,7 @@ public CategoryDataset getUnderlyingDataset() { * * @see #getFirstCategoryIndex() */ - public void setFirstCategoryIndex(/*@NonNegative*/ int first) { + public void setFirstCategoryIndex(@NonNegative int first) { if (first < 0 || first >= this.underlying.getColumnCount()) { throw new IllegalArgumentException("Invalid index."); } @@ -132,7 +132,7 @@ public void setFirstCategoryIndex(/*@NonNegative*/ int first) { * * @see #setMaximumCategoryCount(int) */ - public /*@NonNegative*/ int getMaximumCategoryCount() { + public @NonNegative int getMaximumCategoryCount() { return this.maximumCategoryCount; } @@ -144,7 +144,7 @@ public void setFirstCategoryIndex(/*@NonNegative*/ int first) { * * @see #getMaximumCategoryCount() */ - public void setMaximumCategoryCount(/*@NonNegative*/ int max) { + public void setMaximumCategoryCount(@NonNegative int max) { if (max < 0) { throw new IllegalArgumentException("Requires 'max' >= 0."); } @@ -157,8 +157,8 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { * * @return The index. */ - /*@Pure*/ - private /*@GTENegativeOne*/ int lastCategoryIndex() { + @Pure + private @GTENegativeOne int lastCategoryIndex() { if (this.maximumCategoryCount == 0) { return -1; } @@ -174,7 +174,7 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { * @return The column index, or -1 if the key is not recognised. */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { return index - this.firstCategoryIndex; @@ -192,7 +192,7 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return this.underlying.getColumnKey(column + this.firstCategoryIndex); } @@ -221,7 +221,7 @@ public List getColumnKeys() { * @return The row index, or {@code -1} if the key is unrecognised. */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { return this.underlying.getRowIndex(key); } @@ -235,7 +235,7 @@ public List getColumnKeys() { * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ @Override - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return this.underlying.getRowKey(row); } @@ -280,8 +280,8 @@ else if (r == -1) { * @return The column count. */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { int last = lastCategoryIndex(); if (last == -1) { return 0; @@ -297,7 +297,7 @@ else if (r == -1) { * @return The row count. */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.underlying.getRowCount(); } @@ -310,8 +310,8 @@ else if (r == -1) { * @return The value (possibly {@code null}). */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { return this.underlying.getValue(row, column + this.firstCategoryIndex); } diff --git a/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java index 8e2fea443..c2f089647 100644 --- a/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java @@ -41,7 +41,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.IntervalCategoryDataset; @@ -61,7 +61,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getPercentComplete(Comparable, Comparable) */ - public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getPercentComplete(@NonNegative int row, @NonNegative int column); /** * Returns the percent complete for a given item. @@ -85,7 +85,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getSubIntervalCount(Comparable, Comparable) */ - public /*@NonNegative*/ int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public @NonNegative int getSubIntervalCount(@NonNegative int row, @NonNegative int column); /** * Returns the number of sub-intervals for a given item. @@ -97,7 +97,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getSubIntervalCount(int, int) */ - public /*@NonNegative*/ int getSubIntervalCount(Comparable rowKey, Comparable columnKey); + public @NonNegative int getSubIntervalCount(Comparable rowKey, Comparable columnKey); /** * Returns the start value of a sub-interval for a given item. @@ -110,7 +110,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * * @see #getEndValue(int, int, int) */ - public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval); + public Number getStartValue(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval); /** * Returns the start value of a sub-interval for a given item. @@ -124,7 +124,7 @@ public interface GanttCategoryDataset extends IntervalCategoryDataset { * @see #getEndValue(Comparable, Comparable, int) */ public Number getStartValue(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval); + @NonNegative int subinterval); /** * Returns the end value of a sub-interval for a given item. @@ -137,7 +137,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * * @see #getStartValue(int, int, int) */ - public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval); + public Number getEndValue(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval); /** * Returns the end value of a sub-interval for a given item. @@ -151,7 +151,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * @see #getStartValue(Comparable, Comparable, int) */ public Number getEndValue(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval); + @NonNegative int subinterval); /** * Returns the percentage complete value of a sub-interval for a given item. @@ -164,7 +164,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * * @see #getPercentComplete(Comparable, Comparable, int) */ - public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval); + public Number getPercentComplete(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval); /** * Returns the percentage complete value of a sub-interval for a given item. @@ -178,6 +178,6 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * @see #getPercentComplete(int, int, int) */ public Number getPercentComplete(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval); + @NonNegative int subinterval); } diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index 0d837cd47..8a72f87f8 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -39,12 +39,12 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.Collections; import java.util.List; @@ -69,10 +69,10 @@ public class SlidingGanttCategoryDataset extends AbstractDataset private GanttCategoryDataset underlying; /** The index of the first category to present. */ - private /*@NonNegative*/ int firstCategoryIndex; + private @NonNegative int firstCategoryIndex; /** The maximum number of categories to present. */ - private /*@NonNegative*/ int maximumCategoryCount; + private @NonNegative int maximumCategoryCount; /** * Creates a new instance. @@ -84,7 +84,7 @@ public class SlidingGanttCategoryDataset extends AbstractDataset * @param maxColumns the maximumColumnCount. */ public SlidingGanttCategoryDataset(GanttCategoryDataset underlying, - /*@NonNegative*/ int firstColumn, /*@NonNegative*/ int maxColumns) { + @NonNegative int firstColumn, @NonNegative int maxColumns) { this.underlying = underlying; this.firstCategoryIndex = firstColumn; this.maximumCategoryCount = maxColumns; @@ -106,7 +106,7 @@ public GanttCategoryDataset getUnderlyingDataset() { * * @see #setFirstCategoryIndex(int) */ - public /*@NonNegative*/ int getFirstCategoryIndex() { + public @NonNegative int getFirstCategoryIndex() { return this.firstCategoryIndex; } @@ -119,7 +119,7 @@ public GanttCategoryDataset getUnderlyingDataset() { * * @see #getFirstCategoryIndex() */ - public void setFirstCategoryIndex(/*@NonNegative*/ int first) { + public void setFirstCategoryIndex(@NonNegative int first) { if (first < 0 || first >= this.underlying.getColumnCount()) { throw new IllegalArgumentException("Invalid index."); } @@ -134,7 +134,7 @@ public void setFirstCategoryIndex(/*@NonNegative*/ int first) { * * @see #setMaximumCategoryCount(int) */ - public /*@NonNegative*/ int getMaximumCategoryCount() { + public @NonNegative int getMaximumCategoryCount() { return this.maximumCategoryCount; } @@ -146,7 +146,7 @@ public void setFirstCategoryIndex(/*@NonNegative*/ int first) { * * @see #getMaximumCategoryCount() */ - public void setMaximumCategoryCount(/*@NonNegative*/ int max) { + public void setMaximumCategoryCount(@NonNegative int max) { if (max < 0) { throw new IllegalArgumentException("Requires 'max' >= 0."); } @@ -159,7 +159,7 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { * * @return The index. */ - private /*@GTENegativeOne*/ int lastCategoryIndex() { + private @GTENegativeOne int lastCategoryIndex() { if (this.maximumCategoryCount == 0) { return -1; } @@ -175,11 +175,11 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { * @return The column index, or -1 if the key is not recognised. */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 - /*@NonNegative*/ int result = index - this.firstCategoryIndex; + @NonNegative int result = index - this.firstCategoryIndex; return result; } return -1; // we didn't find the key @@ -195,7 +195,7 @@ public void setMaximumCategoryCount(/*@NonNegative*/ int max) { * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return this.underlying.getColumnKey(column + this.firstCategoryIndex); } @@ -224,7 +224,7 @@ public List getColumnKeys() { * @return The row index, or {@code -1} if the key is unrecognised. */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { return this.underlying.getRowIndex(key); } @@ -238,7 +238,7 @@ public List getColumnKeys() { * @throws IndexOutOfBoundsException if {@code row} is out of bounds. */ @Override - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return this.underlying.getRowKey(row); } @@ -283,8 +283,8 @@ else if (r == -1) { * @return The column count. */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { int last = lastCategoryIndex(); if (last == -1) { return 0; @@ -300,7 +300,7 @@ else if (r == -1) { * @return The row count. */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.underlying.getRowCount(); } @@ -313,8 +313,8 @@ else if (r == -1) { * @return The value (possibly {@code null}). */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { return this.underlying.getValue(row, column + this.firstCategoryIndex); } @@ -355,7 +355,7 @@ else if (r == -1) { */ @Override public Number getPercentComplete(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval) { + @NonNegative int subinterval) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c == -1) { @@ -383,7 +383,7 @@ else if (r == -1) { */ @Override public Number getEndValue(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval) { + @NonNegative int subinterval) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c == -1) { @@ -410,7 +410,7 @@ else if (r == -1) { * @see #getStartValue(int, int, int) */ @Override - public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { + public Number getEndValue(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval) { return this.underlying.getEndValue(row, column + this.firstCategoryIndex, subinterval); } @@ -424,7 +424,7 @@ public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, * @return The percent complete. */ @Override - public Number getPercentComplete(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { + public Number getPercentComplete(@NonNegative int series, @NonNegative int category) { return this.underlying.getPercentComplete(series, category + this.firstCategoryIndex); } @@ -441,7 +441,7 @@ public Number getPercentComplete(/*@NonNegative*/ int series, /*@NonNegative*/ i * @see #getPercentComplete(Comparable, Comparable, int) */ @Override - public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { + public Number getPercentComplete(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval) { return this.underlying.getPercentComplete(row, column + this.firstCategoryIndex, subinterval); } @@ -459,7 +459,7 @@ public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int */ @Override public Number getStartValue(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval) { + @NonNegative int subinterval) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c == -1) { @@ -486,7 +486,7 @@ else if (r == -1) { * @see #getEndValue(int, int, int) */ @Override - public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { + public Number getStartValue(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval) { return this.underlying.getStartValue(row, column + this.firstCategoryIndex, subinterval); } @@ -502,7 +502,7 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum * @see #getSubIntervalCount(int, int) */ @Override - public /*@NonNegative*/ int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { + public @NonNegative int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { int r = getRowIndex(rowKey); int c = getColumnIndex(columnKey); if (c == -1) { @@ -527,7 +527,7 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum * @see #getSubIntervalCount(Comparable, Comparable) */ @Override - public /*@NonNegative*/ int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public @NonNegative int getSubIntervalCount(@NonNegative int row, @NonNegative int column) { return this.underlying.getSubIntervalCount(row, column + this.firstCategoryIndex); } @@ -568,7 +568,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey) { * @see #getEndValue(int, int) */ @Override - public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getStartValue(@NonNegative int row, @NonNegative int column) { return this.underlying.getStartValue(row, column + this.firstCategoryIndex); } @@ -606,7 +606,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey) { * @return The end value (possibly {@code null}). */ @Override - public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { + public Number getEndValue(@NonNegative int series, @NonNegative int category) { return this.underlying.getEndValue(series, category + this.firstCategoryIndex); } diff --git a/src/main/java/org/jfree/data/gantt/Task.java b/src/main/java/org/jfree/data/gantt/Task.java index b676410cd..59c31680a 100644 --- a/src/main/java/org/jfree/data/gantt/Task.java +++ b/src/main/java/org/jfree/data/gantt/Task.java @@ -43,7 +43,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Date; @@ -191,7 +191,7 @@ public void removeSubtask(Task subtask) { * * @return The sub-task count. */ - public /*@NonNegative*/ int getSubtaskCount() { + public @NonNegative int getSubtaskCount() { return this.subtasks.size(); } @@ -202,7 +202,7 @@ public void removeSubtask(Task subtask) { * * @return The sub-task. */ - public Task getSubtask(/*@NonNegative*/ int index) { + public Task getSubtask(@NonNegative int index) { return (Task) this.subtasks.get(index); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeries.java b/src/main/java/org/jfree/data/gantt/TaskSeries.java index f2c3781f4..3a758413d 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeries.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeries.java @@ -45,7 +45,7 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.util.Collections; import java.util.List; @@ -116,7 +116,7 @@ public void removeAll() { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.tasks.size(); } @@ -127,7 +127,7 @@ public void removeAll() { * * @return The task. */ - public Task get(/*@NonNegative*/ int index) { + public Task get(@NonNegative int index) { return (Task) this.tasks.get(index); } diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 828a4d13a..bb84ab801 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -50,12 +50,12 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.Iterator; @@ -126,7 +126,7 @@ public TaskSeries getSeries(Comparable key) { * * @since 1.0.1 */ - public TaskSeries getSeries(/*@NonNegative*/ int series) { + public TaskSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -139,7 +139,7 @@ public TaskSeries getSeries(/*@NonNegative*/ int series) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return getRowCount(); } @@ -151,7 +151,7 @@ public TaskSeries getSeries(/*@NonNegative*/ int series) { * @return The name of a series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { TaskSeries ts = (TaskSeries) this.data.get(series); return ts.getKey(); } @@ -162,7 +162,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The series count. */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.data.size(); } @@ -182,8 +182,8 @@ public List getRowKeys() { * @return The column count. */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { return this.keys.size(); } @@ -205,7 +205,7 @@ public List getColumnKeys() { * @return The column key. */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int index) { + public Comparable getColumnKey(@NonNegative int index) { return (Comparable) this.keys.get(index); } @@ -217,7 +217,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int index) { * @return The column index. */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable columnKey) { + public @GTENegativeOne int getColumnIndex(Comparable columnKey) { Args.nullNotPermitted(columnKey, "columnKey"); return this.keys.indexOf(columnKey); } @@ -230,7 +230,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int index) { * @return The index. */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable rowKey) { + public @GTENegativeOne int getRowIndex(Comparable rowKey) { int result = -1; int count = this.data.size(); for (int i = 0; i < count; i++) { @@ -251,7 +251,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int index) { * @return The key. */ @Override - public Comparable getRowKey(/*@NonNegative*/ int index) { + public Comparable getRowKey(@NonNegative int index) { TaskSeries series = (TaskSeries) this.data.get(index); return series.getKey(); } @@ -304,7 +304,7 @@ public void remove(TaskSeries series) { * * @param series the series (zero based index). */ - public void remove(/*@NonNegative*/ int series) { + public void remove(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException( "TaskSeriesCollection.remove(): index outside valid range."); @@ -361,8 +361,8 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @return The start value. */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { return getStartValue(row, column); } @@ -379,7 +379,7 @@ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { public Number getStartValue(Comparable rowKey, Comparable columnKey) { Number result = null; @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int row = getRowIndex(rowKey); + @NonNegative int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -400,7 +400,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey) { * @return The start value. */ @Override - public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getStartValue(@NonNegative int row, @NonNegative int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getStartValue(rowKey, columnKey); @@ -419,7 +419,7 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum public Number getEndValue(Comparable rowKey, Comparable columnKey) { Number result = null; @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int row = getRowIndex(rowKey); + @NonNegative int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -440,7 +440,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey) { * @return The end value. */ @Override - public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getEndValue(@NonNegative int row, @NonNegative int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getEndValue(rowKey, columnKey); @@ -455,7 +455,7 @@ public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) * @return The percent complete (possibly {@code null}). */ @Override - public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getPercentComplete(@NonNegative int row, @NonNegative int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getPercentComplete(rowKey, columnKey); @@ -473,7 +473,7 @@ public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { Number result = null; @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int row = getRowIndex(rowKey); + @NonNegative int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -491,7 +491,7 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { * @return The sub-interval count. */ @Override - public /*@NonNegative*/ int getSubIntervalCount(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public @NonNegative int getSubIntervalCount(@NonNegative int row, @NonNegative int column) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getSubIntervalCount(rowKey, columnKey); @@ -506,10 +506,10 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { * @return The sub-interval count. */ @Override - public /*@NonNegative*/ int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { + public @NonNegative int getSubIntervalCount(Comparable rowKey, Comparable columnKey) { int result = 0; @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int row = getRowIndex(rowKey); + @NonNegative int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -528,7 +528,7 @@ public Number getPercentComplete(Comparable rowKey, Comparable columnKey) { * @return The start value (possibly {@code null}). */ @Override - public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { + public Number getStartValue(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getStartValue(rowKey, columnKey, subinterval); @@ -545,10 +545,10 @@ public Number getStartValue(/*@NonNegative*/ int row, /*@NonNegative*/ int colum */ @Override public Number getStartValue(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval) { + @NonNegative int subinterval) { Number result = null; @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int row = getRowIndex(rowKey); + @NonNegative int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -571,7 +571,7 @@ public Number getStartValue(Comparable rowKey, Comparable columnKey, * @return The end value (possibly {@code null}). */ @Override - public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { + public Number getEndValue(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getEndValue(rowKey, columnKey, subinterval); @@ -588,10 +588,10 @@ public Number getEndValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column, */ @Override public Number getEndValue(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval) { + @NonNegative int subinterval) { Number result = null; @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int row = getRowIndex(rowKey); + @NonNegative int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { @@ -614,7 +614,7 @@ public Number getEndValue(Comparable rowKey, Comparable columnKey, * @return The percent complete value (possibly {@code null}). */ @Override - public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int column, /*@NonNegative*/ int subinterval) { + public Number getPercentComplete(@NonNegative int row, @NonNegative int column, @NonNegative int subinterval) { Comparable rowKey = getRowKey(row); Comparable columnKey = getColumnKey(column); return getPercentComplete(rowKey, columnKey, subinterval); @@ -631,10 +631,10 @@ public Number getPercentComplete(/*@NonNegative*/ int row, /*@NonNegative*/ int */ @Override public Number getPercentComplete(Comparable rowKey, Comparable columnKey, - /*@NonNegative*/ int subinterval) { + @NonNegative int subinterval) { Number result = null; @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int row = getRowIndex(rowKey); + @NonNegative int row = getRowIndex(rowKey); TaskSeries series = (TaskSeries) this.data.get(row); Task task = series.get(columnKey.toString()); if (task != null) { diff --git a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java index a3a4a32f3..22b868fe4 100644 --- a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java +++ b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java @@ -40,11 +40,11 @@ */ package org.jfree.data.gantt; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.Date; @@ -162,7 +162,7 @@ public void setTransposed(boolean transposed) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.underlying.getSeriesCount(); } @@ -174,7 +174,7 @@ public void setTransposed(boolean transposed) { * @return The name of a series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { return this.underlying.getSeriesKey(series); } @@ -187,7 +187,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // array-list interop: The underlying representation here is a mutable collection, but this annotation is needed to match the interface - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.underlying.getSeries(series).getItemCount(); } @@ -200,7 +200,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { if (!this.transposed) { return getSeriesValue(series); } @@ -220,7 +220,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The start date/time. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { if (!this.transposed) { return getSeriesStartValue(series); } @@ -240,7 +240,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The end date/time. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { if (!this.transposed) { return getSeriesEndValue(series); } @@ -258,7 +258,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The x-value (in milliseconds). */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getXValue(series, item)); } @@ -273,7 +273,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The start date/time. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getStartXValue(series, item)); } @@ -288,7 +288,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The end date/time. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getEndXValue(series, item)); } @@ -301,7 +301,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { if (!this.transposed) { return getItemValue(series, item); } @@ -320,7 +320,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The y-interval start. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { if (!this.transposed) { return getItemStartValue(series, item); } @@ -339,7 +339,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The y-interval end. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { if (!this.transposed) { return getItemEndValue(series, item); } @@ -359,7 +359,7 @@ public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getYValue(series, item)); } @@ -373,7 +373,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The y-interval start. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getStartYValue(series, item)); } @@ -387,23 +387,23 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The y-interval end. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getEndYValue(series, item)); } - private double getSeriesValue(/*@NonNegative*/ int series) { + private double getSeriesValue(@NonNegative int series) { return series; } - private double getSeriesStartValue(/*@NonNegative*/ int series) { + private double getSeriesStartValue(@NonNegative int series) { return series - this.seriesWidth / 2.0; } - private double getSeriesEndValue(/*@NonNegative*/ int series) { + private double getSeriesEndValue(@NonNegative int series) { return series + this.seriesWidth / 2.0; } - private double getItemValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + private double getItemValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); @@ -412,7 +412,7 @@ private double getItemValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSe return (start.getTime() + end.getTime()) / 2.0; } - private double getItemStartValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + private double getItemStartValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); @@ -420,7 +420,7 @@ private double getItemStartValue(/*@NonNegative*/ int series, /*@IndexFor("this. return start.getTime(); } - private double getItemEndValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + private double getItemEndValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TaskSeries s = this.underlying.getSeries(series); Task t = s.get(item); TimePeriod duration = t.getDuration(); diff --git a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java index a68a431e6..262a08874 100644 --- a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java +++ b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java @@ -43,11 +43,11 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; @@ -74,7 +74,7 @@ protected AbstractSeriesDataset() { * @return The series count. */ @Override - public abstract /*@NonNegative*/ int getSeriesCount(); + public abstract @NonNegative int getSeriesCount(); /** * Returns the key for a series. @@ -89,7 +89,7 @@ protected AbstractSeriesDataset() { * @return The series key. */ @Override - public abstract Comparable getSeriesKey(/*@NonNegative*/ int series); + public abstract Comparable getSeriesKey(@NonNegative int series); /** * Returns the index of the named series, or -1. @@ -99,7 +99,7 @@ protected AbstractSeriesDataset() { * @return The index. */ @Override - public /*@GTENegativeOne*/ int indexOf(Comparable seriesKey) { + public @GTENegativeOne int indexOf(Comparable seriesKey) { int seriesCount = getSeriesCount(); for (int s = 0; s < seriesCount; s++) { if (getSeriesKey(s).equals(seriesKey)) { @@ -124,7 +124,7 @@ public void seriesChanged(SeriesChangeEvent event) { * to represent the conceptual "series" that the dataset provides. */ @Override - public Series getSeries(/*@NonNegative*/ int series) throws Exception{ + public Series getSeries(@NonNegative int series) throws Exception{ throw new Exception("unimplemented"); } } diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 55f43dfb3..6d876fe0e 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -128,13 +128,13 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.ArrayList; import java.util.Iterator; @@ -221,7 +221,7 @@ public static double calculatePieDatasetTotal(PieDataset dataset) { public static PieDataset createPieDatasetForRow(CategoryDataset dataset, Comparable rowKey) { @SuppressWarnings("index") // rowKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int row = dataset.getRowIndex(rowKey); + @NonNegative int row = dataset.getRowIndex(rowKey); return createPieDatasetForRow(dataset, row); } @@ -235,7 +235,7 @@ public static PieDataset createPieDatasetForRow(CategoryDataset dataset, * @return A pie dataset. */ public static PieDataset createPieDatasetForRow(CategoryDataset dataset, - /*@NonNegative*/ int row) { + @NonNegative int row) { DefaultPieDataset result = new DefaultPieDataset(); int columnCount = dataset.getColumnCount(); for (int current = 0; current < columnCount; current++) { @@ -257,7 +257,7 @@ public static PieDataset createPieDatasetForRow(CategoryDataset dataset, public static PieDataset createPieDatasetForColumn(CategoryDataset dataset, Comparable columnKey) { @SuppressWarnings("index") // columnKey is being assumed to be a valid key. It should probably be checked - this is a bug - /*@NonNegative*/ int column = dataset.getColumnIndex(columnKey); + @NonNegative int column = dataset.getColumnIndex(columnKey); return createPieDatasetForColumn(dataset, column); } @@ -271,7 +271,7 @@ public static PieDataset createPieDatasetForColumn(CategoryDataset dataset, * @return A pie dataset. */ public static PieDataset createPieDatasetForColumn(CategoryDataset dataset, - /*@NonNegative*/ int column) { + @NonNegative int column) { DefaultPieDataset result = new DefaultPieDataset(); int rowCount = dataset.getRowCount(); for (int i = 0; i < rowCount; i++) { @@ -431,8 +431,8 @@ public static CategoryDataset createCategoryDataset(String rowKeyPrefix, * * @return The dataset. */ - public static CategoryDataset createCategoryDataset(Comparable /*@SameLen("#3")*/ [] rowKeys, - Comparable[] columnKeys, double /*@SameLen("#1")*/ [] /*@SameLen("#2")*/ [] data) { + public static CategoryDataset createCategoryDataset(Comparable @SameLen("#3") [] rowKeys, + Comparable[] columnKeys, double @SameLen("#1") [] @SameLen("#2") [] data) { Args.nullNotPermitted(rowKeys, "rowKeys"); Args.nullNotPermitted(columnKeys, "columnKeys"); @@ -507,7 +507,7 @@ public static CategoryDataset createCategoryDataset(Comparable rowKey, * @return A dataset. */ public static XYDataset sampleFunction2D(Function2D f, double start, - double end, /*@Positive*/ int samples, Comparable seriesKey) { + double end, @Positive int samples, Comparable seriesKey) { // defer argument checking XYSeries series = sampleFunction2DToSeries(f, start, end, samples, @@ -532,7 +532,7 @@ public static XYDataset sampleFunction2D(Function2D f, double start, * @since 1.0.13 */ public static XYSeries sampleFunction2DToSeries(Function2D f, - double start, double end, /*@Positive*/ int samples, Comparable seriesKey) { + double start, double end, @Positive int samples, Comparable seriesKey) { Args.nullNotPermitted(f, "f"); Args.nullNotPermitted(seriesKey, "seriesKey"); @@ -1030,7 +1030,7 @@ public static Range iterateToFindRangeBounds(CategoryDataset dataset, while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); + @NonNegative int series = dataset.getRowIndex(seriesKey); int itemCount = dataset.getColumnCount(); for (int item = 0; item < itemCount; item++) { Number lvalue = bx.getMinRegularValue(series, item); @@ -1060,7 +1060,7 @@ else if (includeInterval while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); + @NonNegative int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { lvalue = icd.getStartValue(series, column); uvalue = icd.getEndValue(series, column); @@ -1083,7 +1083,7 @@ else if (includeInterval while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); + @NonNegative int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { List values = mvcd.getValues(series, column); Iterator valueIterator = values.iterator(); @@ -1110,7 +1110,7 @@ else if (includeInterval while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); + @NonNegative int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { Number meanN = scd.getMeanValue(series, column); if (meanN != null) { @@ -1137,7 +1137,7 @@ else if (includeInterval while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.getRowIndex(seriesKey); + @NonNegative int series = dataset.getRowIndex(seriesKey); for (int column = 0; column < columnCount; column++) { Number value = dataset.getValue(series, column); if (value != null) { @@ -1385,7 +1385,7 @@ public static Range iterateToFindDomainBounds(XYDataset dataset, while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + @NonNegative int series = dataset.indexOf(seriesKey); int itemCount = ixyd.getItemCount(series); for (int item = 0; item < itemCount; item++) { double xvalue = ixyd.getXValue(series, item); @@ -1409,7 +1409,7 @@ public static Range iterateToFindDomainBounds(XYDataset dataset, while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + @NonNegative int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = dataset.getXValue(series, item); @@ -1463,7 +1463,7 @@ public static Range iterateToFindRangeBounds(XYDataset dataset, while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + @NonNegative int series = dataset.indexOf(seriesKey); int itemCount = ohlc.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = ohlc.getXValue(series, item); @@ -1487,7 +1487,7 @@ else if (includeInterval && dataset instanceof BoxAndWhiskerXYDataset) { while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + @NonNegative int series = dataset.indexOf(seriesKey); int itemCount = bx.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = bx.getXValue(series, item); @@ -1511,7 +1511,7 @@ else if (includeInterval && dataset instanceof IntervalXYDataset) { while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + @NonNegative int series = dataset.indexOf(seriesKey); int itemCount = ixyd.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = ixyd.getXValue(series, item); @@ -1538,7 +1538,7 @@ else if (includeInterval && dataset instanceof IntervalXYDataset) { while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + @NonNegative int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = dataset.getXValue(series, item); @@ -1587,7 +1587,7 @@ public static Range iterateToFindZBounds(XYZDataset dataset, while (iterator.hasNext()) { Comparable seriesKey = (Comparable) iterator.next(); @SuppressWarnings("index") // guaranteed index: guaranteed to be an index since getRowIndex called on a key known to be in the dataset - /*@NonNegative*/ int series = dataset.indexOf(seriesKey); + @NonNegative int series = dataset.indexOf(seriesKey); int itemCount = dataset.getItemCount(series); for (int item = 0; item < itemCount; item++) { double x = dataset.getXValue(series, item); @@ -2046,7 +2046,7 @@ public static Range findStackedRangeBounds(CategoryDataset dataset, hasValidData = true; double value = number.doubleValue(); @SuppressWarnings("index") // group indices are all <= group count by definition - /*@IndexFor({"positive", "negative", "maximum", "minimum"})*/ int groupIndexTmp = groupIndex[series]; + @IndexFor({"positive", "negative", "maximum", "minimum"}) int groupIndexTmp = groupIndex[series]; if (value > 0.0) { positive[groupIndexTmp] = positive[groupIndexTmp] + value; @@ -2215,7 +2215,7 @@ public static Range findStackedRangeBounds(TableXYDataset dataset, * * @since 1.0.5 */ - public static double calculateStackTotal(TableXYDataset dataset, /*@NonNegative*/ int item) { + public static double calculateStackTotal(TableXYDataset dataset, @NonNegative int item) { double total = 0.0; int seriesCount = dataset.getSeriesCount(); for (int s = 0; s < seriesCount; s++) { @@ -2281,18 +2281,18 @@ public static Range findCumulativeRangeBounds(CategoryDataset dataset) { * * @since 1.0.16 */ - public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, double x) { + public static double findYValue(XYDataset dataset, @NonNegative int series, double x) { // delegate null check on dataset - /*@IndexOrLow("dataset.getSeries(series)")*/ int[] indices = findItemIndicesForX(dataset, series, x); + @IndexOrLow("dataset.getSeries(series)") int[] indices = findItemIndicesForX(dataset, series, x); if (indices[0] == -1) { return Double.NaN; } @SuppressWarnings("index") // guaranteed index: the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. - /*@IndexFor("dataset.getSeries(series)")*/ int indices0 = indices[0]; + @IndexFor("dataset.getSeries(series)") int indices0 = indices[0]; @SuppressWarnings("index") // guaranteed index: the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. - /*@IndexFor("dataset.getSeries(series)")*/ int indices1 = indices[1]; + @IndexFor("dataset.getSeries(series)") int indices1 = indices[1]; if (indices0 == indices1) { return dataset.getYValue(series, indices0); @@ -2325,7 +2325,7 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, * * @see #findYValue(org.jfree.data.xy.XYDataset, int, double) */ - public static /*@IndexOrLow("#1.getSeries(#2)")*/ int /*@ArrayLen(2)*/ [] findItemIndicesForX(XYDataset dataset, /*@NonNegative*/ int series, + public static @IndexOrLow("#1.getSeries(#2)") int @ArrayLen(2) [] findItemIndicesForX(XYDataset dataset, @NonNegative int series, double x) { Args.nullNotPermitted(dataset, "dataset"); int itemCount = dataset.getItemCount(series); @@ -2334,7 +2334,7 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, } if (itemCount == 1) { @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 - /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + @IndexFor("dataset.getSeries(series)") int zero = 0; double xValue = dataset.getXValue(series, zero); if (x == xValue) { return new int[] {zero, zero}; @@ -2344,9 +2344,9 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, } if (dataset.getDomainOrder() == DomainOrder.ASCENDING) { @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 - /*@IndexFor("dataset.getSeries(series)")*/ int low = 0; + @IndexFor("dataset.getSeries(series)") int low = 0; @SuppressWarnings("index") // itemCount - 1 is an index, because itemCount > 1 - /*@IndexFor("dataset.getSeries(series)")*/ int high = itemCount - 1; + @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > x) { return new int[] {-1, -1}; @@ -2379,9 +2379,9 @@ public static double findYValue(XYDataset dataset, /*@NonNegative*/ int series, } else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 - /*@IndexFor("dataset.getSeries(series)")*/ int high = 0; + @IndexFor("dataset.getSeries(series)") int high = 0; @SuppressWarnings("index") // itemCount - 1 is an index, because itemCount > 1 - /*@IndexFor("dataset.getSeries(series)")*/ int low = itemCount - 1; + @IndexFor("dataset.getSeries(series)") int low = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > x) { return new int[] {-1, -1}; @@ -2411,7 +2411,7 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // so we iterate until we find the first crossing of x (if any) // we know there are at least 2 items in the series at this point @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 - /*@IndexFor("dataset.getSeries(series)")*/ int zero = 0; + @IndexFor("dataset.getSeries(series)") int zero = 0; double prev = dataset.getXValue(series, zero); if (x == prev) { return new int[] {zero, zero}; // exact match on first item diff --git a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java index 1716e454c..a339a1669 100644 --- a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java @@ -39,8 +39,8 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; @@ -55,10 +55,10 @@ public class DefaultHeatMapDataset extends AbstractDataset implements HeatMapDataset, Cloneable, PublicCloneable, Serializable { /** The number of samples in this dataset for the x-dimension. */ - private /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int xSamples; + private @Positive @LTEqLengthOf("this.getData()") int xSamples; /** The number of samples in this dataset for the y-dimension. */ - private /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int ySamples; + private @Positive @LTEqLengthOf("this.getData()[0]") int ySamples; /** The minimum x-value in the dataset. */ private double minX; @@ -73,7 +73,7 @@ public class DefaultHeatMapDataset extends AbstractDataset private double maxY; /** Storage for the z-values. */ - private double /*@MinLen(1)*/ /*@SameLen("this.getData()")*/ [] /*@MinLen(1)*/ /*@SameLen("this.getData()[0]")*/ [] zValues; + private double @MinLen(1) @SameLen("this.getData()") [] @MinLen(1) @SameLen("this.getData()[0]") [] zValues; /** * Creates a new dataset where all the z-values are initially 0. This is @@ -86,7 +86,7 @@ public class DefaultHeatMapDataset extends AbstractDataset * @param minY the minimum y-value in the dataset. * @param maxY the maximum y-value in the dataset. */ - public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamples, double minX, + public DefaultHeatMapDataset(@Positive int xSamples, @Positive int ySamples, double minX, double maxX, double minY, double maxY) { if (xSamples < 1) { @@ -109,21 +109,21 @@ public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamp } @SuppressWarnings("index") // establishing invariant of a ghost method - /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int xSamplesTmp = xSamples; + @Positive @LTEqLengthOf("this.getData()") int xSamplesTmp = xSamples; this.xSamples = xSamplesTmp; @SuppressWarnings("index") // establishing invariant of a ghost method - /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int ySamplesTmp = ySamples; + @Positive @LTEqLengthOf("this.getData()[0]") int ySamplesTmp = ySamples; this.ySamples = ySamplesTmp; this.minX = minX; this.maxX = maxX; this.minY = minY; this.maxY = maxY; @SuppressWarnings({"index", "value"}) // establishing invariant of a ghost method: since ySamples is positive and will be used to create each inner array, the MinLen is true - double /*@SameLen("this.getData()")*/ [] /*@SameLen("this.getData()[0]")*/ /*@MinLen(1)*/ [] zValues = new double[xSamples][]; + double @SameLen("this.getData()") [] @SameLen("this.getData()[0]") @MinLen(1) [] zValues = new double[xSamples][]; this.zValues = zValues; for (int x = 0; x < xSamples; x++) { @SuppressWarnings("index") // establishing invariant of a ghost method - double /*@SameLen("this.getData()[0]")*/ [] zValuesX = new double[ySamples]; + double @SameLen("this.getData()[0]") [] zValuesX = new double[ySamples]; this.zValues[x] = zValuesX; } } @@ -136,7 +136,7 @@ public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamp * @return The number of x-values (always > 0). */ @Override - public /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int getXSampleCount() { + public @Positive @LTEqLengthOf("this.getData()") int getXSampleCount() { return this.xSamples; } @@ -148,7 +148,7 @@ public DefaultHeatMapDataset(/*@Positive*/ int xSamples, /*@Positive*/ int ySamp * @return The number of y-values (always > 0). */ @Override - public /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int getYSampleCount() { + public @Positive @LTEqLengthOf("this.getData()[0]") int getYSampleCount() { return this.ySamples; } @@ -208,7 +208,7 @@ public double getMaximumYValue() { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int xIndex) { + public double getXValue(@NonNegative int xIndex) { double x = this.minX + (this.maxX - this.minX) * (xIndex / (double) this.xSamples); return x; @@ -222,7 +222,7 @@ public double getXValue(/*@NonNegative*/ int xIndex) { * @return The y-value. */ @Override - public double getYValue(/*@NonNegative*/ int yIndex) { + public double getYValue(@NonNegative int yIndex) { double y = this.minY + (this.maxY - this.minY) * (yIndex / (double) this.ySamples); return y; @@ -238,7 +238,7 @@ public double getYValue(/*@NonNegative*/ int yIndex) { * @return The z-value. */ @Override - public double getZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex) { + public double getZValue(@IndexFor("this.getData()") int xIndex, @IndexFor("this.getData()[0]") int yIndex) { return this.zValues[xIndex][yIndex]; } @@ -254,7 +254,7 @@ public double getZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor( * @return The z-value. */ @Override - public Number getZ(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex) { + public Number getZ(@IndexFor("this.getData()") int xIndex, @IndexFor("this.getData()[0]") int yIndex) { return new Double(getZValue(xIndex, yIndex)); } @@ -262,7 +262,7 @@ public Number getZ(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this * This is a ghost method. Implementations should return null. */ @Override - public double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] getData() { + public double @MinLen(1) [] @MinLen(1) [] getData() { return null; } @@ -274,7 +274,7 @@ public Number getZ(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this * @param yIndex the y-index. * @param z the new z-value. */ - public void setZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex, double z) { + public void setZValue(@IndexFor("this.getData()") int xIndex, @IndexFor("this.getData()[0]") int yIndex, double z) { setZValue(xIndex, yIndex, z, true); } @@ -287,7 +287,7 @@ public void setZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("t * @param z the new z-value. * @param notify notify listeners? */ - public void setZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex, double z, boolean notify) { + public void setZValue(@IndexFor("this.getData()") int xIndex, @IndexFor("this.getData()[0]") int yIndex, double z, boolean notify) { this.zValues[xIndex][yIndex] = z; if (notify) { fireDatasetChanged(); diff --git a/src/main/java/org/jfree/data/general/DefaultPieDataset.java b/src/main/java/org/jfree/data/general/DefaultPieDataset.java index 60c0d90b8..14d961cdd 100644 --- a/src/main/java/org/jfree/data/general/DefaultPieDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultPieDataset.java @@ -56,8 +56,8 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Collections; @@ -109,7 +109,7 @@ public DefaultPieDataset(KeyedValues data) { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.data.getItemCount(); } @@ -136,7 +136,7 @@ public List getKeys() { * specified range. */ @Override - public Comparable getKey(/*@NonNegative*/ int item) { + public Comparable getKey(@NonNegative int item) { return this.data.getKey(item); } @@ -151,7 +151,7 @@ public Comparable getKey(/*@NonNegative*/ int item) { * {@code null}. */ @Override - public /*@GTENegativeOne*/ int getIndex(Comparable key) { + public @GTENegativeOne int getIndex(Comparable key) { return this.data.getIndex(key); } @@ -163,7 +163,7 @@ public Comparable getKey(/*@NonNegative*/ int item) { * @return The value (possibly {@code null}). */ @Override - public Number getValue(/*@NonNegative*/ int item) { + public Number getValue(@NonNegative int item) { Number result = null; if (getItemCount() > item) { result = this.data.getValue(item); @@ -228,7 +228,7 @@ public void setValue(Comparable key, double value) { * * @since 1.0.6 */ - public void insertValue(/*@NonNegative*/ int position, Comparable key, double value) { + public void insertValue(@NonNegative int position, Comparable key, double value) { insertValue(position, key, new Double(value)); } @@ -245,7 +245,7 @@ public void insertValue(/*@NonNegative*/ int position, Comparable key, double va * * @since 1.0.6 */ - public void insertValue(/*@NonNegative*/ int position, Comparable key, Number value) { + public void insertValue(@NonNegative int position, Comparable key, Number value) { this.data.insertValue(position, key, value); fireDatasetChanged(); } diff --git a/src/main/java/org/jfree/data/general/HeatMapDataset.java b/src/main/java/org/jfree/data/general/HeatMapDataset.java index cff77af75..27610f14f 100644 --- a/src/main/java/org/jfree/data/general/HeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/HeatMapDataset.java @@ -39,9 +39,9 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; /** * A dataset that represents a rectangular grid of (x, y, z) values. The x @@ -59,7 +59,7 @@ public interface HeatMapDataset { * * @return The number of x-values (always > 0). */ - public /*@Positive*/ /*@LTEqLengthOf("this.getData()")*/ int getXSampleCount(); + public @Positive @LTEqLengthOf("this.getData()") int getXSampleCount(); /** * Returns the number of y values (or samples) for the dataset. The @@ -68,7 +68,7 @@ public interface HeatMapDataset { * * @return The number of y-values (always > 0). */ - public /*@Positive*/ /*@LTEqLengthOf("this.getData()[0]")*/ int getYSampleCount(); + public @Positive @LTEqLengthOf("this.getData()[0]") int getYSampleCount(); /** * Returns the lowest x-value represented in this dataset. A requirement @@ -113,7 +113,7 @@ public interface HeatMapDataset { * * @return The x-value. */ - public double getXValue(/*@NonNegative*/ int xIndex); + public double getXValue(@NonNegative int xIndex); /** * A convenience method that returns the y-value for the given index. @@ -122,7 +122,7 @@ public interface HeatMapDataset { * * @return The y-value. */ - public double getYValue(/*@NonNegative*/ int yIndex); + public double getYValue(@NonNegative int yIndex); /** * Returns the z-value at the specified sample position in the dataset. @@ -133,7 +133,7 @@ public interface HeatMapDataset { * * @return The z-value. */ - public double getZValue(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex); + public double getZValue(@IndexFor("this.getData()") int xIndex, @IndexFor("this.getData()[0]") int yIndex); /** * Returns the z-value at the specified sample position in the dataset. @@ -152,10 +152,10 @@ public interface HeatMapDataset { * * @return The z-value (possibly {@code null}). */ - public Number getZ(/*@IndexFor("this.getData()")*/ int xIndex, /*@IndexFor("this.getData()[0]")*/ int yIndex); + public Number getZ(@IndexFor("this.getData()") int xIndex, @IndexFor("this.getData()[0]") int yIndex); /** * This is a ghost method. Implementations should return null. */ - public double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] getData(); + public double @MinLen(1) [] @MinLen(1) [] getData(); } diff --git a/src/main/java/org/jfree/data/general/HeatMapUtils.java b/src/main/java/org/jfree/data/general/HeatMapUtils.java index 8a8a26175..33d87e9fc 100644 --- a/src/main/java/org/jfree/data/general/HeatMapUtils.java +++ b/src/main/java/org/jfree/data/general/HeatMapUtils.java @@ -40,8 +40,8 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; import java.awt.Paint; @@ -70,7 +70,7 @@ public abstract class HeatMapUtils { * @return The dataset. */ public static XYDataset extractRowFromHeatMapDataset(HeatMapDataset dataset, - /*@IndexFor("#1.getData()[0]")*/ int row, Comparable seriesName) { + @IndexFor("#1.getData()[0]") int row, Comparable seriesName) { XYSeries series = new XYSeries(seriesName); int cols = dataset.getXSampleCount(); for (int c = 0; c < cols; c++) { @@ -91,7 +91,7 @@ public static XYDataset extractRowFromHeatMapDataset(HeatMapDataset dataset, * @return The dataset. */ public static XYDataset extractColumnFromHeatMapDataset( - HeatMapDataset dataset, /*@IndexFor("#1.getData()")*/ int column, Comparable seriesName) { + HeatMapDataset dataset, @IndexFor("#1.getData()") int column, Comparable seriesName) { XYSeries series = new XYSeries(seriesName); int rows = dataset.getYSampleCount(); for (int r = 0; r < rows; r++) { diff --git a/src/main/java/org/jfree/data/general/Series.java b/src/main/java/org/jfree/data/general/Series.java index a27a6ccf8..aa93ab658 100644 --- a/src/main/java/org/jfree/data/general/Series.java +++ b/src/main/java/org/jfree/data/general/Series.java @@ -55,7 +55,7 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; @@ -236,7 +236,7 @@ public boolean isEmpty() { * * @return The number of data items in the series. */ - public abstract /*@NonNegative*/ int getItemCount(); + public abstract @NonNegative int getItemCount(); /** * Returns a clone of the series. diff --git a/src/main/java/org/jfree/data/general/SeriesDataset.java b/src/main/java/org/jfree/data/general/SeriesDataset.java index f0aae0301..9b0a867e3 100644 --- a/src/main/java/org/jfree/data/general/SeriesDataset.java +++ b/src/main/java/org/jfree/data/general/SeriesDataset.java @@ -42,11 +42,11 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.category.CategoryDataset; import org.jfree.data.xy.IntervalXYDataset; @@ -70,7 +70,7 @@ public interface SeriesDataset extends Dataset { * * @return The series count. */ - public /*@NonNegative*/ int getSeriesCount(); + public @NonNegative int getSeriesCount(); /** * Returns the key for a series. @@ -80,7 +80,7 @@ public interface SeriesDataset extends Dataset { * * @return The key for the series. */ - public Comparable getSeriesKey(/*@NonNegative*/ int series); + public Comparable getSeriesKey(@NonNegative int series); /** * Returns the index of the series with the specified key, or -1 if there @@ -90,7 +90,7 @@ public interface SeriesDataset extends Dataset { * * @return The index, or -1. */ - public /*@GTENegativeOne*/ int indexOf(Comparable seriesKey); + public @GTENegativeOne int indexOf(Comparable seriesKey); /** * This is a ghost method for use in annotations. It is never called at runtime, and should never be invoked. @@ -100,6 +100,6 @@ public interface SeriesDataset extends Dataset { * @param series a series index * @return a representation of the series */ - Series getSeries(/*@NonNegative*/ int series) throws Exception; + Series getSeries(@NonNegative int series) throws Exception; } diff --git a/src/main/java/org/jfree/data/general/WaferMapDataset.java b/src/main/java/org/jfree/data/general/WaferMapDataset.java index df86914c5..2dacba934 100644 --- a/src/main/java/org/jfree/data/general/WaferMapDataset.java +++ b/src/main/java/org/jfree/data/general/WaferMapDataset.java @@ -42,7 +42,7 @@ */ package org.jfree.data.general; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.util.Set; import java.util.TreeSet; @@ -62,10 +62,10 @@ public class WaferMapDataset extends AbstractDataset { private DefaultKeyedValues2D data; /** wafer x dimension */ - private /*@NonNegative*/ int maxChipX; + private @NonNegative int maxChipX; /** wafer y dimension */ - private /*@NonNegative*/ int maxChipY; + private @NonNegative int maxChipY; /** space to draw between chips */ private double chipSpace; @@ -85,7 +85,7 @@ public class WaferMapDataset extends AbstractDataset { * @param maxChipX the wafer x-dimension. * @param maxChipY the wafer y-dimension. */ - public WaferMapDataset(/*@NonNegative*/ int maxChipX, /*@NonNegative*/ int maxChipY) { + public WaferMapDataset(@NonNegative int maxChipX, @NonNegative int maxChipY) { this(maxChipX, maxChipY, null); } @@ -96,7 +96,7 @@ public WaferMapDataset(/*@NonNegative*/ int maxChipX, /*@NonNegative*/ int maxCh * @param maxChipY the wafer y-dimension. * @param chipSpace the space between chips. */ - public WaferMapDataset(/*@NonNegative*/ int maxChipX, /*@NonNegative*/ int maxChipY, Number chipSpace) { + public WaferMapDataset(@NonNegative int maxChipX, @NonNegative int maxChipY, Number chipSpace) { this.maxValue = new Double(Double.NEGATIVE_INFINITY); this.minValue = new Double(Double.POSITIVE_INFINITY); @@ -131,7 +131,7 @@ public void addValue(Number value, Comparable chipx, Comparable chipy) { * @param x the x-index. * @param y the y-index. */ - public void addValue(int v, /*@NonNegative*/ int x, /*@NonNegative*/ int y) { + public void addValue(int v, @NonNegative int x, @NonNegative int y) { setValue(new Double(v), new Integer(x), new Integer(y)); } @@ -157,7 +157,7 @@ public void setValue(Number value, Comparable chipx, Comparable chipy) { * * @return The number of unique values. */ - public /*@NonNegative*/ int getUniqueValueCount() { + public @NonNegative int getUniqueValueCount() { return getUniqueValues().size(); } @@ -263,7 +263,7 @@ public Number getMinValue() { * * @return The number of chips in the x-dimension. */ - public /*@NonNegative*/ int getMaxChipX() { + public @NonNegative int getMaxChipX() { return this.maxChipX; } @@ -272,7 +272,7 @@ public Number getMinValue() { * * @param maxChipX the number of chips in the x-dimension. */ - public void setMaxChipX(/*@NonNegative*/ int maxChipX) { + public void setMaxChipX(@NonNegative int maxChipX) { this.maxChipX = maxChipX; } @@ -281,7 +281,7 @@ public void setMaxChipX(/*@NonNegative*/ int maxChipX) { * * @return The number of chips. */ - public /*@NonNegative*/ int getMaxChipY() { + public @NonNegative int getMaxChipY() { return this.maxChipY; } @@ -290,7 +290,7 @@ public void setMaxChipX(/*@NonNegative*/ int maxChipX) { * * @param maxChipY the number of chips. */ - public void setMaxChipY(/*@NonNegative*/ int maxChipY) { + public void setMaxChipY(@NonNegative int maxChipY) { this.maxChipY = maxChipY; } diff --git a/src/main/java/org/jfree/data/io/CSV.java b/src/main/java/org/jfree/data/io/CSV.java index 59362bcfd..2937b4ccc 100644 --- a/src/main/java/org/jfree/data/io/CSV.java +++ b/src/main/java/org/jfree/data/io/CSV.java @@ -40,8 +40,8 @@ package org.jfree.data.io; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; import java.io.BufferedReader; import java.io.IOException; @@ -156,7 +156,7 @@ private void extractRowKeyAndData(String line, List columnKeys) { Comparable rowKey = null; int fieldIndex = 0; - /*@IndexOrHigh("line")*/ int start = 0; + @IndexOrHigh("line") int start = 0; for (int i = 0; i < line.length(); i++) { if (line.charAt(i) == this.fieldDelimiter) { if (fieldIndex == 0) { // first field contains the row key @@ -173,14 +173,14 @@ private void extractRowKeyAndData(String line, ); } @SuppressWarnings("index") // line is CSV formatted, so skipping is okay here - /*@IndexOrHigh("line")*/ int skipIndex = i + 1; + @IndexOrHigh("line") int skipIndex = i + 1; start = skipIndex; fieldIndex++; } } @SuppressWarnings("index") // CSV format guarantees at least one field - /*@Positive*/ int fieldIndexTmp = fieldIndex; + @Positive int fieldIndexTmp = fieldIndex; fieldIndex = fieldIndexTmp; Double value = Double.valueOf( diff --git a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java index c55bfc285..5b1244ae5 100644 --- a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java +++ b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java @@ -71,7 +71,7 @@ */ package org.jfree.data.jdbc; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.sql.Connection; import java.sql.DriverManager; @@ -244,7 +244,7 @@ public void executeQuery(Connection con, String query) ResultSetMetaData metaData = resultSet.getMetaData(); @SuppressWarnings("index") // ResultSetMetaData#getColumnCount needs an annotation - /*@Positive*/ int numberOfColumns = metaData.getColumnCount(); + @Positive int numberOfColumns = metaData.getColumnCount(); int numberOfValidColumns = 0; int [] columnTypes = new int[numberOfColumns]; for (int column = 0; column < numberOfColumns; column++) { @@ -288,13 +288,13 @@ public void executeQuery(Connection con, String query) /// First column is X data this.columnNames = new String[numberOfValidColumns - 1]; /// Get the column names and cache them. - /*@IndexFor("this.columnNames")*/ int currentColumn = 0; + @IndexFor("this.columnNames") int currentColumn = 0; for (int column = 1; column < numberOfColumns; column++) { if (columnTypes[column] != Types.NULL) { this.columnNames[currentColumn] = metaData.getColumnLabel(column + 1); @SuppressWarnings("index") // this update only happens when the column is valid - /*@IndexFor("this.columnNames")*/ int currentColumnTmp = currentColumn + 1; + @IndexFor("this.columnNames") int currentColumnTmp = currentColumn + 1; currentColumn = currentColumnTmp; } } @@ -427,7 +427,7 @@ public void executeQuery(Connection con, String query) * @see XYDataset */ @Override - public Number getX(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { + public Number getX(@NonNegative int seriesIndex, @IndexFor("this.getSeries(#1)") int itemIndex) { ArrayList row = (ArrayList) this.rows.get(itemIndex); return (Number) row.get(0); } @@ -443,7 +443,7 @@ public Number getX(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries * @see XYDataset */ @Override - public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { + public Number getY(@NonNegative int seriesIndex, @IndexFor("this.getSeries(#1)") int itemIndex) { ArrayList row = (ArrayList) this.rows.get(itemIndex); return (Number) row.get(seriesIndex + 1); } @@ -459,7 +459,7 @@ public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries */ @Override @SuppressWarnings("index") // array-list interop: getItemCount needs to have this type for the other implementations - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int seriesIndex) { return this.rows.size(); } @@ -470,7 +470,7 @@ public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return getItemCount(0); } @@ -483,7 +483,7 @@ public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries * @see Dataset */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.columnNames.length; } @@ -498,7 +498,7 @@ public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries * @see Dataset */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int seriesIndex) { + public Comparable getSeriesKey(@NonNegative int seriesIndex) { if ((seriesIndex < this.columnNames.length) && (this.columnNames[seriesIndex] != null)) { diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java index c9d9e3f16..bbec3c871 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCalculator.java @@ -47,8 +47,8 @@ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.util.ArrayList; import java.util.Collections; @@ -198,7 +198,7 @@ public static double calculateQ1(List values) { } else { @SuppressWarnings({"index","value"}) // since count is a nonnegative even number, this expression is >= 0 - /*@IntRange(from=0)*/ int count1 = count / 2 - 1; + @IntRange(from=0) int count1 = count / 2 - 1; count1 = count1; result = Statistics.calculateMedian(values, 0, count1); } diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java index 835d6707d..f8893ba93 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java @@ -44,7 +44,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.util.List; @@ -64,7 +64,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The mean value. */ - public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getMeanValue(@NonNegative int row, @NonNegative int column); /** * Returns the average value for an item. @@ -84,7 +84,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The median value. */ - public Number getMedianValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getMedianValue(@NonNegative int row, @NonNegative int column); /** * Returns the median value for an item. @@ -104,7 +104,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The q1median value. */ - public Number getQ1Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getQ1Value(@NonNegative int row, @NonNegative int column); /** * Returns the q1median value for an item. @@ -124,7 +124,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The q3median value. */ - public Number getQ3Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getQ3Value(@NonNegative int row, @NonNegative int column); /** * Returns the q3median value for an item. @@ -144,7 +144,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The minimum regular value. */ - public Number getMinRegularValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getMinRegularValue(@NonNegative int row, @NonNegative int column); /** * Returns the minimum regular (non-outlier) value for an item. @@ -164,7 +164,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The maximum regular value. */ - public Number getMaxRegularValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getMaxRegularValue(@NonNegative int row, @NonNegative int column); /** * Returns the maximum regular (non-outlier) value for an item. @@ -184,7 +184,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The minimum outlier. */ - public Number getMinOutlier(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getMinOutlier(@NonNegative int row, @NonNegative int column); /** * Returns the minimum outlier (non-farout) for an item. @@ -204,7 +204,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return The maximum outlier. */ - public Number getMaxOutlier(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getMaxOutlier(@NonNegative int row, @NonNegative int column); /** * Returns the maximum outlier (non-farout) for an item. @@ -225,7 +225,7 @@ public interface BoxAndWhiskerCategoryDataset extends CategoryDataset { * * @return A list of outliers for an item. */ - public List getOutliers(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public List getOutliers(@NonNegative int row, @NonNegative int column); /** * Returns a list of outlier values for an item. The list may be empty, diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java index bc2baff89..3d2283f71 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java @@ -51,11 +51,11 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.List; @@ -78,7 +78,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The mean for the specified series and item. */ - public Number getMeanValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getMeanValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the median-value for the specified series and item. @@ -88,7 +88,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The median-value for the specified series and item. */ - public Number getMedianValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getMedianValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the Q1 median-value for the specified series and item. @@ -98,7 +98,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The Q1 median-value for the specified series and item. */ - public Number getQ1Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getQ1Value(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the Q3 median-value for the specified series and item. @@ -108,7 +108,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The Q3 median-value for the specified series and item. */ - public Number getQ3Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getQ3Value(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the min-value for the specified series and item. @@ -118,7 +118,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The min-value for the specified series and item. */ - public Number getMinRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getMinRegularValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the max-value for the specified series and item. @@ -128,7 +128,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return The max-value for the specified series and item. */ - public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getMaxRegularValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the minimum value which is not a farout. @@ -137,7 +137,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return A {@code Number} representing the maximum non-farout value. */ - public Number getMinOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getMinOutlier(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the maximum value which is not a farout, ie Q3 + (interquartile @@ -148,7 +148,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * * @return A {@code Number} representing the maximum non-farout value. */ - public Number getMaxOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getMaxOutlier(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns a list of outliers for the specified series and item. @@ -159,7 +159,7 @@ public interface BoxAndWhiskerXYDataset extends XYDataset { * @return The list of outliers for the specified series and item * (possibly {@code null}). */ - public List getOutliers(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public List getOutliers(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the value used as the outlier coefficient. The outlier diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java index 7aacae8c1..671bf90b0 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java @@ -55,8 +55,8 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; import java.util.List; import org.jfree.chart.util.ObjectUtils; @@ -82,23 +82,23 @@ public class DefaultBoxAndWhiskerCategoryDataset extends AbstractDataset private double minimumRangeValue; /** The row index for the cell that the minimum range value comes from. */ - private /*@GTENegativeOne*/ int minimumRangeValueRow; + private @GTENegativeOne int minimumRangeValueRow; /** * The column index for the cell that the minimum range value comes from. */ - private /*@GTENegativeOne*/ int minimumRangeValueColumn; + private @GTENegativeOne int minimumRangeValueColumn; /** The maximum range value. */ private double maximumRangeValue; /** The row index for the cell that the maximum range value comes from. */ - private /*@GTENegativeOne*/ int maximumRangeValueRow; + private @GTENegativeOne int maximumRangeValueRow; /** * The column index for the cell that the maximum range value comes from. */ - private /*@GTENegativeOne*/ int maximumRangeValueColumn; + private @GTENegativeOne int maximumRangeValueColumn; /** * Creates a new dataset. @@ -229,7 +229,7 @@ public void remove(Comparable rowKey, Comparable columnKey) { * * @since 1.0.7 */ - public void removeRow(/*@NonNegative*/ int rowIndex) { + public void removeRow(@NonNegative int rowIndex) { this.data.removeRow(rowIndex); updateBounds(); fireDatasetChanged(); @@ -261,7 +261,7 @@ public void removeRow(Comparable rowKey) { * * @since 1.0.7 */ - public void removeColumn(/*@NonNegative*/ int columnIndex) { + public void removeColumn(@NonNegative int columnIndex) { this.data.removeColumn(columnIndex); updateBounds(); fireDatasetChanged(); @@ -303,7 +303,7 @@ public void clear() { * * @return The item. */ - public BoxAndWhiskerItem getItem(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public BoxAndWhiskerItem getItem(@NonNegative int row, @NonNegative int column) { return (BoxAndWhiskerItem) this.data.getObject(row, column); } @@ -319,8 +319,8 @@ public BoxAndWhiskerItem getItem(/*@NonNegative*/ int row, /*@NonNegative*/ int * @see #getValue(Comparable, Comparable) */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { return getMedianValue(row, column); } @@ -351,7 +351,7 @@ public Number getValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getMeanValue(@NonNegative int row, @NonNegative int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject(row, @@ -395,7 +395,7 @@ public Number getMeanValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMedianValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getMedianValue(@NonNegative int row, @NonNegative int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject(row, column); @@ -437,7 +437,7 @@ public Number getMedianValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getQ1Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getQ1Value(@NonNegative int row, @NonNegative int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -479,7 +479,7 @@ public Number getQ1Value(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getQ3Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getQ3Value(@NonNegative int row, @NonNegative int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -520,7 +520,7 @@ public Number getQ3Value(Comparable rowKey, Comparable columnKey) { * @see #getColumnKey(int) */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { return this.data.getColumnIndex(key); } @@ -534,7 +534,7 @@ public Number getQ3Value(Comparable rowKey, Comparable columnKey) { * @see #getColumnIndex(Comparable) */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return this.data.getColumnKey(column); } @@ -560,7 +560,7 @@ public List getColumnKeys() { * @see #getRowKey(int) */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -575,7 +575,7 @@ public List getColumnKeys() { * @see #getRowIndex(Comparable) */ @Override - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return this.data.getRowKey(row); } @@ -599,7 +599,7 @@ public List getRowKeys() { * @see #getColumnCount() */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.data.getRowCount(); } @@ -611,8 +611,8 @@ public List getRowKeys() { * @see #getRowCount() */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { return this.data.getColumnCount(); } @@ -670,7 +670,7 @@ public Range getRangeBounds(boolean includeInterval) { * @see #getItem(int, int) */ @Override - public Number getMinRegularValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getMinRegularValue(@NonNegative int row, @NonNegative int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -712,7 +712,7 @@ public Number getMinRegularValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMaxRegularValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getMaxRegularValue(@NonNegative int row, @NonNegative int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -754,7 +754,7 @@ public Number getMaxRegularValue(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMinOutlier(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getMinOutlier(@NonNegative int row, @NonNegative int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -796,7 +796,7 @@ public Number getMinOutlier(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public Number getMaxOutlier(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getMaxOutlier(@NonNegative int row, @NonNegative int column) { Number result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); @@ -838,7 +838,7 @@ public Number getMaxOutlier(Comparable rowKey, Comparable columnKey) { * @see #getItem(int, int) */ @Override - public List getOutliers(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public List getOutliers(@NonNegative int row, @NonNegative int column) { List result = null; BoxAndWhiskerItem item = (BoxAndWhiskerItem) this.data.getObject( row, column); diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index 29121088e..6453633fd 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -59,11 +59,11 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.ArrayList; import java.util.Date; @@ -205,7 +205,7 @@ public void setFaroutCoefficient(double faroutCoefficient) { * @return The number of series. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return 1; } @@ -218,7 +218,7 @@ public void setFaroutCoefficient(double faroutCoefficient) { */ @Override @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.dates.size(); } @@ -276,7 +276,7 @@ public Comparable getSeriesKey(int i) { * * @return The item. */ - public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public BoxAndWhiskerItem getItem(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return (BoxAndWhiskerItem) this.items.get(item); } @@ -292,7 +292,7 @@ public BoxAndWhiskerItem getItem(/*@NonNegative*/ int series, /*@IndexFor("this. * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Long(((Date) this.dates.get(item)).getTime()); } @@ -306,7 +306,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * * @return The x-value as a Date. */ - public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Date getXDate(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return (Date) this.dates.get(item); } @@ -322,7 +322,7 @@ public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1 * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getMeanValue(series, item); } @@ -335,7 +335,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The mean for the specified series and item. */ @Override - public Number getMeanValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getMeanValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -353,7 +353,7 @@ public Number getMeanValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The median-value for the specified series and item. */ @Override - public Number getMedianValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getMedianValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -371,7 +371,7 @@ public Number getMedianValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The Q1 median-value for the specified series and item. */ @Override - public Number getQ1Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getQ1Value(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -389,7 +389,7 @@ public Number getQ1Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSerie * @return The Q3 median-value for the specified series and item. */ @Override - public Number getQ3Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getQ3Value(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -407,7 +407,7 @@ public Number getQ3Value(/*@NonNegative*/ int series, /*@IndexFor("this.getSerie * @return The min-value for the specified series and item. */ @Override - public Number getMinRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getMinRegularValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -425,7 +425,7 @@ public Number getMinRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this. * @return The max-value for the specified series and item. */ @Override - public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getMaxRegularValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -442,7 +442,7 @@ public Number getMaxRegularValue(/*@NonNegative*/ int series, /*@IndexFor("this. * @return A {@code Number} representing the maximum non-farout value. */ @Override - public Number getMinOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getMinOutlier(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -461,7 +461,7 @@ public Number getMinOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSe * @return A {@code Number} representing the maximum non-farout value. */ @Override - public Number getMaxOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getMaxOutlier(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { @@ -480,7 +480,7 @@ public Number getMaxOutlier(/*@NonNegative*/ int series, /*@IndexFor("this.getSe * (possibly {@code null}). */ @Override - public List getOutliers(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public List getOutliers(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { List result = null; BoxAndWhiskerItem stats = (BoxAndWhiskerItem) this.items.get(item); if (stats != null) { diff --git a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java index 053a8fc7e..00cba5815 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java @@ -41,8 +41,8 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; import java.util.ArrayList; import java.util.Collections; @@ -165,7 +165,7 @@ else if (minval < this.minimumRangeValue.doubleValue()) { * @return The list of values. */ @Override - public List getValues(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public List getValues(@NonNegative int row, @NonNegative int column) { List values = (List) this.data.getObject(row, column); if (values != null) { return Collections.unmodifiableList(values); @@ -228,8 +228,8 @@ public Number getValue(Comparable row, Comparable column) { * @return The average value. */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { List l = (List) this.data.getObject(row, column); double average = 0.0d; int count = 0; @@ -257,7 +257,7 @@ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { * @return The column index. */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { return this.data.getColumnIndex(key); } @@ -269,7 +269,7 @@ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { * @return The column key. */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return this.data.getColumnKey(column); } @@ -291,7 +291,7 @@ public List getColumnKeys() { * @return The row index. */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { return this.data.getRowIndex(key); } @@ -303,7 +303,7 @@ public List getColumnKeys() { * @return The row key. */ @Override - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return this.data.getRowKey(row); } @@ -323,7 +323,7 @@ public List getRowKeys() { * @return The row count. */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.data.getRowCount(); } @@ -333,8 +333,8 @@ public List getRowKeys() { * @return The column count. */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { return this.data.getColumnCount(); } diff --git a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java index 64171c602..0dc7aa31b 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java @@ -56,9 +56,9 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.util.List; import org.jfree.chart.util.PublicCloneable; @@ -155,7 +155,7 @@ public DefaultStatisticalCategoryDataset() { * @return The mean value (possibly {@code null}). */ @Override - public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getMeanValue(@NonNegative int row, @NonNegative int column) { Number result = null; MeanAndStandardDeviation masd = (MeanAndStandardDeviation) this.data.getObject(row, column); @@ -175,8 +175,8 @@ public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column * @return The value (possibly {@code null}). */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { return getMeanValue(row, column); } @@ -222,7 +222,7 @@ public Number getMeanValue(Comparable rowKey, Comparable columnKey) { * @return The standard deviation (possibly {@code null}). */ @Override - public Number getStdDevValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getStdDevValue(@NonNegative int row, @NonNegative int column) { Number result = null; MeanAndStandardDeviation masd = (MeanAndStandardDeviation) this.data.getObject(row, column); @@ -259,7 +259,7 @@ public Number getStdDevValue(Comparable rowKey, Comparable columnKey) { * @return The column index. */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { // defer null argument check return this.data.getColumnIndex(key); } @@ -272,7 +272,7 @@ public Number getStdDevValue(Comparable rowKey, Comparable columnKey) { * @return The column key. */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return this.data.getColumnKey(column); } @@ -294,7 +294,7 @@ public List getColumnKeys() { * @return The row index. */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -307,7 +307,7 @@ public List getColumnKeys() { * @return The row key. */ @Override - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return this.data.getRowKey(row); } @@ -329,7 +329,7 @@ public List getRowKeys() { * @see #getColumnCount() */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.data.getRowCount(); } @@ -341,8 +341,8 @@ public List getRowKeys() { * @see #getRowCount() */ @Override - /*@Pure*/ - public /*@NonNegative*/ int getColumnCount() { + @Pure + public @NonNegative int getColumnCount() { return this.data.getColumnCount(); } @@ -483,7 +483,7 @@ public void remove(Comparable rowKey, Comparable columnKey) { * * @since 1.0.7 */ - public void removeRow(/*@NonNegative*/ int rowIndex) { + public void removeRow(@NonNegative int rowIndex) { this.data.removeRow(rowIndex); updateBounds(); fireDatasetChanged(); @@ -515,7 +515,7 @@ public void removeRow(Comparable rowKey) { * * @since 1.0.7 */ - public void removeColumn(/*@NonNegative*/ int columnIndex) { + public void removeColumn(@NonNegative int columnIndex) { this.data.removeColumn(columnIndex); updateBounds(); fireDatasetChanged(); diff --git a/src/main/java/org/jfree/data/statistics/HistogramBin.java b/src/main/java/org/jfree/data/statistics/HistogramBin.java index 1ff13d582..779820da4 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramBin.java +++ b/src/main/java/org/jfree/data/statistics/HistogramBin.java @@ -43,7 +43,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; @@ -56,7 +56,7 @@ public class HistogramBin implements Cloneable, Serializable { private static final long serialVersionUID = 7614685080015589931L; /** The number of items in the bin. */ - private /*@NonNegative*/ int count; + private @NonNegative int count; /** The start boundary. */ private double startBoundary; @@ -85,7 +85,7 @@ public HistogramBin(double startBoundary, double endBoundary) { * * @return The item count. */ - public /*@NonNegative*/ int getCount() { + public @NonNegative int getCount() { return this.count; } diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index 6522b4b35..cee3936b1 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -61,13 +61,13 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.ArrayList; @@ -138,7 +138,7 @@ public void setType(HistogramType type) { * @param values the values ({@code null} not permitted). * @param bins the number of bins (must be at least 1). */ - public void addSeries(Comparable key, double /*@MinLen(1)*/ [] values, /*@Positive*/ int bins) { + public void addSeries(Comparable key, double @MinLen(1) [] values, @Positive int bins) { // defer argument checking... double minimum = getMinimum(values); double maximum = getMaximum(values); @@ -157,7 +157,7 @@ public void addSeries(Comparable key, double /*@MinLen(1)*/ [] values, /*@Positi * @param minimum the lower bound of the bin range. * @param maximum the upper bound of the bin range. */ - public void addSeries(Comparable key, double[] values, /*@Positive*/ int bins, + public void addSeries(Comparable key, double[] values, @Positive int bins, double minimum, double maximum) { Args.nullNotPermitted(key, "key"); @@ -224,7 +224,7 @@ public void addSeries(Comparable key, double[] values, /*@Positive*/ int bins, * * @return The minimum value. */ - private double getMinimum(double /*@MinLen(1)*/ [] values) { + private double getMinimum(double @MinLen(1) [] values) { if (values == null || values.length < 1) { throw new IllegalArgumentException( "Null or zero length 'values' argument."); @@ -246,7 +246,7 @@ private double getMinimum(double /*@MinLen(1)*/ [] values) { * * @return The maximum value. */ - private double getMaximum(double /*@MinLen(1)*/ [] values) { + private double getMaximum(double @MinLen(1) [] values) { if (values == null || values.length < 1) { throw new IllegalArgumentException( "Null or zero length 'values' argument."); @@ -271,7 +271,7 @@ private double getMaximum(double /*@MinLen(1)*/ [] values) { * @throws IndexOutOfBoundsException if {@code series} is outside the * specified range. */ - List getBins(/*@NonNegative*/ int series) { + List getBins(@NonNegative int series) { Map map = (Map) this.list.get(series); return (List) map.get("bins"); } @@ -283,7 +283,7 @@ List getBins(/*@NonNegative*/ int series) { * * @return The total. */ - private int getTotal(/*@NonNegative*/ int series) { + private int getTotal(@NonNegative int series) { Map map = (Map) this.list.get(series); return ((Integer) map.get("values.length")).intValue(); } @@ -295,7 +295,7 @@ private int getTotal(/*@NonNegative*/ int series) { * * @return The bin width. */ - private double getBinWidth(/*@NonNegative*/ int series) { + private double getBinWidth(@NonNegative int series) { Map map = (Map) this.list.get(series); return ((Double) map.get("bin width")).doubleValue(); } @@ -306,7 +306,7 @@ private double getBinWidth(/*@NonNegative*/ int series) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.list.size(); } @@ -322,7 +322,7 @@ private double getBinWidth(/*@NonNegative*/ int series) { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { Map map = (Map) this.list.get(series); return (Comparable) map.get("key"); } @@ -340,7 +340,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return getBins(series).size(); } @@ -360,7 +360,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); double x = (bin.getStartBoundary() + bin.getEndBoundary()) / 2.; @@ -381,7 +381,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * specified range. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); double total = getTotal(series); @@ -414,7 +414,7 @@ else if (this.type == HistogramType.SCALE_AREA_TO_1) { * specified range. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); return new Double(bin.getStartBoundary()); @@ -433,7 +433,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * specified range. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { List bins = getBins(series); HistogramBin bin = (HistogramBin) bins.get(item); return new Double(bin.getEndBoundary()); @@ -454,7 +454,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * specified range. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -473,7 +473,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * specified range. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java index aa7dbb4d6..82565cb88 100644 --- a/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java @@ -39,7 +39,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import java.util.List; @@ -61,7 +61,7 @@ public interface MultiValueCategoryDataset extends CategoryDataset { * * @return The list of values. */ - public List getValues(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public List getValues(@NonNegative int row, @NonNegative int column); /** * Returns a list (possibly empty) of the values for the specified item. diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index 9e94885bb..e22ad9b12 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -45,13 +45,13 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.chart.util.Args; import org.jfree.data.xy.XYDataset; @@ -70,7 +70,7 @@ public abstract class Regression { * * @return The parameters. */ - public static double /*@ArrayLen(2)*/ [] getOLSRegression(double /*@MinLen(2)*/ [] /*@MinLen(2)*/ [] data) { + public static double @ArrayLen(2) [] getOLSRegression(double /*@MinLen(2)*/ [] @MinLen(2) [] data) { int n = data.length; if (n < 2) { @@ -114,7 +114,7 @@ public abstract class Regression { * * @return The parameters. */ - public static double /*@ArrayLen(2)*/ [] getOLSRegression(XYDataset data, /*@NonNegative*/ int series) { + public static double @ArrayLen(2) [] getOLSRegression(XYDataset data, @NonNegative int series) { int n = data.getItemCount(series); if (n < 2) { @@ -157,7 +157,7 @@ public abstract class Regression { * * @return The parameters. */ - public static double /*@ArrayLen(2)*/ [] getPowerRegression(double /*@MinLen(2)*/ [] /*@MinLen(2)*/ [] data) { + public static double @ArrayLen(2) [] getPowerRegression(double /*@MinLen(2)*/ [] @MinLen(2) [] data) { int n = data.length; if (n < 2) { @@ -201,7 +201,7 @@ public abstract class Regression { * * @return The parameters. */ - public static double /*@ArrayLen(2)*/ [] getPowerRegression(XYDataset data, /*@NonNegative*/ int series) { + public static double @ArrayLen(2) [] getPowerRegression(XYDataset data, @NonNegative int series) { int n = data.getItemCount(series); if (n < 2) { @@ -255,7 +255,7 @@ public abstract class Regression { * @since 1.0.14 */ public static double[] getPolynomialRegression(XYDataset dataset, - /*@NonNegative*/ int series, /*@Positive*/ int order) { + @NonNegative int series, @Positive int order) { Args.nullNotPermitted(dataset, "dataset"); int itemCount = dataset.getItemCount(series); if (itemCount < order + 1) { @@ -263,7 +263,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, } double[][] data = new double[2][itemCount]; @SuppressWarnings("index") // validItems will only be used as a index if there is at least one item - /*@LTLengthOf(value={"data[0]","data[1]"}, offset={"0","0"})*/ /*@NonNegative*/ int validItems = 0; + @LTLengthOf(value={"data[0]","data[1]"}, offset={"0","0"}) @NonNegative int validItems = 0; for(int item = 0; item < itemCount; item++){ double x = dataset.getXValue(series, item); double y = dataset.getYValue(series, item); @@ -271,17 +271,17 @@ public static double[] getPolynomialRegression(XYDataset dataset, data[0][validItems] = x; data[1][validItems] = y; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/219: validItems is incremented at most as often as item, which is a valid index - /*@LTLengthOf(value={"data[0]","data[1]"}, offset={"0","0"})*/ /*@NonNegative*/ int validItemsTmp = validItems + 1; + @LTLengthOf(value={"data[0]","data[1]"}, offset={"0","0"}) @NonNegative int validItemsTmp = validItems + 1; validItems = validItemsTmp; } } if (validItems < order + 1) { throw new IllegalArgumentException("Not enough data."); } - /*@Positive*/ int equations = order + 1; - /*@Positive*/ int coefficients = order + 2; + @Positive int equations = order + 1; + @Positive int coefficients = order + 2; double[] result = new double[equations + 1]; - double[] /*@MinLen(1)*/ [] matrix = new double[equations][coefficients]; + double[] @MinLen(1) [] matrix = new double[equations][coefficients]; double sumX = 0.0; double sumY = 0.0; @@ -293,7 +293,7 @@ public static double[] getPolynomialRegression(XYDataset dataset, matrix[eq][coe] += Math.pow(data[0][item],eq + coe); } @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: coefficients is positive, and matrix's subarrays are all exactly `coefficients` long - /*@IndexFor("matrix[eq]")*/ int coe1 = coefficients - 1; + @IndexFor("matrix[eq]") int coe1 = coefficients - 1; matrix[eq][coe1] += data[1][item] * Math.pow(data[0][item],eq); } @@ -344,9 +344,9 @@ public static double[] getPolynomialRegression(XYDataset dataset, * * @return The new matrix. */ - private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] matrix){ - /*@Positive*/ int equations = matrix.length; - /*@Positive*/ int coefficients = matrix[0].length; + private static double[][] calculateSubMatrix(double @MinLen(1) [] @MinLen(1) [] matrix){ + @Positive int equations = matrix.length; + @Positive int coefficients = matrix[0].length; double[][] result = new double[equations - 1][coefficients - 1]; for (int eq = 1; eq < equations; eq++) { double factor = matrix[0][0] / matrix[eq][0]; @@ -354,7 +354,7 @@ private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen( for (int coe = 1; coe < matrix[eq].length && coe < matrix[0].length; coe++) { int resultEq = eq - 1; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/202: result is one smaller in both dimensions than matrix, and coe is an index for matrix. Also note the use of a temporary here: the Index Checker's java expression parser chokes on "result[eq - 1]" - /*@IndexFor("result[resultEq]")*/ int resultCoe = coe -1; + @IndexFor("result[resultEq]") int resultCoe = coe -1; result[resultEq][resultCoe] = matrix[0][coe] - matrix[eq][coe] * factor; } @@ -363,7 +363,7 @@ private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen( return result; } @SuppressWarnings({"value", "index"}) // https://github.com/kelloggm/checker-framework/issues/158: equations != 1 -> equations >= 2 -> result is minlen(1) - double /*@MinLen(1)*/ [] /*@MinLen(1)*/ [] result1 = result; + double @MinLen(1) [] @MinLen(1) [] result1 = result; // check for zero pivot element if (result1[0][0] == 0) { @@ -373,11 +373,11 @@ private static double[][] calculateSubMatrix(double /*@MinLen(1)*/ [] /*@MinLen( found = true; double[] temp = result1[0]; @SuppressWarnings("index") // result1 is a rectangular array - /*@IndexOrHigh({"result1[i]", "result1[0]"})*/ int result1ILength = result1[i].length; + @IndexOrHigh({"result1[i]", "result1[0]"}) int result1ILength = result1[i].length; System.arraycopy(result1[i], 0, result1[0], 0, result1ILength); @SuppressWarnings("index") // result1 is a rectangular array - /*@IndexOrHigh({"result1[i]", "temp", "result1[0]"})*/ int tempLen = temp.length; + @IndexOrHigh({"result1[i]", "temp", "result1[0]"}) int tempLen = temp.length; System.arraycopy(temp, 0, result1[i], 0, tempLen); break; } diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java index ef7d140d6..c1a320ca5 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java @@ -39,7 +39,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; @@ -72,7 +72,7 @@ public class SimpleHistogramBin implements Comparable, private boolean includeUpperBound; /** The item count. */ - private /*@NonNegative*/ int itemCount; + private @NonNegative int itemCount; /** * Creates a new bin. @@ -128,7 +128,7 @@ public double getUpperBound() { * * @return The item count. */ - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.itemCount; } @@ -137,7 +137,7 @@ public double getUpperBound() { * * @param count the item count. */ - public void setItemCount(/*@NonNegative*/ int count) { + public void setItemCount(@NonNegative int count) { this.itemCount = count; } diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index 5bfa3c5f7..22198b996 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -42,11 +42,11 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.ArrayList; @@ -131,7 +131,7 @@ public void setAdjustForBinSize(boolean adjust) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return 1; } @@ -144,7 +144,7 @@ public void setAdjustForBinSize(boolean adjust) { * @return The key for the series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { return this.key; } @@ -168,7 +168,7 @@ public DomainOrder getDomainOrder() { */ @Override @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.bins.size(); } @@ -288,7 +288,7 @@ public void removeAllBins() { * @return The x-value (never {@code null}). */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getXValue(series, item)); } @@ -301,7 +301,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return (bin.getLowerBound() + bin.getUpperBound()) / 2.0; } @@ -315,7 +315,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The y-value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getYValue(series, item)); } @@ -330,7 +330,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getAdjustForBinSize() */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); if (this.adjustForBinSize) { return bin.getItemCount() @@ -350,7 +350,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getStartXValue(series, item)); } @@ -364,7 +364,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The start x-value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return bin.getLowerBound(); } @@ -378,7 +378,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getEndXValue(series, item)); } @@ -392,7 +392,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The end x-value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { SimpleHistogramBin bin = (SimpleHistogramBin) this.bins.get(item); return bin.getUpperBound(); } @@ -406,7 +406,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -420,7 +420,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The start y-value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getYValue(series, item); } @@ -433,7 +433,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -447,7 +447,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The end y-value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getYValue(series, item); } diff --git a/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java b/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java index 5148efe07..3f2cc7fb3 100644 --- a/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java @@ -44,7 +44,7 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.CategoryDataset; @@ -62,7 +62,7 @@ public interface StatisticalCategoryDataset extends CategoryDataset { * * @return The mean value (possibly {@code null}). */ - public Number getMeanValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getMeanValue(@NonNegative int row, @NonNegative int column); /** * Returns the mean value for an item. @@ -82,7 +82,7 @@ public interface StatisticalCategoryDataset extends CategoryDataset { * * @return The standard deviation (possibly {@code null}). */ - public Number getStdDevValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column); + public Number getStdDevValue(@NonNegative int row, @NonNegative int column); /** * Returns the standard deviation value for an item. diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index 72a3b1356..a535453fa 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -48,9 +48,9 @@ */ package org.jfree.data.statistics; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; import java.util.ArrayList; import java.util.Collection; @@ -244,7 +244,7 @@ public static double calculateMedian(List values, boolean copyAndSort) { * * @return The median. */ - public static double calculateMedian(List values, /*@NonNegative*/ /*@LessThan("#3 + 1")*/ int start, /*@NonNegative*/ int end) { + public static double calculateMedian(List values, @NonNegative @LessThan("#3 + 1") int start, @NonNegative int end) { return calculateMedian(values, start, end, true); } @@ -261,7 +261,7 @@ public static double calculateMedian(List values, /*@NonNegative*/ /*@LessThan( * * @return The median. */ - public static double calculateMedian(List values, /*@NonNegative*/ /*@LessThan("#3 + 1")*/ int start, /*@NonNegative*/ int end, + public static double calculateMedian(List values, @NonNegative @LessThan("#3 + 1") int start, @NonNegative int end, boolean copyAndSort) { double result = Double.NaN; @@ -308,7 +308,7 @@ public static double calculateMedian(List values, /*@NonNegative*/ /*@LessThan(" * * @return The standard deviation of a set of numbers. */ - public static double getStdDev(Number /*@MinLen(1)*/ [] data) { + public static double getStdDev(Number @MinLen(1) [] data) { Args.nullNotPermitted(data, "data"); if (data.length == 0) { throw new IllegalArgumentException("Zero length 'data' array."); @@ -332,7 +332,7 @@ public static double getStdDev(Number /*@MinLen(1)*/ [] data) { * * @return A double array with the intercept in [0] and the slope in [1]. */ - public static double /*@ArrayLen(2)*/ [] getLinearFit(Number /*@SameLen("#2")*/ [] xData, Number /*@SameLen("#1")*/ [] yData) { + public static double @ArrayLen(2) [] getLinearFit(Number /*@SameLen("#2")*/ [] xData, Number @SameLen("#1") [] yData) { Args.nullNotPermitted(xData, "xData"); Args.nullNotPermitted(yData, "yData"); @@ -359,7 +359,7 @@ public static double getStdDev(Number /*@MinLen(1)*/ [] data) { * * @return The slope. */ - public static double getSlope(Number /*@SameLen("#2")*/ [] xData, Number /*@SameLen("#1")*/ [] yData) { + public static double getSlope(Number @SameLen("#2") [] xData, Number @SameLen("#1") [] yData) { Args.nullNotPermitted(xData, "xData"); Args.nullNotPermitted(yData, "yData"); if (xData.length != yData.length) { @@ -401,7 +401,7 @@ public static double getSlope(Number /*@SameLen("#2")*/ [] xData, Number /*@Same * * @return The correlation. */ - public static double getCorrelation(Number /*@SameLen("#2")*/ [] data1, Number /*@SameLen("#1")*/ [] data2) { + public static double getCorrelation(Number @SameLen("#2") [] data1, Number @SameLen("#1") [] data2) { Args.nullNotPermitted(data1, "data1"); Args.nullNotPermitted(data2, "data2"); if (data1.length != data2.length) { @@ -444,8 +444,8 @@ public static double getCorrelation(Number /*@SameLen("#2")*/ [] data1, Number / * @return A double[][] the length of the data set in the first dimension, * with two doubles for x and y in the second dimension */ - public static double[] /*@ArrayLen(2)*/ [] getMovingAverage(Number /*@SameLen("#2")*/ [] xData, Number /*@SameLen("#1")*/ [] yData, - /*@IndexFor("#1")*/ int period) { + public static double[] @ArrayLen(2) [] getMovingAverage(Number /*@SameLen("#2")*/ [] xData, Number @SameLen("#1") [] yData, + @IndexFor("#1") int period) { // check arguments... if (xData.length != yData.length) { @@ -457,17 +457,17 @@ public static double getCorrelation(Number /*@SameLen("#2")*/ [] data1, Number / "Period can't be longer than dataset."); } - /*@NonNegative*/ int resultLen = xData.length - period; - double[] /*@ArrayLen(2)*/ [] result = new double[resultLen][2]; + @NonNegative int resultLen = xData.length - period; + double[] @ArrayLen(2) [] result = new double[resultLen][2]; for (int i = 0; i < result.length; i++) { @SuppressWarnings("index") // result's length is exactly xData.length - period, so adding period to an index for result is always an index for xData - /*@IndexFor("xData")*/ int iPeriod = i + period; + @IndexFor("xData") int iPeriod = i + period; result[i][0] = xData[iPeriod].doubleValue(); // holds the moving average sum double sum = 0.0; for (int j = 0; j < period; j++) { @SuppressWarnings("index") // result's length is exactly yData.length - period, so adding a nonnegative value less than period to an index for result is always an index for yData - /*@IndexFor("yData")*/ int ij = i + j; + @IndexFor("yData") int ij = i + j; sum += yData[ij].doubleValue(); } sum = sum / period; diff --git a/src/main/java/org/jfree/data/time/Day.java b/src/main/java/org/jfree/data/time/Day.java index 7ba4ea5a0..6084f8d40 100644 --- a/src/main/java/org/jfree/data/time/Day.java +++ b/src/main/java/org/jfree/data/time/Day.java @@ -64,8 +64,8 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; import java.text.DateFormat; @@ -128,7 +128,7 @@ public Day() { * @param month the month (1 to 12). * @param year the year (1900 <= year <= 9999). */ - public Day(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { + public Day(@IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1900, to = 9999) int year) { this.serialDate = SerialDate.createInstance(day, month, year); peg(Calendar.getInstance()); } @@ -197,7 +197,7 @@ public SerialDate getSerialDate() { * * @return The year. */ - public /*@IntRange(from=1900, to=9999)*/ int getYear() { + public @IntRange(from=1900, to=9999) int getYear() { return this.serialDate.getYYYY(); } @@ -206,7 +206,7 @@ public SerialDate getSerialDate() { * * @return The month. */ - public /*@IntRange(from=1, to=12)*/ int getMonth() { + public @IntRange(from=1, to=12) int getMonth() { return this.serialDate.getMonth(); } @@ -215,7 +215,7 @@ public SerialDate getSerialDate() { * * @return The day of the month. */ - public /*@IntRange(from = 1, to = 31)*/ int getDayOfMonth() { + public @IntRange(from = 1, to = 31) int getDayOfMonth() { return this.serialDate.getDayOfMonth(); } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 594713bae..3d26868d8 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -61,13 +61,13 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.Calendar; import java.util.TimeZone; @@ -111,22 +111,22 @@ public class DynamicTimeSeriesCollection extends AbstractIntervalXYDataset public static final int END = 2; /** The maximum number of items for each series (can be overridden). */ - private /*@NonNegative*/ int maximumItemCount = 2000; // an arbitrary safe default value + private @NonNegative int maximumItemCount = 2000; // an arbitrary safe default value /** The history count. */ - protected /*@LTEqLengthOf("this.pointsInTime")*/ /*@Positive*/ int historyCount; + protected @LTEqLengthOf("this.pointsInTime") @Positive int historyCount; /** Storage for the series keys. */ - private Comparable /*@SameLen("this.valueHistory")*/ [] seriesKeys; + private Comparable @SameLen("this.valueHistory") [] seriesKeys; /** The time period class - barely used, and could be removed (DG). */ private Class timePeriodClass = Minute.class; // default value; /** Storage for the x-values. */ - protected RegularTimePeriod /*@MinLen(1)*/ [] pointsInTime; + protected RegularTimePeriod @MinLen(1) [] pointsInTime; /** The number of series. */ - private /*@NonNegative*/ int seriesCount; + private @NonNegative int seriesCount; /** * A wrapper for a fixed array of float values. @@ -134,7 +134,7 @@ public class DynamicTimeSeriesCollection extends AbstractIntervalXYDataset protected class ValueSequence { /** Storage for the float values. */ - float /*@SameLen("this")*/ [] dataPoints; + float @SameLen("this") [] dataPoints; /** * Default constructor: @@ -148,9 +148,9 @@ public ValueSequence() { * * @param length the length. */ - public ValueSequence(/*@NonNegative*/ int length) { + public ValueSequence(@NonNegative int length) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 - float /*@SameLen("this")*/ [] dataPointsTmp = new float[length]; + float @SameLen("this") [] dataPointsTmp = new float[length]; this.dataPoints = dataPointsTmp; for (int i = 0; i < length; i++) { this.dataPoints[i] = 0.0f; @@ -163,7 +163,7 @@ public ValueSequence(/*@NonNegative*/ int length) { * @param index the index. * @param value the value. */ - public void enterData(/*@IndexFor("this")*/ int index, float value) { + public void enterData(@IndexFor("this") int index, float value) { this.dataPoints[index] = value; } @@ -174,13 +174,13 @@ public void enterData(/*@IndexFor("this")*/ int index, float value) { * * @return The value. */ - public float getData(/*@IndexFor("this")*/ int index) { + public float getData(@IndexFor("this") int index) { return this.dataPoints[index]; } } /** An array for storing the objects that represent each series. */ - protected /*@SameLen("this.pointsInTime")*/ ValueSequence /*@SameLen("this.seriesKeys")*/ [] valueHistory; + protected @SameLen("this.pointsInTime") ValueSequence @SameLen("this.seriesKeys") [] valueHistory; /** A working calendar (to recycle) */ protected Calendar workingCalendar; @@ -199,10 +199,10 @@ public float getData(/*@IndexFor("this")*/ int index) { private boolean domainIsPointsInTime; /** index for mapping: points to the oldest valid time and data. */ - private /*@IndexFor("this.pointsInTime")*/ int oldestAt; // as a class variable, initializes == 0 + private @IndexFor("this.pointsInTime") int oldestAt; // as a class variable, initializes == 0 /** Index of the newest data item. */ - private /*@IndexFor("this.pointsInTime")*/ int newestAt; + private @IndexFor("this.pointsInTime") int newestAt; // cached values used for interface DomainInfo: @@ -237,10 +237,10 @@ public float getData(/*@IndexFor("this")*/ int index) { * @param nSeries the number of series to be accommodated. * @param nMoments the number of TimePeriods to be spanned. */ - public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments) { + public DynamicTimeSeriesCollection(@NonNegative int nSeries, @Positive int nMoments) { this(nSeries, nMoments, new Millisecond(), TimeZone.getDefault()); @SuppressWarnings("index") // nMoments is used later to populate the field this annotation refers to - /*@IndexFor("this.pointsInTime")*/ int newestAtTmp = nMoments - 1; + @IndexFor("this.pointsInTime") int newestAtTmp = nMoments - 1; this.newestAt = newestAtTmp; } @@ -251,11 +251,11 @@ public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ i * @param nMoments the number of TimePeriods to be spanned * @param zone the timezone. */ - public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments, + public DynamicTimeSeriesCollection(@NonNegative int nSeries, @Positive int nMoments, TimeZone zone) { this(nSeries, nMoments, new Millisecond(), zone); @SuppressWarnings("index") // nMoments is used later to populate the field this annotation refers to - /*@IndexFor("this.pointsInTime")*/ int newestAtTmp = nMoments - 1; + @IndexFor("this.pointsInTime") int newestAtTmp = nMoments - 1; this.newestAt = newestAtTmp; } @@ -266,7 +266,7 @@ public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ i * @param nMoments the number of items per series. * @param timeSample a time period sample. */ - public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments, + public DynamicTimeSeriesCollection(@NonNegative int nSeries, @Positive int nMoments, RegularTimePeriod timeSample) { this(nSeries, nMoments, timeSample, TimeZone.getDefault()); } @@ -280,7 +280,7 @@ public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ i * @param zone the time zone. */ @SuppressWarnings("index") // this constructor establishes the repr. invariants - public DynamicTimeSeriesCollection(/*@NonNegative*/ int nSeries, /*@Positive*/ int nMoments, + public DynamicTimeSeriesCollection(@NonNegative int nSeries, @Positive int nMoments, RegularTimePeriod timeSample, TimeZone zone) { // the first initialization must precede creation of the ValueSet array: @@ -390,7 +390,7 @@ public void setPosition(int position) { * Use this as-is during setup only, or add the synchronized keyword around * the copy loop. */ - public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, + public void addSeries(float[] values, @NonNegative int seriesNumber, Comparable seriesKey) { invalidateRangeInfo(); @@ -405,7 +405,7 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, } if (this.valueHistory[seriesNumber] == null) { @SuppressWarnings("index") // this.historyCount is the length of this.pointsInTime - /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); + @SameLen("this.pointsInTime") ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[seriesNumber] = valueSequence; this.seriesCount++; } @@ -414,12 +414,12 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, // Avoid IndexOutOfBoundsException: int srcLength = values.length; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: this.valueHistory[seriesNumber]'s length is <= this.historyCount - /*@LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"})*/ int copyLength = this.historyCount; + @LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"}) int copyLength = this.historyCount; boolean fillNeeded = false; if (srcLength < this.historyCount) { fillNeeded = true; @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: this.valueHistory[seriesNumber]'s length is <= this.historyCount - /*@LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"})*/ int newCopyLength = srcLength; + @LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"}) int newCopyLength = srcLength; copyLength = newCopyLength; } //{ @@ -430,7 +430,7 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, if (fillNeeded) { for (i = copyLength; i < this.historyCount; i++) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 - /*@LTLengthOf("this.valueHistory[seriesNumber]")*/ int i0 = i; + @LTLengthOf("this.valueHistory[seriesNumber]") int i0 = i; this.valueHistory[seriesNumber].enterData(i0, 0.0f); } } @@ -447,7 +447,7 @@ public void addSeries(float[] values, /*@NonNegative*/ int seriesNumber, * @param seriesNumber the series. * @param key the new key. */ - public void setSeriesKey(/*@IndexFor("this.seriesKeys")*/ int seriesNumber, Comparable key) { + public void setSeriesKey(@IndexFor("this.seriesKeys") int seriesNumber, Comparable key) { this.seriesKeys[seriesNumber] = key; } @@ -458,7 +458,7 @@ public void setSeriesKey(/*@IndexFor("this.seriesKeys")*/ int seriesNumber, Comp * @param index ??. * @param value the value. */ - public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSeries(#1)")*/ int index, float value) { + public void addValue(@NonNegative int seriesNumber, @IndexFor("this.getSeries(#1)") int index, float value) { invalidateRangeInfo(); if (seriesNumber >= this.valueHistory.length) { throw new IllegalArgumentException( @@ -468,7 +468,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer } if (this.valueHistory[seriesNumber] == null) { @SuppressWarnings("index") // this.historyCount is the length of this.pointsInTime - /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); + @SameLen("this.pointsInTime") ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[seriesNumber] = valueSequence; this.seriesCount++; } @@ -476,7 +476,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer //synchronized(this) //{ @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 - /*@LTLengthOf("this.valueHistory[seriesNumber]")*/ int index0 = index; + @LTLengthOf("this.valueHistory[seriesNumber]") int index0 = index; this.valueHistory[seriesNumber].enterData(index0, value); //} fireSeriesChanged(); @@ -489,7 +489,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer */ @Override @SuppressWarnings("index") - public /*@NonNegative*/ /*@LTEqLengthOf("this.valueHistory")*/ int getSeriesCount() { + public @NonNegative @LTEqLengthOf("this.valueHistory") int getSeriesCount() { return this.seriesCount; } @@ -504,7 +504,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209: I'd like to write SameLen on this.pointsInTime - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { // all arrays equal length, + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // all arrays equal length, // so ignore argument: return this.historyCount; } @@ -520,7 +520,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer * @return The translated index. */ @SuppressWarnings("index") // internal method that breaks abstraction boundaries - protected /*@IndexFor("this.pointsInTime")*/ int translateGet(/*@IndexFor("this.getSeries(#2)")*/ int toFetch, int series) { + protected @IndexFor("this.pointsInTime") int translateGet(@IndexFor("this.getSeries(#2)") int toFetch, int series) { if (this.oldestAt == 0) { return toFetch; // no translation needed } @@ -539,7 +539,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer * * @return The offset. */ - public /*@IndexFor("this.pointsInTime")*/ int offsetFromNewest(int delta) { + public @IndexFor("this.pointsInTime") int offsetFromNewest(int delta) { return wrapOffset(this.newestAt + delta); } @@ -550,7 +550,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer * * @return The offset. */ - public /*@IndexFor("this.pointsInTime")*/ int offsetFromOldest(int delta) { + public @IndexFor("this.pointsInTime") int offsetFromOldest(int delta) { return wrapOffset(this.oldestAt + delta); } @@ -562,7 +562,7 @@ public void addValue(/*@NonNegative*/ int seriesNumber, /*@IndexFor("this.getSer * @return The offset. */ @SuppressWarnings("index") // this method assumes that protoIndex will be within an absolute value of an actual index - protected /*@IndexFor("this.pointsInTime")*/ int wrapOffset(int protoIndex) { + protected @IndexFor("this.pointsInTime") int wrapOffset(int protoIndex) { int tmp = protoIndex; if (tmp >= this.historyCount) { tmp -= this.historyCount; @@ -596,7 +596,7 @@ public synchronized RegularTimePeriod advanceTime() { } for (int s = 0; s < getSeriesCount(); s++) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 - /*@LTLengthOf("this.valueHistory[s]")*/ int oldestAt = this.oldestAt; + @LTLengthOf("this.valueHistory[s]") int oldestAt = this.oldestAt; if (this.valueHistory[s].getData(oldestAt) == oldMax) { extremaChanged = true; } @@ -611,7 +611,7 @@ public synchronized RegularTimePeriod advanceTime() { float wiper = (float) 0.0; for (int s = 0; s < getSeriesCount(); s++) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 - /*@LTLengthOf("this.valueHistory[s]")*/ int newestAt = this.newestAt; + @LTLengthOf("this.valueHistory[s]") int newestAt = this.newestAt; this.valueHistory[s].enterData(newestAt, wiper); } // Update the array of TimePeriods: @@ -624,7 +624,7 @@ public synchronized RegularTimePeriod advanceTime() { newOldestAt = this.oldestAt + 1; } @SuppressWarnings("index") // the check right above ensures this doesn't go out of bounds - /*@IndexFor("this.pointsInTime")*/ int tmp = newOldestAt; + @IndexFor("this.pointsInTime") int tmp = newOldestAt; this.oldestAt = tmp; // Update the domain limits: long startL = this.domainStart.longValue(); //(time is kept in msec) @@ -656,7 +656,7 @@ protected double findMaxValue() { for (int s = 0; s < getSeriesCount(); s++) { for (int i = 0; i < this.historyCount; i++) { @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 - /*@LTLengthOf("this.getSeries(s)")*/ int i0 = i; + @LTLengthOf("this.getSeries(s)") int i0 = i; double tmp = getYValue(s, i0); if (tmp > max) { max = tmp; @@ -673,7 +673,7 @@ protected double findMaxValue() { * * @return The index. */ - public /*@IndexFor("this.pointsInTime")*/ int getOldestIndex() { + public @IndexFor("this.pointsInTime") int getOldestIndex() { return this.oldestAt; } @@ -682,7 +682,7 @@ protected double findMaxValue() { * * @return The index. */ - public /*@IndexFor("this.pointsInTime")*/ int getNewestIndex() { + public @IndexFor("this.pointsInTime") int getNewestIndex() { return this.newestAt; } @@ -705,11 +705,11 @@ public void appendData(float[] newData) { // create them: if (this.valueHistory[s] == null) { @SuppressWarnings("index") // this.historyCount is the length of this.pointsInTime - /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); + @SameLen("this.pointsInTime") ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 - /*@LTLengthOf("this.valueHistory[s]")*/ int newestAt = this.newestAt; + @LTLengthOf("this.valueHistory[s]") int newestAt = this.newestAt; this.valueHistory[s].enterData(newestAt, newData[s]); } fireSeriesChanged(); @@ -723,7 +723,7 @@ public void appendData(float[] newData) { * @param refresh value of n in "refresh the display on every nth call" * (ignored if <= 0 ) */ - public void appendData(float[] newData, final /*@IndexFor("this.pointsInTime")*/ int insertionIndex, int refresh) { + public void appendData(float[] newData, final @IndexFor("this.pointsInTime") int insertionIndex, int refresh) { int nDataPoints = newData.length; if (nDataPoints > this.valueHistory.length) { throw new IllegalArgumentException( @@ -732,11 +732,11 @@ public void appendData(float[] newData, final /*@IndexFor("this.pointsInTime")*/ for (int s = 0; s < nDataPoints; s++) { if (this.valueHistory[s] == null) { @SuppressWarnings("index") // this.historyCount is the length of this.pointsInTime - /*@SameLen("this.pointsInTime")*/ ValueSequence valueSequence = new ValueSequence(this.historyCount); + @SameLen("this.pointsInTime") ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 - /*@LTLengthOf("this.valueHistory[s]")*/ int insertionIndex0 = insertionIndex; + @LTLengthOf("this.valueHistory[s]") int insertionIndex0 = insertionIndex; this.valueHistory[s].enterData(insertionIndex0, newData[s]); } if (refresh > 0) { @@ -776,7 +776,7 @@ public RegularTimePeriod getOldestTime() { // getXxx() ftns can ignore the "series" argument: // Don't synchronize this!! Instead, synchronize the loop that calls it. @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item, series)]; return new Long(getX(tp)); } @@ -790,7 +790,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { // Don't synchronize this!! // Instead, synchronize the loop that calls it. @SuppressWarnings("index") // array-list interop: every other class that implements these interfaces uses a list to store series, so the annotation here is wrong @@ -807,7 +807,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Float(getYValue(series, item)); } @@ -820,7 +820,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item, series)]; return new Long(tp.getFirstMillisecond(this.workingCalendar)); } @@ -834,7 +834,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { RegularTimePeriod tp = this.pointsInTime[translateGet(item, series)]; return new Long(tp.getLastMillisecond(this.workingCalendar)); } @@ -848,7 +848,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -861,7 +861,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -885,7 +885,7 @@ public float getUntranslatedY(int series, @NonNegative int item) */ @Override @SuppressWarnings("index") // array-list interop: every other class that implements this interface backs the series with a list, so the annotation on this class don't correspond to the ones on the interface - public Comparable getSeriesKey(/*@IndexFor("this.seriesKeys")*/ int series) { + public Comparable getSeriesKey(@IndexFor("this.seriesKeys") int series) { return this.seriesKeys[series]; } diff --git a/src/main/java/org/jfree/data/time/Hour.java b/src/main/java/org/jfree/data/time/Hour.java index 951085c06..377679873 100644 --- a/src/main/java/org/jfree/data/time/Hour.java +++ b/src/main/java/org/jfree/data/time/Hour.java @@ -65,7 +65,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.common.value.qual.*; import java.io.Serializable; import java.util.Calendar; @@ -93,7 +93,7 @@ public class Hour extends RegularTimePeriod implements Serializable { private Day day; /** The hour. */ - /*@IntRange(from = 0, to = 23)*/ private byte hour; + @IntRange(from = 0, to = 23) private byte hour; /** The first millisecond. */ private long firstMillisecond; @@ -114,7 +114,7 @@ public Hour() { * @param hour the hour (in the range 0 to 23). * @param day the day ({@code null} not permitted). */ - public Hour(/*@IntRange(from = 0, to = 23)*/ int hour, Day day) { + public Hour(@IntRange(from = 0, to = 23) int hour, Day day) { Args.nullNotPermitted(day, "day"); this.hour = (byte) hour; this.day = day; @@ -129,7 +129,7 @@ public Hour(/*@IntRange(from = 0, to = 23)*/ int hour, Day day) { * @param month the month (1-12). * @param year the year (1900-9999). */ - public Hour(/*@IntRange(from = 0, to = 23)*/ int hour, /*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { + public Hour(@IntRange(from = 0, to = 23) int hour, @IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1900, to = 9999) int year) { this(hour, new Day(day, month, year)); } @@ -173,7 +173,7 @@ public Hour(Date time, TimeZone zone, Locale locale) { * * @return The hour (0 <= hour <= 23). */ - public /*@IntRange(from = 0, to = 23)*/ int getHour() { + public @IntRange(from = 0, to = 23) int getHour() { return this.hour; } @@ -191,7 +191,7 @@ public Day getDay() { * * @return The year. */ - public /*@IntRange(from = 1900, to = 9999)*/ int getYear() { + public @IntRange(from = 1900, to = 9999) int getYear() { return this.day.getYear(); } @@ -200,7 +200,7 @@ public Day getDay() { * * @return The month. */ - public /*@IntRange(from = 1, to = 12)*/ int getMonth() { + public @IntRange(from = 1, to = 12) int getMonth() { return this.day.getMonth(); } @@ -209,7 +209,7 @@ public Day getDay() { * * @return The day-of-the-month. */ - public /*@IntRange(from = 1, to = 31)*/ int getDayOfMonth() { + public @IntRange(from = 1, to = 31) int getDayOfMonth() { return this.day.getDayOfMonth(); } diff --git a/src/main/java/org/jfree/data/time/Millisecond.java b/src/main/java/org/jfree/data/time/Millisecond.java index 47269f7e3..a145fea83 100644 --- a/src/main/java/org/jfree/data/time/Millisecond.java +++ b/src/main/java/org/jfree/data/time/Millisecond.java @@ -59,7 +59,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.common.value.qual.*; import java.io.Serializable; import java.util.Calendar; @@ -86,16 +86,16 @@ public class Millisecond extends RegularTimePeriod implements Serializable { private Day day; /** The hour in the day. */ - /*@IntRange(from = 0, to = 23)*/ private byte hour; + @IntRange(from = 0, to = 23) private byte hour; /** The minute. */ - /*@IntRange(from = 0, to = 59)*/ private byte minute; + @IntRange(from = 0, to = 59) private byte minute; /** The second. */ - /*@IntRange(from = 0, to = 59)*/ private byte second; + @IntRange(from = 0, to = 59) private byte second; /** The millisecond. */ - /*@IntRange(from = 0, to = 999)*/ private int millisecond; + @IntRange(from = 0, to = 999) private int millisecond; /** * The pegged millisecond. @@ -115,7 +115,7 @@ public Millisecond() { * @param millisecond the millisecond (0-999). * @param second the second. */ - public Millisecond(/*@IntRange(from = 0, to = 999)*/ int millisecond, Second second) { + public Millisecond(@IntRange(from = 0, to = 999) int millisecond, Second second) { this.millisecond = millisecond; this.second = (byte) second.getSecond(); this.minute = (byte) second.getMinute().getMinute(); @@ -135,8 +135,8 @@ public Millisecond(/*@IntRange(from = 0, to = 999)*/ int millisecond, Second sec * @param month the month (1-12). * @param year the year (1900-9999). */ - public Millisecond(/*@IntRange(from = 0, to = 999)*/ int millisecond, /*@IntRange(from = 0, to = 59)*/ int second, /*@IntRange(from = 0, to = 59)*/ int minute, /*@IntRange(from = 0, to = 23)*/ int hour, - /*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { + public Millisecond(@IntRange(from = 0, to = 999) int millisecond, @IntRange(from = 0, to = 59) int second, @IntRange(from = 0, to = 59) int minute, @IntRange(from = 0, to = 23) int hour, + @IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1900, to = 9999) int year) { this(millisecond, new Second(second, minute, hour, day, month, year)); diff --git a/src/main/java/org/jfree/data/time/Minute.java b/src/main/java/org/jfree/data/time/Minute.java index 642ac86e0..03c2f1d76 100644 --- a/src/main/java/org/jfree/data/time/Minute.java +++ b/src/main/java/org/jfree/data/time/Minute.java @@ -66,7 +66,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.common.value.qual.*; import java.io.Serializable; import java.util.Calendar; @@ -94,10 +94,10 @@ public class Minute extends RegularTimePeriod implements Serializable { private Day day; /** The hour in which the minute falls. */ - /*@IntRange(from = 0, to = 23)*/ private byte hour; + @IntRange(from = 0, to = 23) private byte hour; /** The minute. */ - /*@IntRange(from = 0, to = 59)*/ private byte minute; + @IntRange(from = 0, to = 59) private byte minute; /** The first millisecond. */ private long firstMillisecond; @@ -118,7 +118,7 @@ public Minute() { * @param minute the minute (0 to 59). * @param hour the hour ({@code null} not permitted). */ - public Minute(/*@IntRange(from = 0, to = 59)*/ int minute, Hour hour) { + public Minute(@IntRange(from = 0, to = 59) int minute, Hour hour) { Args.nullNotPermitted(hour, "hour"); this.minute = (byte) minute; this.hour = (byte) hour.getHour(); @@ -171,7 +171,7 @@ public Minute(Date time, TimeZone zone, Locale locale) { * @param month the month (1-12). * @param year the year (1900-9999). */ - public Minute(/*@IntRange(from = 0, to = 59)*/ int minute, /*@IntRange(from = 0, to = 23)*/ int hour, /*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { + public Minute(@IntRange(from = 0, to = 59) int minute, @IntRange(from = 0, to = 23) int hour, @IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1900, to = 9999) int year) { this(minute, new Hour(hour, new Day(day, month, year))); } @@ -202,7 +202,7 @@ public Hour getHour() { * * @since 1.0.3 */ - public /*@IntRange(from = 0, to = 23)*/ int getHourValue() { + public @IntRange(from = 0, to = 23) int getHourValue() { return this.hour; } @@ -211,7 +211,7 @@ public Hour getHour() { * * @return The minute. */ - public /*@IntRange(from = 0, to = 59)*/ int getMinute() { + public @IntRange(from = 0, to = 59) int getMinute() { return this.minute; } diff --git a/src/main/java/org/jfree/data/time/Month.java b/src/main/java/org/jfree/data/time/Month.java index d8ca2ce17..8f239af90 100644 --- a/src/main/java/org/jfree/data/time/Month.java +++ b/src/main/java/org/jfree/data/time/Month.java @@ -65,7 +65,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.common.value.qual.*; import java.io.Serializable; import java.util.Calendar; @@ -85,10 +85,10 @@ public class Month extends RegularTimePeriod implements Serializable { private static final long serialVersionUID = -5090216912548722570L; /** The month (1-12). */ - private /*@IntRange(from = 1, to = 12)*/ int month; + private @IntRange(from = 1, to = 12) int month; /** The year in which the month falls. */ - private /*@IntRange(from = 0, to = 9999)*/ int year; + private @IntRange(from = 0, to = 9999) int year; /** The first millisecond. */ private long firstMillisecond; @@ -109,7 +109,7 @@ public Month() { * @param month the month (in the range 1 to 12). * @param year the year. */ - public Month(/*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 0, to = 9999)*/ int year) { + public Month(@IntRange(from = 1, to = 12) int month, @IntRange(from = 0, to = 9999) int year) { if ((month < 1) || (month > 12)) { throw new IllegalArgumentException("Month outside valid range."); } @@ -124,7 +124,7 @@ public Month(/*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 0, t * @param month the month (in the range 1 to 12). * @param year the year. */ - public Month(/*@IntRange(from = 1, to = 12)*/ int month, Year year) { + public Month(@IntRange(from = 1, to = 12) int month, Year year) { if ((month < 1) || (month > 12)) { throw new IllegalArgumentException("Month outside valid range."); } diff --git a/src/main/java/org/jfree/data/time/MovingAverage.java b/src/main/java/org/jfree/data/time/MovingAverage.java index c53bbf072..e8f559246 100644 --- a/src/main/java/org/jfree/data/time/MovingAverage.java +++ b/src/main/java/org/jfree/data/time/MovingAverage.java @@ -49,10 +49,10 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.chart.util.Args; import org.jfree.data.xy.XYDataset; @@ -78,7 +78,7 @@ public class MovingAverage { * @return A collection of moving average time series. */ public static TimeSeriesCollection createMovingAverage( - TimeSeriesCollection source, String suffix, /*@Positive*/ int periodCount, + TimeSeriesCollection source, String suffix, @Positive int periodCount, int skip) { Args.nullNotPermitted(source, "source"); @@ -112,7 +112,7 @@ public static TimeSeriesCollection createMovingAverage( * @return The moving average series. */ public static TimeSeries createMovingAverage(TimeSeries source, - String name, /*@Positive*/ int periodCount, int skip) { + String name, @Positive int periodCount, int skip) { Args.nullNotPermitted(source, "source"); if (periodCount < 1) { @@ -194,7 +194,7 @@ public static TimeSeries createMovingAverage(TimeSeries source, * @return The moving average series. */ public static TimeSeries createPointMovingAverage(TimeSeries source, - String name, /*@Positive*/ int pointCount) { + String name, @Positive int pointCount) { Args.nullNotPermitted(source, "source"); if (pointCount < 2) { @@ -286,7 +286,7 @@ public static XYDataset createMovingAverage(XYDataset source, * @return The dataset. */ public static XYSeries createMovingAverage(XYDataset source, - /*@NonNegative*/ int series, String name, double period, double skip) { + @NonNegative int series, String name, double period, double skip) { Args.nullNotPermitted(source, "source"); if (period < Double.MIN_VALUE) { diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index 841909805..dbe3918f1 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -61,10 +61,10 @@ package org.jfree.data.time; -/*>>> + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - */ + import java.io.Serializable; import java.util.Calendar; @@ -91,22 +91,22 @@ public class Quarter extends RegularTimePeriod implements Serializable { public static final int LAST_QUARTER = 4; /** The first month in each quarter. */ - public static final int /*@ArrayLen(5)*/ [] FIRST_MONTH_IN_QUARTER = { + public static final int @ArrayLen(5) [] FIRST_MONTH_IN_QUARTER = { 0, MonthConstants.JANUARY, MonthConstants.APRIL, MonthConstants.JULY, MonthConstants.OCTOBER }; /** The last month in each quarter. */ - public static final /*@IntRange(from = 0, to = 12)*/ int /*@ArrayLen(5)*/ [] LAST_MONTH_IN_QUARTER = { + public static final @IntRange(from = 0, to = 12) int @ArrayLen(5) [] LAST_MONTH_IN_QUARTER = { 0, MonthConstants.MARCH, MonthConstants.JUNE, MonthConstants.SEPTEMBER, MonthConstants.DECEMBER }; /** The year in which the quarter falls. */ - /*@IntRange(from = 0, to = 9999)*/ private short year; + @IntRange(from = 0, to = 9999) private short year; /** The quarter (1-4). */ - private /*@IntVal({1,2,3,4})*/ byte quarter; + private @IntVal({1,2,3,4}) byte quarter; /** The first millisecond. */ private long firstMillisecond; @@ -127,7 +127,7 @@ public Quarter() { * @param year the year (1900 to 9999). * @param quarter the quarter (1 to 4). */ - public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, /*@IntRange(from=0, to = 9999)*/int year) { + public Quarter(@IntVal({1,2,3,4}) int quarter, @IntRange(from=0, to = 9999)int year) { if ((quarter < FIRST_QUARTER) || (quarter > LAST_QUARTER)) { throw new IllegalArgumentException("Quarter outside valid range."); } @@ -142,7 +142,7 @@ public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, /*@IntRange(from=0, to = 9999 * @param quarter the quarter (1 to 4). * @param year the year (1900 to 9999). */ - public Quarter(/*@IntVal({1,2,3,4})*/ int quarter, Year year) { + public Quarter(@IntVal({1,2,3,4}) int quarter, Year year) { if ((quarter < FIRST_QUARTER) || (quarter > LAST_QUARTER)) { throw new IllegalArgumentException("Quarter outside valid range."); } @@ -188,7 +188,7 @@ public Quarter(Date time, TimeZone zone, Locale locale) { * * @return The quarter. */ - public /*@IntVal({1,2,3,4})*/ int getQuarter() { + public @IntVal({1,2,3,4}) int getQuarter() { return this.quarter; } @@ -208,7 +208,7 @@ public Year getYear() { * * @since 1.0.3 */ - public /*@IntRange(from = -9999, to = 9999)*/ int getYearValue() { + public @IntRange(from = -9999, to = 9999) int getYearValue() { return this.year; } @@ -425,7 +425,7 @@ public String toString() { @Override public long getFirstMillisecond(Calendar calendar) { @SuppressWarnings("index") // month >= 1, since months are 1 to 12. this.quarter is 1 to 4, so it can't access the 0th value in FIRST_MONTH_IN_QUARTER, which is the only non positive value - /*@Positive*/ int month = Quarter.FIRST_MONTH_IN_QUARTER[this.quarter]; + @Positive int month = Quarter.FIRST_MONTH_IN_QUARTER[this.quarter]; calendar.set(this.year, month - 1, 1, 0, 0, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTimeInMillis(); @@ -445,7 +445,7 @@ public long getFirstMillisecond(Calendar calendar) { @Override public long getLastMillisecond(Calendar calendar) { @SuppressWarnings({"index", "value"}) // this.quarter is always 1, 2, 3, or 4 - and only the 0th element of this array is out of the range 1-12 - /*@IntRange(from = 1, to = 12)*/ int month = Quarter.LAST_MONTH_IN_QUARTER[this.quarter]; + @IntRange(from = 1, to = 12) int month = Quarter.LAST_MONTH_IN_QUARTER[this.quarter]; int eom = SerialDate.lastDayOfMonth(month, this.year); calendar.set(this.year, month - 1, eom, 23, 59, 59); calendar.set(Calendar.MILLISECOND, 999); diff --git a/src/main/java/org/jfree/data/time/RegularTimePeriod.java b/src/main/java/org/jfree/data/time/RegularTimePeriod.java index 3d61763b6..83be06ca9 100644 --- a/src/main/java/org/jfree/data/time/RegularTimePeriod.java +++ b/src/main/java/org/jfree/data/time/RegularTimePeriod.java @@ -53,7 +53,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ +import org.checkerframework.dataflow.qual.Pure; import java.lang.reflect.Constructor; import java.util.Calendar; @@ -178,7 +178,7 @@ else if (c.equals(Second.class)) { * @see #getFirstMillisecond() */ @Override - /*@Pure*/ + @Pure public Date getStart() { return new Date(getFirstMillisecond()); } diff --git a/src/main/java/org/jfree/data/time/Second.java b/src/main/java/org/jfree/data/time/Second.java index b198d76d6..11f131e37 100644 --- a/src/main/java/org/jfree/data/time/Second.java +++ b/src/main/java/org/jfree/data/time/Second.java @@ -61,7 +61,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.common.value.qual.*; import java.io.Serializable; import java.util.Calendar; @@ -89,13 +89,13 @@ public class Second extends RegularTimePeriod implements Serializable { private Day day; /** The hour of the day. */ - /*@IntRange(from = 0, to = 23)*/ private byte hour; + @IntRange(from = 0, to = 23) private byte hour; /** The minute. */ - /*@IntRange(from = 0, to = 59)*/ private byte minute; + @IntRange(from = 0, to = 59) private byte minute; /** The second. */ - /*@IntRange(from = 0, to = 59)*/ private byte second; + @IntRange(from = 0, to = 59) private byte second; /** * The first millisecond. We don't store the last millisecond, because it @@ -116,7 +116,7 @@ public Second() { * @param second the second (0 to 59). * @param minute the minute ({@code null} not permitted). */ - public Second(/*@IntRange(from = 0, to = 59)*/ int second, Minute minute) { + public Second(@IntRange(from = 0, to = 59) int second, Minute minute) { Args.requireInRange(second, "second", Second.FIRST_SECOND_IN_MINUTE, Second.LAST_SECOND_IN_MINUTE); Args.nullNotPermitted(minute, "minute"); @@ -137,8 +137,8 @@ public Second(/*@IntRange(from = 0, to = 59)*/ int second, Minute minute) { * @param month the month (1-12). * @param year the year (1900-9999). */ - public Second(/*@IntRange(from = 0, to = 59)*/ int second, /*@IntRange(from = 0, to = 59)*/ int minute, /*@IntRange(from = 0, to = 23)*/ int hour, - /*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { + public Second(@IntRange(from = 0, to = 59) int second, @IntRange(from = 0, to = 59) int minute, @IntRange(from = 0, to = 23) int hour, + @IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1900, to = 9999) int year) { this(second, new Minute(minute, hour, day, month, year)); } @@ -179,7 +179,7 @@ public Second(Date time, TimeZone zone, Locale locale) { * * @return The second (0 - 59). */ - public /*@IntRange(from = 0, to = 59)*/ int getSecond() { + public @IntRange(from = 0, to = 59) int getSecond() { return this.second; } diff --git a/src/main/java/org/jfree/data/time/SimpleTimePeriod.java b/src/main/java/org/jfree/data/time/SimpleTimePeriod.java index 8a872750d..ce21ff06d 100644 --- a/src/main/java/org/jfree/data/time/SimpleTimePeriod.java +++ b/src/main/java/org/jfree/data/time/SimpleTimePeriod.java @@ -45,7 +45,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ +import org.checkerframework.dataflow.qual.Pure; import java.io.Serializable; import java.util.Date; @@ -98,7 +98,7 @@ public SimpleTimePeriod(Date start, Date end) { * @return The start date/time (never {@code null}). */ @Override - /*@Pure*/ + @Pure public Date getStart() { return new Date(this.start); } diff --git a/src/main/java/org/jfree/data/time/TimePeriod.java b/src/main/java/org/jfree/data/time/TimePeriod.java index 0ad578fc3..d7134cabd 100644 --- a/src/main/java/org/jfree/data/time/TimePeriod.java +++ b/src/main/java/org/jfree/data/time/TimePeriod.java @@ -41,7 +41,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ +import org.checkerframework.dataflow.qual.Pure; import java.util.Date; @@ -57,7 +57,7 @@ public interface TimePeriod extends Comparable { * * @return The start date/time (never {@code null}). */ - /*@Pure*/ + @Pure public Date getStart(); /** diff --git a/src/main/java/org/jfree/data/time/TimePeriodValue.java b/src/main/java/org/jfree/data/time/TimePeriodValue.java index 0a3fad619..fb6ee5faa 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValue.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValue.java @@ -42,7 +42,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ +import org.checkerframework.dataflow.qual.Pure; import java.io.Serializable; import org.jfree.chart.util.Args; @@ -92,7 +92,7 @@ public TimePeriodValue(TimePeriod period, double value) { * * @return The time period (never {@code null}). */ - /*@Pure*/ + @Pure public TimePeriod getPeriod() { return this.period; } diff --git a/src/main/java/org/jfree/data/time/TimePeriodValues.java b/src/main/java/org/jfree/data/time/TimePeriodValues.java index 8ee5192ec..2de0eb52f 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValues.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValues.java @@ -47,10 +47,10 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.dataflow.qual.Pure; */ -/*>>> import org.checkerframework.checker.index.qual.GTENegativeOne; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ -/*>>> import org.checkerframework.checker.index.qual.LessThan; */ +import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.checker.index.qual.GTENegativeOne; +import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.index.qual.LessThan; import java.io.Serializable; import java.util.ArrayList; @@ -91,22 +91,22 @@ public class TimePeriodValues extends Series implements Serializable { private List data; /** Index of the time period with the minimum start milliseconds. */ - private /*@GTENegativeOne*/ int minStartIndex = -1; + private @GTENegativeOne int minStartIndex = -1; /** Index of the time period with the maximum start milliseconds. */ - private /*@GTENegativeOne*/ int maxStartIndex = -1; + private @GTENegativeOne int maxStartIndex = -1; /** Index of the time period with the minimum middle milliseconds. */ - private /*@GTENegativeOne*/ int minMiddleIndex = -1; + private @GTENegativeOne int minMiddleIndex = -1; /** Index of the time period with the maximum middle milliseconds. */ - private /*@GTENegativeOne*/ int maxMiddleIndex = -1; + private @GTENegativeOne int maxMiddleIndex = -1; /** Index of the time period with the minimum end milliseconds. */ - private /*@GTENegativeOne*/ int minEndIndex = -1; + private @GTENegativeOne int minEndIndex = -1; /** Index of the time period with the maximum end milliseconds. */ - private /*@GTENegativeOne*/ int maxEndIndex = -1; + private @GTENegativeOne int maxEndIndex = -1; /** * Creates a new (empty) collection of time period values. @@ -193,7 +193,7 @@ public void setRangeDescription(String description) { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.data.size(); } @@ -205,8 +205,8 @@ public void setRangeDescription(String description) { * * @return One data item for the series. */ - /*@Pure*/ - public TimePeriodValue getDataItem(/*@NonNegative*/ int index) { + @Pure + public TimePeriodValue getDataItem(@NonNegative int index) { return (TimePeriodValue) this.data.get(index); } @@ -220,7 +220,7 @@ public TimePeriodValue getDataItem(/*@NonNegative*/ int index) { * * @see #getDataItem(int) */ - public TimePeriod getTimePeriod(/*@NonNegative*/ int index) { + public TimePeriod getTimePeriod(@NonNegative int index) { return getDataItem(index).getPeriod(); } @@ -234,7 +234,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int index) { * * @see #getDataItem(int) */ - public Number getValue(/*@NonNegative*/ int index) { + public Number getValue(@NonNegative int index) { return getDataItem(index).getValue(); } @@ -248,7 +248,7 @@ public void add(TimePeriodValue item) { Args.nullNotPermitted(item, "item"); this.data.add(item); @SuppressWarnings("index") // data.size is positive because we just added an item to data on the previous line - /*@NonNegative*/ int lastIndex = this.data.size() - 1; + @NonNegative int lastIndex = this.data.size() - 1; updateBounds(item.getPeriod(), lastIndex); fireSeriesChanged(); } @@ -259,7 +259,7 @@ public void add(TimePeriodValue item) { * @param period the time period. * @param index the index of the time period. */ - private void updateBounds(TimePeriod period, /*@NonNegative*/ int index) { + private void updateBounds(TimePeriod period, @NonNegative int index) { long start = period.getStart().getTime(); long end = period.getEnd().getTime(); @@ -392,7 +392,7 @@ public void add(TimePeriod period, Number value) { * @param index the index of the data item to update. * @param value the new value ({@code null} not permitted). */ - public void update(/*@NonNegative*/ int index, Number value) { + public void update(@NonNegative int index, Number value) { TimePeriodValue item = getDataItem(index); item.setValue(value); fireSeriesChanged(); @@ -405,7 +405,7 @@ public void update(/*@NonNegative*/ int index, Number value) { * @param start the index of the first period to delete. * @param end the index of the last period to delete. */ - public void delete(/*@NonNegative*/ /*@LessThan("#2 + 1")*/ int start, /*@NonNegative*/ int end) { + public void delete(@NonNegative @LessThan("#2 + 1") int start, @NonNegative int end) { for (int i = 0; i <= (end - start); i++) { this.data.remove(start); } @@ -504,7 +504,7 @@ public Object clone() throws CloneNotSupportedException { * * @throws CloneNotSupportedException if there is a cloning problem. */ - public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@GTENegativeOne*/ int end) + public TimePeriodValues createCopy(@NonNegative int start, @GTENegativeOne int end) throws CloneNotSupportedException { TimePeriodValues copy = (TimePeriodValues) super.clone(); @@ -531,7 +531,7 @@ public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@GTENegativeOne * * @return The index. */ - public /*@GTENegativeOne*/ int getMinStartIndex() { + public @GTENegativeOne int getMinStartIndex() { return this.minStartIndex; } @@ -540,7 +540,7 @@ public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@GTENegativeOne * * @return The index. */ - public /*@GTENegativeOne*/ int getMaxStartIndex() { + public @GTENegativeOne int getMaxStartIndex() { return this.maxStartIndex; } @@ -550,7 +550,7 @@ public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@GTENegativeOne * * @return The index. */ - public /*@GTENegativeOne*/ int getMinMiddleIndex() { + public @GTENegativeOne int getMinMiddleIndex() { return this.minMiddleIndex; } @@ -560,7 +560,7 @@ public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@GTENegativeOne * * @return The index. */ - public /*@GTENegativeOne*/ int getMaxMiddleIndex() { + public @GTENegativeOne int getMaxMiddleIndex() { return this.maxMiddleIndex; } @@ -569,7 +569,7 @@ public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@GTENegativeOne * * @return The index. */ - public /*@GTENegativeOne*/ int getMinEndIndex() { + public @GTENegativeOne int getMinEndIndex() { return this.minEndIndex; } @@ -578,7 +578,7 @@ public TimePeriodValues createCopy(/*@NonNegative*/ int start, /*@GTENegativeOne * * @return The index. */ - public /*@GTENegativeOne*/ int getMaxEndIndex() { + public @GTENegativeOne int getMaxEndIndex() { return this.maxEndIndex; } diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index 8b8e3a099..3017434b5 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -49,12 +49,12 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.Iterator; @@ -141,7 +141,7 @@ public void setXPosition(TimePeriodAnchor position) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -152,7 +152,7 @@ public void setXPosition(TimePeriodAnchor position) { * * @return The series. */ - public TimePeriodValues getSeries(/*@NonNegative*/ int series) { + public TimePeriodValues getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Index 'series' out of range."); } @@ -167,7 +167,7 @@ public TimePeriodValues getSeries(/*@NonNegative*/ int series) { * @return The key for a series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // defer argument checking return getSeries(series).getKey(); } @@ -204,7 +204,7 @@ public void removeSeries(TimePeriodValues series) { * * @param index the series index (zero-based). */ - public void removeSeries(/*@NonNegative*/ int index) { + public void removeSeries(@NonNegative int index) { TimePeriodValues series = getSeries(index); if (series != null) { removeSeries(series); @@ -222,7 +222,7 @@ public void removeSeries(/*@NonNegative*/ int index) { */ @Override @SuppressWarnings("index") // array-list interop: getSeries(series).getItemCount is LengthOf(this.getSeries) - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return getSeries(series).getItemCount(); } @@ -235,7 +235,7 @@ public void removeSeries(/*@NonNegative*/ int index) { * @return The x-value for the specified series and item. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); TimePeriod period = dp.getPeriod(); @@ -276,7 +276,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The starting X value for the specified series and item. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return new Long(dp.getPeriod().getStart().getTime()); @@ -291,7 +291,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending X value for the specified series and item. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return new Long(dp.getPeriod().getEnd().getTime()); @@ -306,7 +306,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The y-value for the specified series and item. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimePeriodValues ts = (TimePeriodValues) this.data.get(series); TimePeriodValue dp = ts.getDataItem(item); return dp.getValue(); @@ -321,7 +321,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting Y value for the specified series and item. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -334,7 +334,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending Y value for the specified series and item. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index 8c4916795..7f31f3ebb 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -90,9 +90,9 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.lang.reflect.InvocationTargetException; @@ -144,7 +144,7 @@ public class TimeSeries extends Series implements Cloneable, Serializable { protected List data; /** The maximum number of items for the series. */ - private /*@NonNegative*/ int maximumItemCount; + private @NonNegative int maximumItemCount; /** * The maximum age of items for the series, specified as a number of @@ -259,7 +259,7 @@ public void setRangeDescription(String description) { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.data.size(); } @@ -282,7 +282,7 @@ public List getItems() { * * @see #setMaximumItemCount(int) */ - public /*@NonNegative*/ int getMaximumItemCount() { + public @NonNegative int getMaximumItemCount() { return this.maximumItemCount; } @@ -297,7 +297,7 @@ public List getItems() { * * @see #getMaximumItemCount() */ - public void setMaximumItemCount(/*@NonNegative*/ int maximum) { + public void setMaximumItemCount(@NonNegative int maximum) { if (maximum < 0) { throw new IllegalArgumentException("Negative 'maximum' argument."); } @@ -305,7 +305,7 @@ public void setMaximumItemCount(/*@NonNegative*/ int maximum) { int count = this.data.size(); if (count > maximum) { @SuppressWarnings({"index","value"}) // https://github.com/kelloggm/checker-framework/issues/158 - /*@IntRange(from=0)*/ int deleteIndex = count - maximum - 1; + @IntRange(from=0) int deleteIndex = count - maximum - 1; // Extra assignment to kill the dataflow refinement. deleteIndex = deleteIndex; delete(0, deleteIndex); @@ -483,7 +483,7 @@ public Class getTimePeriodClass() { * * @return The data item. */ - public TimeSeriesDataItem getDataItem(/*@NonNegative*/ int index) { + public TimeSeriesDataItem getDataItem(@NonNegative int index) { TimeSeriesDataItem item = (TimeSeriesDataItem) this.data.get(index); return (TimeSeriesDataItem) item.clone(); } @@ -521,7 +521,7 @@ public TimeSeriesDataItem getDataItem(RegularTimePeriod period) { * * @since 1.0.14 */ - TimeSeriesDataItem getRawDataItem(/*@NonNegative*/ int index) { + TimeSeriesDataItem getRawDataItem(@NonNegative int index) { return (TimeSeriesDataItem) this.data.get(index); } @@ -553,7 +553,7 @@ TimeSeriesDataItem getRawDataItem(RegularTimePeriod period) { * * @return The time period. */ - public RegularTimePeriod getTimePeriod(/*@NonNegative*/ int index) { + public RegularTimePeriod getTimePeriod(@NonNegative int index) { return getRawDataItem(index).getPeriod(); } @@ -624,7 +624,7 @@ public int getIndex(RegularTimePeriod period) { * * @return The value (possibly {@code null}). */ - public Number getValue(/*@NonNegative*/ int index) { + public Number getValue(@NonNegative int index) { return getRawDataItem(index).getValue(); } @@ -696,7 +696,7 @@ else if (!this.timePeriodClass.equals(c)) { int index = Collections.binarySearch(this.data, item); if (index < 0) { @SuppressWarnings("index") // binary search on list - /*@NonNegative*/ int index1 = -index - 1; + @NonNegative int index1 = -index - 1; this.data.add(index1, item); added = true; } @@ -819,7 +819,7 @@ public void update(RegularTimePeriod period, Number value) { * @param index the index of the data item. * @param value the new value ({@code null} permitted). */ - public void update(/*@NonNegative*/ int index, Number value) { + public void update(@NonNegative int index, Number value) { TimeSeriesDataItem item = (TimeSeriesDataItem) this.data.get(index); boolean iterate = false; Number oldYN = item.getValue(); @@ -947,7 +947,7 @@ else if (item.getValue() != null) { else { item = (TimeSeriesDataItem) item.clone(); @SuppressWarnings("index") // binary search on list - /*@NonNegative*/ int index1 = -index - 1; + @NonNegative int index1 = -index - 1; this.data.add(index1, item); updateBoundsForAddedItem(item); @@ -1086,7 +1086,7 @@ public void delete(RegularTimePeriod period) { * @param start the index of the first period to delete. * @param end the index of the last period to delete. */ - public void delete(/*@NonNegative*/ /*@LessThan("#2 + 1")*/ int start, /*@NonNegative*/ int end) { + public void delete(@NonNegative @LessThan("#2 + 1") int start, @NonNegative int end) { delete(start, end, true); } @@ -1099,7 +1099,7 @@ public void delete(/*@NonNegative*/ /*@LessThan("#2 + 1")*/ int start, /*@NonNeg * * @since 1.0.14 */ - public void delete(/*@NonNegative*/ /*@LessThan("#2 + 1")*/ int start, /*@NonNegative*/ int end, boolean notify) { + public void delete(@NonNegative @LessThan("#2 + 1") int start, @NonNegative int end, boolean notify) { if (end < start) { throw new IllegalArgumentException("Requires start <= end."); } @@ -1149,7 +1149,7 @@ public Object clone() throws CloneNotSupportedException { * * @throws CloneNotSupportedException if there is a cloning problem. */ - public TimeSeries createCopy(/*@NonNegative*/ int start, /*@NonNegative*/ int end) + public TimeSeries createCopy(@NonNegative int start, @NonNegative int end) throws CloneNotSupportedException { if (start < 0) { throw new IllegalArgumentException("Requires start >= 0."); @@ -1221,7 +1221,7 @@ public TimeSeries createCopy(RegularTimePeriod start, RegularTimePeriod end) return copy; } @SuppressWarnings("index") // if endIndex < 0, emptyRange is true, so the function returns before we get here. - /*@NonNegative*/ int endIndex1 = endIndex; + @NonNegative int endIndex1 = endIndex; endIndex = endIndex1; return createCopy(startIndex, endIndex); diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index 62e1d3a24..7f3b904d3 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -88,12 +88,12 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.common.value.qual.*; +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; @@ -245,7 +245,7 @@ public List getSeries() { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -259,7 +259,7 @@ public List getSeries() { * * @since 1.0.6 */ - public /*@GTENegativeOne*/ int indexOf(TimeSeries series) { + public @GTENegativeOne int indexOf(TimeSeries series) { Args.nullNotPermitted(series, "series"); return this.data.indexOf(series); } @@ -271,7 +271,7 @@ public List getSeries() { * * @return The series. */ - public TimeSeries getSeries(/*@NonNegative*/ int series) { + public TimeSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException( "The 'series' argument is out of bounds (" + series + ")."); @@ -308,7 +308,7 @@ public TimeSeries getSeries(Comparable key) { * @return The key for a series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // check arguments...delegated // fetch the series name... return getSeries(series).getKey(); @@ -324,7 +324,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * * @since 1.0.17 */ - public /*@GTENegativeOne*/ int getSeriesIndex(Comparable key) { + public @GTENegativeOne int getSeriesIndex(Comparable key) { Args.nullNotPermitted(key, "key"); int seriesCount = getSeriesCount(); for (int i = 0; i < seriesCount; i++) { @@ -369,7 +369,7 @@ public void removeSeries(TimeSeries series) { * * @param index the series index (zero-based). */ - public void removeSeries(/*@NonNegative*/ int index) { + public void removeSeries(@NonNegative int index) { TimeSeries series = getSeries(index); if (series != null) { removeSeries(series); @@ -406,7 +406,7 @@ public void removeAllSeries() { */ @Override @SuppressWarnings("index") // array-list interop: getSeries(series).getItemCount is LengthOf(this.getSeries) - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return getSeries(series).getItemCount(); } @@ -419,7 +419,7 @@ public void removeAllSeries() { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimeSeries s = (TimeSeries) this.data.get(series); RegularTimePeriod period = s.getTimePeriod(item); return getX(period); @@ -434,7 +434,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimeSeries ts = (TimeSeries) this.data.get(series); RegularTimePeriod period = ts.getTimePeriod(item); return new Long(getX(period)); @@ -470,7 +470,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The value. */ @Override - public synchronized Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public synchronized Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return new Long(ts.getTimePeriod(item).getFirstMillisecond( this.workingCalendar)); @@ -485,7 +485,7 @@ public synchronized Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("t * @return The value. */ @Override - public synchronized Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public synchronized Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return new Long(ts.getTimePeriod(item).getLastMillisecond( this.workingCalendar)); @@ -500,7 +500,7 @@ public synchronized Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("thi * @return The value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimeSeries ts = (TimeSeries) this.data.get(series); return ts.getValue(item); } @@ -514,7 +514,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The value (possibly {@code null}). */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -527,7 +527,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value (possibly {@code null}). */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -542,7 +542,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return An array containing the (two) indices of the items surrounding * the time. */ - public int /*@ArrayLen(2)*/ [] getSurroundingItems(/*@NonNegative*/ int series, long milliseconds) { + public int @ArrayLen(2) [] getSurroundingItems(@NonNegative int series, long milliseconds) { int[] result = new int[] {-1, -1}; for (int i = 0; i < this.getItemCount(series); i++) { Number x = getX(series, i); diff --git a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java index ea7e1f5ae..42e461d55 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java @@ -42,7 +42,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import javax.swing.table.AbstractTableModel; @@ -103,7 +103,7 @@ public TimeSeriesTableModel(TimeSeries series, boolean editable) { * @return The column count. */ @Override - public /*@NonNegative*/ int getColumnCount() { + public @NonNegative int getColumnCount() { return 2; } @@ -115,7 +115,7 @@ public TimeSeriesTableModel(TimeSeries series, boolean editable) { * @return The column class in the table model. */ @Override - public Class getColumnClass(/*@NonNegative*/ int column) { + public Class getColumnClass(@NonNegative int column) { if (column == 0) { return String.class; } @@ -137,7 +137,7 @@ public Class getColumnClass(/*@NonNegative*/ int column) { * @return The name of a column. */ @Override - public String getColumnName(/*@NonNegative*/ int column) { + public String getColumnName(@NonNegative int column) { if (column == 0) { return "Period:"; @@ -159,7 +159,7 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The row count. */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.series.getItemCount(); } @@ -172,7 +172,7 @@ public String getColumnName(/*@NonNegative*/ int column) { * @return The data value for a cell in the table model. */ @Override - public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Object getValueAt(@NonNegative int row, @NonNegative int column) { if (row < this.series.getItemCount()) { if (column == 0) { @@ -212,7 +212,7 @@ public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) * @return {@code true} if the specified cell is editable. */ @Override - public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public boolean isCellEditable(@NonNegative int row, @NonNegative int column) { if (this.editable) { if ((column == 0) || (column == 1)) { return true; @@ -234,7 +234,7 @@ public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int col * @param column the column. */ @Override - public void setValueAt(Object value, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public void setValueAt(Object value, @NonNegative int row, @NonNegative int column) { if (row < this.series.getItemCount()) { diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index b660b2bda..8c8904138 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -56,12 +56,12 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.Calendar; import java.util.List; @@ -304,7 +304,7 @@ public void clear() { * * @return The time period. */ - public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { + public TimePeriod getTimePeriod(@NonNegative int item) { return (TimePeriod) this.values.getRowKey(item); } @@ -314,7 +314,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.values.getRowCount(); } @@ -329,7 +329,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { */ @Override @SuppressWarnings("index") // array-list interop: series is ignored and the underlying rep here is a list - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return getItemCount(); } @@ -339,7 +339,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.values.getColumnCount(); } @@ -351,7 +351,7 @@ public TimePeriod getTimePeriod(/*@NonNegative*/ int item) { * @return The key for the series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { return this.values.getColumnKey(series); } @@ -366,7 +366,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getXValue(series, item)); } @@ -379,7 +379,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return getXValue(period); } @@ -395,7 +395,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getStartXValue(int, int) */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getStartXValue(series, item)); } @@ -409,7 +409,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return period.getStart().getTime(); } @@ -425,7 +425,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @see #getEndXValue(int, int) */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getEndXValue(series, item)); } @@ -439,7 +439,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { TimePeriod period = (TimePeriod) this.values.getRowKey(item); return period.getEnd().getTime(); } @@ -453,7 +453,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The y-value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.values.getValue(item, series); } @@ -466,7 +466,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting Y value for the specified series and item. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -479,7 +479,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending Y value for the specified series and item. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -559,7 +559,7 @@ public Range getDomainBounds(boolean includeInterval) { TimePeriod first = (TimePeriod) keys.get(0); @SuppressWarnings("index") // keys.isEmpty() call above establishes that this is safe - /*@NonNegative*/ int lastIndex = keys.size() - 1; + @NonNegative int lastIndex = keys.size() - 1; TimePeriod last = (TimePeriod) keys.get(lastIndex); if (!includeInterval || this.domainIsPointsInTime) { diff --git a/src/main/java/org/jfree/data/time/Week.java b/src/main/java/org/jfree/data/time/Week.java index 7240e1c08..f5de244c9 100644 --- a/src/main/java/org/jfree/data/time/Week.java +++ b/src/main/java/org/jfree/data/time/Week.java @@ -73,7 +73,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.common.value.qual.*; import java.io.Serializable; import java.util.Calendar; @@ -104,10 +104,10 @@ public class Week extends RegularTimePeriod implements Serializable { public static final int LAST_WEEK_IN_YEAR = 53; /** The year in which the week falls. */ - private /*@IntRange(from = 0, to = 9999)*/ short year; + private @IntRange(from = 0, to = 9999) short year; /** The week (1-53). */ - private /*@IntRange(from = 1, to = 53)*/ byte week; + private @IntRange(from = 1, to = 53) byte week; /** The first millisecond. */ private long firstMillisecond; @@ -129,7 +129,7 @@ public Week() { * @param week the week (1 to 53). * @param year the year (1900 to 9999). */ - public Week(/*@IntRange(from = 1, to = 53)*/ int week, /*@IntRange(from = 0, to = 9999)*/ int year) { + public Week(@IntRange(from = 1, to = 53) int week, @IntRange(from = 0, to = 9999) int year) { if ((week < FIRST_WEEK_IN_YEAR) && (week > LAST_WEEK_IN_YEAR)) { throw new IllegalArgumentException( "The 'week' argument must be in the range 1 - 53."); @@ -145,7 +145,7 @@ public Week(/*@IntRange(from = 1, to = 53)*/ int week, /*@IntRange(from = 0, to * @param week the week (1 to 53). * @param year the year (1900 to 9999). */ - public Week(/*@IntRange(from = 1, to = 53)*/ int week, Year year) { + public Week(@IntRange(from = 1, to = 53) int week, Year year) { if ((week < FIRST_WEEK_IN_YEAR) && (week > LAST_WEEK_IN_YEAR)) { throw new IllegalArgumentException( "The 'week' argument must be in the range 1 - 53."); @@ -225,7 +225,7 @@ public Year getYear() { * * @return The year. */ - public /*@IntRange(from = -9999, to = 9999)*/ int getYearValue() { + public @IntRange(from = -9999, to = 9999) int getYearValue() { return this.year; } @@ -234,7 +234,7 @@ public Year getYear() { * * @return The week. */ - public /*@IntRange(from = 1, to = 53)*/ int getWeek() { + public @IntRange(from = 1, to = 53) int getWeek() { return this.week; } @@ -336,7 +336,7 @@ public RegularTimePeriod next() { Calendar calendar = Calendar.getInstance(); calendar.set(this.year, Calendar.DECEMBER, 31); @SuppressWarnings({"index", "value"}) // calendar get: calendar.getActualMaximum is a combined getter for various calendar fields, and therefore has no sensical annotation - /*@IntRange(from = 52, to = 53)*/ int actualMaxWeek + @IntRange(from = 52, to = 53) int actualMaxWeek = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); if (this.week < actualMaxWeek) { result = new Week(this.week + 1, this.year); diff --git a/src/main/java/org/jfree/data/time/Year.java b/src/main/java/org/jfree/data/time/Year.java index a5cd1de27..0322b174c 100644 --- a/src/main/java/org/jfree/data/time/Year.java +++ b/src/main/java/org/jfree/data/time/Year.java @@ -61,7 +61,7 @@ */ package org.jfree.data.time; -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.common.value.qual.*; import java.io.Serializable; import java.util.Calendar; @@ -93,7 +93,7 @@ public class Year extends RegularTimePeriod implements Serializable { private static final long serialVersionUID = -7659990929736074836L; /** The year. */ - private /*@IntRange(from = -9999, to = 9999)*/ short year; + private @IntRange(from = -9999, to = 9999) short year; /** The first millisecond. */ private long firstMillisecond; @@ -113,7 +113,7 @@ public Year() { * * @param year the year. */ - public Year(/*@IntRange(from = -9999, to = 9999)*/ int year) { + public Year(@IntRange(from = -9999, to = 9999) int year) { if ((year < Year.MINIMUM_YEAR) || (year > Year.MAXIMUM_YEAR)) { throw new IllegalArgumentException( "Year constructor: year (" + year + ") outside valid range."); @@ -158,7 +158,7 @@ public Year(Date time, TimeZone zone, Locale locale) { * @return The year. */ @SuppressWarnings({"index", "value"}) // this is a bug. The calendar API which this interacts with expects years to be nonnegative (it uses an era field to represent AD/BC) - public /*@IntRange(from = 0, to = 9999)*/ int getYear() { + public @IntRange(from = 0, to = 9999) int getYear() { return this.year; } diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java index 1dc3c7750..8bf13aee2 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java @@ -41,7 +41,7 @@ */ package org.jfree.data.time.ohlc; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.chart.util.Args; import org.jfree.data.ComparableObjectItem; @@ -75,7 +75,7 @@ public OHLCSeries(Comparable key) { * * @return The time period. */ - public RegularTimePeriod getPeriod(/*@NonNegative*/ int index) { + public RegularTimePeriod getPeriod(@NonNegative int index) { OHLCItem item = (OHLCItem) getDataItem(index); return item.getPeriod(); } @@ -88,7 +88,7 @@ public RegularTimePeriod getPeriod(/*@NonNegative*/ int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { + public ComparableObjectItem getDataItem(@NonNegative int index) { return super.getDataItem(index); } @@ -137,7 +137,7 @@ public void add(OHLCItem item) { * @since 1.0.14 */ @Override - public ComparableObjectItem remove(/*@NonNegative*/ int index) { + public ComparableObjectItem remove(@NonNegative int index) { return super.remove(index); } diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index a96640076..43ba20563 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -43,11 +43,11 @@ */ package org.jfree.data.time.ohlc; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.List; @@ -130,7 +130,7 @@ public void addSeries(OHLCSeries series) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -144,7 +144,7 @@ public void addSeries(OHLCSeries series) { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public OHLCSeries getSeries(/*@NonNegative*/ int series) { + public OHLCSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -163,7 +163,7 @@ public OHLCSeries getSeries(/*@NonNegative*/ int series) { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // defer argument checking return getSeries(series).getKey(); } @@ -180,7 +180,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -215,7 +215,7 @@ else if (this.xPosition == TimePeriodAnchor.END) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); RegularTimePeriod period = di.getPeriod(); @@ -231,7 +231,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getXValue(series, item)); } @@ -244,7 +244,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return new Double(di.getYValue()); @@ -259,7 +259,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The open-value. */ @Override - public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getOpenValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getOpenValue(); @@ -274,7 +274,7 @@ public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The open-value. */ @Override - public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getOpen(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getOpenValue(series, item)); } @@ -287,7 +287,7 @@ public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The close-value. */ @Override - public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getCloseValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getCloseValue(); @@ -302,7 +302,7 @@ public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSe * @return The close-value. */ @Override - public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getClose(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getCloseValue(series, item)); } @@ -315,7 +315,7 @@ public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries( * @return The high-value. */ @Override - public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getHighValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getHighValue(); @@ -330,7 +330,7 @@ public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The high-value. */ @Override - public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getHigh(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getHighValue(series, item)); } @@ -343,7 +343,7 @@ public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The low-value. */ @Override - public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getLowValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { OHLCSeries s = (OHLCSeries) this.data.get(series); OHLCItem di = (OHLCItem) s.getDataItem(item); return di.getLowValue(); @@ -358,7 +358,7 @@ public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeri * @return The low-value. */ @Override - public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getLow(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getLowValue(series, item)); } @@ -372,7 +372,7 @@ public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1 * @return {@code null}. */ @Override - public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getVolume(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return null; } @@ -386,7 +386,7 @@ public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return {@code Double.NaN}. */ @Override - public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getVolumeValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return Double.NaN; } @@ -398,7 +398,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * * @since 1.0.14 */ - public void removeSeries(/*@NonNegative*/ int index) { + public void removeSeries(@NonNegative int index) { OHLCSeries series = getSeries(index); if (series != null) { removeSeries(series); diff --git a/src/main/java/org/jfree/data/xml/KeyHandler.java b/src/main/java/org/jfree/data/xml/KeyHandler.java index 9ca8542ab..3cc1df2a0 100644 --- a/src/main/java/org/jfree/data/xml/KeyHandler.java +++ b/src/main/java/org/jfree/data/xml/KeyHandler.java @@ -39,8 +39,8 @@ */ package org.jfree.data.xml; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -137,7 +137,7 @@ public void endElement(String namespaceURI, */ @Override @SuppressWarnings("index") // need xml annotations - public void characters(char[] ch, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int length) { + public void characters(char[] ch, @IndexOrHigh("#1") int start, @IndexOrHigh("#1") int length) { if (this.currentText != null) { this.currentText.append(String.copyValueOf(ch, start, length)); } diff --git a/src/main/java/org/jfree/data/xml/RootHandler.java b/src/main/java/org/jfree/data/xml/RootHandler.java index 61c9cc7c1..a66fd4748 100644 --- a/src/main/java/org/jfree/data/xml/RootHandler.java +++ b/src/main/java/org/jfree/data/xml/RootHandler.java @@ -39,8 +39,8 @@ */ package org.jfree.data.xml; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.util.Stack; @@ -82,7 +82,7 @@ public Stack getSubHandlers() { */ @Override @SuppressWarnings("index") // need xml annotations - public void characters(char[] ch, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int length) + public void characters(char[] ch, @IndexOrHigh("#1") int start, @IndexOrHigh("#1") int length) throws SAXException { DefaultHandler handler = getCurrentHandler(); if (handler != this) { diff --git a/src/main/java/org/jfree/data/xml/ValueHandler.java b/src/main/java/org/jfree/data/xml/ValueHandler.java index 1c4c692ed..b5c00b9f9 100644 --- a/src/main/java/org/jfree/data/xml/ValueHandler.java +++ b/src/main/java/org/jfree/data/xml/ValueHandler.java @@ -40,8 +40,8 @@ */ package org.jfree.data.xml; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -142,7 +142,7 @@ public void endElement(String namespaceURI, */ @Override @SuppressWarnings("index") // need xml annotations - public void characters(char[] ch, /*@IndexOrHigh("#1")*/ int start, /*@IndexOrHigh("#1")*/ int length) { + public void characters(char[] ch, @IndexOrHigh("#1") int start, @IndexOrHigh("#1") int length) { if (this.currentText != null) { this.currentText.append(String.copyValueOf(ch, start, length)); } diff --git a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java index aa4bd2c58..18a547c10 100644 --- a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java @@ -42,11 +42,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * An base class that you can use to create new implementations of the @@ -65,7 +65,7 @@ public abstract class AbstractIntervalXYDataset extends AbstractXYDataset * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number x = getStartX(series, item); if (x != null) { @@ -84,7 +84,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number x = getEndX(series, item); if (x != null) { @@ -103,7 +103,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number y = getStartY(series, item); if (y != null) { @@ -122,7 +122,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number y = getEndY(series, item); if (y != null) { diff --git a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java index 73231b575..6ae6094cc 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java @@ -42,11 +42,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.DomainOrder; import org.jfree.data.general.AbstractSeriesDataset; @@ -77,7 +77,7 @@ public DomainOrder getDomainOrder() { * @return The value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number x = getX(series, item); if (x != null) { @@ -95,7 +95,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number y = getY(series, item); if (y != null) { diff --git a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java index c35671854..752f54eee 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java @@ -40,11 +40,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * An base class that you can use to create new implementations of the @@ -62,7 +62,7 @@ public abstract class AbstractXYZDataset extends AbstractXYDataset * @return The z-value. */ @Override - public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getZValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number z = getZ(series, item); if (z != null) { diff --git a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java index c87e24c90..6dcd316ff 100644 --- a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java @@ -48,11 +48,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.chart.util.PublicCloneable; import org.jfree.data.DefaultKeyedValues2D; @@ -164,7 +164,7 @@ public void clear() { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.values.getColumnCount(); } @@ -176,7 +176,7 @@ public void clear() { * @return The key for a series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { return this.values.getColumnKey(series); } @@ -186,7 +186,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.values.getRowCount(); } @@ -199,9 +199,9 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The item count. */ @Override - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { @SuppressWarnings("index") // The annotation on this method's return type isn't quite sensical, because there's no way to express the correct invariant here. Warnings are suppressed throughout these classes, but callers have a good interface. - /*@LengthOf("this.getSeries(#1)")*/ int result = getItemCount(); // all series have the same number of items in + @LengthOf("this.getSeries(#1)") int result = getItemCount(); // all series have the same number of items in // this dataset return result; } @@ -215,7 +215,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return (Number) this.values.getRowKey(item); } @@ -229,7 +229,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getStartX(series, item); } @@ -243,7 +243,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getEndX(series, item); } @@ -256,7 +256,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The y value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.values.getValue(item, series); } @@ -269,7 +269,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting Y value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -282,7 +282,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending Y value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java index 511842378..fb7e32850 100644 --- a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java @@ -49,9 +49,7 @@ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; - */ import java.util.Arrays; import java.util.Date; @@ -70,22 +68,22 @@ public class DefaultHighLowDataset extends AbstractXYDataset private Comparable seriesKey; /** Storage for the dates. */ - private Date /*@SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}*/ [] date; + private Date @SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}) [] date; /** Storage for the high values. */ - private Number /*@SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}*/ [] high; + private Number @SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}) [] high; /** Storage for the low values. */ - private Number /*@SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}*/ [] low; + private Number @SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}) [] low; /** Storage for the open values. */ - private Number /*@SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}*/ [] open; + private Number @SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}) [] open; /** Storage for the close values. */ - private Number /*@SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}*/ [] close; + private Number @SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}) [] close; /** Storage for the volume values. */ - private Number /*@SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}*/ [] volume; + private Number @SameLen({"this.high", "this.date", "this.low", "this.open", "this.close", "this.volume"}) [] volume; /** * Constructs a new high/low/open/close dataset. @@ -102,10 +100,11 @@ public class DefaultHighLowDataset extends AbstractXYDataset * @param close the close values ({@code null} not permitted). * @param volume the volume values ({@code null} not permitted). */ - public DefaultHighLowDataset(Comparable seriesKey, Date /*@SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"})*/ [] date, - double /*@SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"})*/ [] high, double /*@SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"})*/ [] low, - double /*@SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"})*/ [] open, double /*@SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"})*/ [] close, - double /*@SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"})*/ [] volume) { + @SuppressWarnings("samelen") // While initializing object, SameLen invariants between the fields will be broken (because one field must be initialized before the others). The annotations on the parameters guarantee the invariant holds after the constructor finishes executing. + public DefaultHighLowDataset(Comparable seriesKey, Date @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] date, + double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] high, double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] low, + double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] open, double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] close, + double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] volume) { Args.nullNotPermitted(seriesKey, "seriesKey"); Args.nullNotPermitted(date, "date"); @@ -128,7 +127,7 @@ public DefaultHighLowDataset(Comparable seriesKey, Date /*@SameLen({"#2", "#3", * @return The series key (never {@code null}). */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { return this.seriesKey; } @@ -147,7 +146,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @see #getXDate(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = new Long(this.date[item].getTime()); return result; @@ -165,7 +164,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * * @see #getX(int, int) */ - public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Date getXDate(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Date result = this.date[item]; return result; @@ -185,7 +184,7 @@ public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1 * @see #getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getClose(series, item); } @@ -200,7 +199,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getHighValue(int, int) */ @Override - public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getHigh(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.high[item]; return result; @@ -218,7 +217,7 @@ public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @see #getHigh(int, int) */ @Override - public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getHighValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number h = getHigh(series, item); if (h != null) { @@ -238,7 +237,7 @@ public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @see #getLowValue(int, int) */ @Override - public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getLow(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.low[item]; return result; @@ -256,7 +255,7 @@ public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1 * @see #getLow(int, int) */ @Override - public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getLowValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number l = getLow(series, item); if (l != null) { @@ -276,7 +275,7 @@ public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeri * @see #getOpenValue(int, int) */ @Override - public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getOpen(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.open[item]; return result; @@ -294,7 +293,7 @@ public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @see #getOpen(int, int) */ @Override - public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getOpenValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number open = getOpen(series, item); if (open != null) { @@ -314,7 +313,7 @@ public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @see #getCloseValue(int, int) */ @Override - public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getClose(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.close[item]; return result; @@ -332,7 +331,7 @@ public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries( * @see #getClose(int, int) */ @Override - public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getCloseValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number c = getClose(series, item); if (c != null) { @@ -352,7 +351,7 @@ public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSe * @see #getVolumeValue(int, int) */ @Override - public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getVolume(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // array-list interop: the annotation on this method cannot expose the implementation detail of this class being backed by an array Number result = this.volume[item]; return result; @@ -370,7 +369,7 @@ public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getVolume(int, int) */ @Override - public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getVolumeValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number v = getVolume(series, item); if (v != null) { @@ -387,7 +386,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The number of series. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return 1; } @@ -399,9 +398,9 @@ public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The number of items in the specified series. */ @Override - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { @SuppressWarnings("index") // the annotation on this method isn't quite sensical, but it's the closest we can get, and is safe. - /*@LengthOf("this.getSeries(#1)")*/ int result = this.date.length; + @LengthOf("this.getSeries(#1)") int result = this.date.length; return result; } @@ -453,7 +452,7 @@ public boolean equals(Object obj) { * * @return The data as an array of Number objects. */ - public static Number /*@SameLen("#1")*/ [] createNumberArray(double[] data) { + public static Number @SameLen("#1") [] createNumberArray(double[] data) { Number[] result = new Number[data.length]; for (int i = 0; i < data.length; i++) { result[i] = new Double(data[i]); diff --git a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java index 60cf68d15..560cd5880 100644 --- a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java @@ -44,8 +44,8 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.util.ArrayList; import java.util.Arrays; @@ -78,7 +78,7 @@ public class DefaultIntervalXYDataset extends AbstractIntervalXYDataset * order of the series is significant. This list must be kept in sync * with the seriesKeys list. */ - private List<double /*@ArrayLen(6)*/ [][]> seriesList; + private List<double @ArrayLen(6) [][]> seriesList; /** * Creates a new {@code DefaultIntervalXYDataset} instance, initially @@ -95,7 +95,7 @@ public DefaultIntervalXYDataset() { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.seriesList.size(); } @@ -111,7 +111,7 @@ public DefaultIntervalXYDataset() { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -130,15 +130,15 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * specified range. */ @Override - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } - double /*@ArrayLen(6)*/ [][] seriesArray = - (double /*@ArrayLen(6)*/ [][]) + double @ArrayLen(6) [][] seriesArray = + (double @ArrayLen(6) [][]) this.seriesList.get(series); @SuppressWarnings("index") // The annotation on this method's return type isn't quite sensical, because there's no way to express the correct invariant here. Warnings are suppressed throughout these classes, but callers have a good interface. - /*@LengthOf("this.getSeries(#1)")*/ int result = seriesArray[0].length; + @LengthOf("this.getSeries(#1)") int result = seriesArray[0].length; return result; } @@ -160,10 +160,10 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(6) [][] seriesData = (double @ArrayLen(6) [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop - /*@IndexFor("seriesData[0]")*/ int itemIndex = item; + @IndexFor("seriesData[0]") int itemIndex = item; return seriesData[0][itemIndex]; } @@ -185,10 +185,10 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(6) [][] seriesData = (double @ArrayLen(6) [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop - /*@IndexFor("seriesData[3]")*/ int itemIndex = item; + @IndexFor("seriesData[3]") int itemIndex = item; return seriesData[3][itemIndex]; } @@ -210,10 +210,10 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getStartX(int, int) */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(6) [][] seriesData = (double @ArrayLen(6) [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop - /*@IndexFor("seriesData[1]")*/ int itemIndex = item; + @IndexFor("seriesData[1]") int itemIndex = item; return seriesData[1][itemIndex]; } @@ -235,10 +235,10 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @see #getEndX(int, int) */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(6) [][] seriesData = (double @ArrayLen(6) [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop - /*@IndexFor("seriesData[2]")*/ int itemIndex = item; + @IndexFor("seriesData[2]") int itemIndex = item; return seriesData[2][itemIndex]; } @@ -260,10 +260,10 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @see #getStartY(int, int) */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); + public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(6) [][] seriesData = (double @ArrayLen(6) [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop - /*@IndexFor("seriesData[4]")*/ int itemIndex = item; + @IndexFor("seriesData[4]") int itemIndex = item; return seriesData[4][itemIndex]; } @@ -285,10 +285,10 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @see #getEndY(int, int) */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(6)*/ [][] seriesData = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(series); + public double getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(6) [][] seriesData = (double @ArrayLen(6) [][]) this.seriesList.get(series); @SuppressWarnings({"index", "value"}) // array-list interop - /*@IndexFor("seriesData[5]")*/ int itemIndex = item; + @IndexFor("seriesData[5]") int itemIndex = item; return seriesData[5][itemIndex]; } @@ -310,7 +310,7 @@ public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @see #getEndXValue(int, int) */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getEndXValue(series, item)); } @@ -332,7 +332,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @see #getEndYValue(int, int) */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getEndYValue(series, item)); } @@ -354,7 +354,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @see #getStartXValue(int, int) */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getStartXValue(series, item)); } @@ -376,7 +376,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getStartYValue(int, int) */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getStartYValue(series, item)); } @@ -398,7 +398,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getXValue(series, item)); } @@ -420,7 +420,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getYValue(series, item)); } @@ -435,7 +435,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * (x, xLow and xHigh) and the last three containing the y-values * (y, yLow and yHigh)). */ - public void addSeries(Comparable seriesKey, double /*@ArrayLen(6)*/ [][] data) { + public void addSeries(Comparable seriesKey, double @ArrayLen(6) [][] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); @@ -495,8 +495,8 @@ public boolean equals(Object obj) { return false; } for (int i = 0; i < this.seriesList.size(); i++) { - double[][] d1 = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(i); - double[][] d2 = (double /*@ArrayLen(6)*/ [][]) that.seriesList.get(i); + double[][] d1 = (double @ArrayLen(6) [][]) this.seriesList.get(i); + double[][] d2 = (double @ArrayLen(6) [][]) that.seriesList.get(i); double[] d1x = d1[0]; double[] d2x = d2[0]; if (!Arrays.equals(d1x, d2x)) { @@ -560,7 +560,7 @@ public Object clone() throws CloneNotSupportedException { clone.seriesKeys = new java.util.ArrayList(this.seriesKeys); clone.seriesList = new ArrayList(this.seriesList.size()); for (int i = 0; i < this.seriesList.size(); i++) { - double[][] data = (double /*@ArrayLen(6)*/ [][]) this.seriesList.get(i); + double[][] data = (double @ArrayLen(6) [][]) this.seriesList.get(i); double[] x = data[0]; double[] xStart = data[1]; double[] xEnd = data[2]; diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index f8e2a7979..73465ddc6 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -44,11 +44,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.Arrays; import java.util.Date; @@ -86,7 +86,7 @@ public DefaultOHLCDataset(Comparable key, OHLCDataItem[] data) { * @return The series key. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { return this.key; } @@ -99,7 +99,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = new Long(this.data[item].getDate().getTime()); return result; @@ -113,7 +113,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * * @return The x-value as a date. */ - public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Date getXDate(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Date result = this.data[item].getDate(); return result; @@ -128,7 +128,7 @@ public Date getXDate(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1 * @return The y value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getClose(series, item); } @@ -141,7 +141,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The high value. */ @Override - public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getHigh(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getHigh(); return result; @@ -157,7 +157,7 @@ public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The high-value. */ @Override - public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getHighValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number high = getHigh(series, item); if (high != null) { @@ -175,7 +175,7 @@ public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The low value. */ @Override - public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getLow(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getLow(); return result; @@ -191,7 +191,7 @@ public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1 * @return The low-value. */ @Override - public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getLowValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number low = getLow(series, item); if (low != null) { @@ -209,7 +209,7 @@ public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeri * @return The open value. */ @Override - public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getOpen(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getOpen(); return result; @@ -225,7 +225,7 @@ public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The open-value. */ @Override - public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getOpenValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number open = getOpen(series, item); if (open != null) { @@ -243,7 +243,7 @@ public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The close value. */ @Override - public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getClose(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getClose(); return result; @@ -259,7 +259,7 @@ public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries( * @return The close-value. */ @Override - public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getCloseValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number close = getClose(series, item); if (close != null) { @@ -277,7 +277,7 @@ public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSe * @return The trading volume. */ @Override - public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getVolume(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { @SuppressWarnings("index") // guaranteed index: There is only one series for an OHLC dataset, so this is always safe. Number result = this.data[item].getVolume(); return result; @@ -293,7 +293,7 @@ public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The volume-value. */ @Override - public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getVolumeValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { double result = Double.NaN; Number volume = getVolume(series, item); if (volume != null) { @@ -308,7 +308,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return 1. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return 1; } @@ -321,7 +321,7 @@ public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209: this.data is the same length as the conceptual getSeries called with any argument, but no SameLen annotation can express that due to the argument needed for getSeries - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.data.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index 79b5786eb..ae8f7fd7c 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -62,11 +62,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.util.ArrayList; import java.util.HashSet; @@ -216,7 +216,7 @@ public void updateXPoints() { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -226,7 +226,7 @@ public void updateXPoints() { * @return The number of x values in the dataset. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { if (this.xPoints == null) { return 0; } @@ -242,7 +242,7 @@ public void updateXPoints() { * * @return The series (never {@code null}). */ - public XYSeries getSeries(/*@NonNegative*/ int series) { + public XYSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Index outside valid range."); } @@ -257,7 +257,7 @@ public XYSeries getSeries(/*@NonNegative*/ int series) { * @return The key for a series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // check arguments...delegated return getSeries(series).getKey(); } @@ -270,10 +270,10 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The number of items in the specified series. */ @Override - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // check arguments...delegated @SuppressWarnings("index") // conflict between ghost method and real method - /*@LengthOf("this.getSeries(#1)")*/ int result = getSeries(series).getItemCount(); + @LengthOf("this.getSeries(#1)") int result = getSeries(series).getItemCount(); return result; } @@ -286,7 +286,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value for the specified series and item. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XYSeries s = (XYSeries) this.data.get(series); return s.getX(item); @@ -302,7 +302,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getStartX(series, item); } @@ -316,7 +316,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getEndX(series, item); } @@ -330,7 +330,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int index) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int index) { XYSeries s = (XYSeries) this.data.get(series); return s.getY(index); } @@ -344,7 +344,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting Y value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -357,7 +357,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending Y value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -404,7 +404,7 @@ public void removeSeries(XYSeries series) { * * @param series the series (zero based index). */ - public void removeSeries(/*@NonNegative*/ int series) { + public void removeSeries(@NonNegative int series) { // check arguments... if ((series < 0) || (series > getSeriesCount())) { diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index ff24817cb..668429ce6 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -46,12 +46,12 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.common.value.qual.ArrayLen; - */ + import java.io.Serializable; import java.util.Arrays; @@ -90,7 +90,7 @@ public DefaultWindDataset() { * * @throws NullPointerException if {@code data} is {@code null}. */ - public DefaultWindDataset(Object[][] /*@ArrayLen(3)*/ [] data) { + public DefaultWindDataset(Object[][] @ArrayLen(3) [] data) { this(seriesNameListFromDataArray(data), data); } @@ -103,7 +103,7 @@ public DefaultWindDataset(Object[][] /*@ArrayLen(3)*/ [] data) { * * @throws NullPointerException if {@code seriesNames} is {@code null}. */ - public DefaultWindDataset(String[] seriesNames, Object[][] /*@ArrayLen(3)*/ [] data) { + public DefaultWindDataset(String[] seriesNames, Object[][] @ArrayLen(3) [] data) { this(Arrays.asList(seriesNames), data); } @@ -131,7 +131,7 @@ public DefaultWindDataset(String[] seriesNames, Object[][] /*@ArrayLen(3)*/ [] d * match the number of series in the array. * @throws NullPointerException if {@code data} is {@code null}. */ - public DefaultWindDataset(List seriesKeys, Object[][] /*@ArrayLen(3)*/ [] data) { + public DefaultWindDataset(List seriesKeys, Object[][] @ArrayLen(3) [] data) { Args.nullNotPermitted(seriesKeys, "seriesKeys"); if (seriesKeys.size() != data.length) { throw new IllegalArgumentException("The number of series keys does " @@ -178,7 +178,7 @@ public DefaultWindDataset(List seriesKeys, Object[][] /*@ArrayLen(3)*/ [] data) * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.allSeriesData.size(); } @@ -191,7 +191,7 @@ public DefaultWindDataset(List seriesKeys, Object[][] /*@ArrayLen(3)*/ [] data) */ @Override @SuppressWarnings("index") // array-list interop: the annotation here expects this to be backed by a list of arrays, but its backed by a list of lists - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { if (series < 0 || series >= getSeriesCount()) { throw new IllegalArgumentException("Invalid series index: " + series); @@ -208,7 +208,7 @@ public DefaultWindDataset(List seriesKeys, Object[][] /*@ArrayLen(3)*/ [] data) * @return The series key. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { if (series < 0 || series >= getSeriesCount()) { throw new IllegalArgumentException("Invalid series index: " + series); @@ -227,7 +227,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value for the item within the series. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getX(); @@ -244,7 +244,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The y-value for the item within the series. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getWindForce(series, item); } @@ -258,7 +258,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The wind direction for the item within the series. */ @Override - public Number getWindDirection(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getWindDirection(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getWindDirection(); @@ -274,7 +274,7 @@ public Number getWindDirection(/*@NonNegative*/ int series, /*@IndexFor("this.ge * @return The wind force for the item within the series. */ @Override - public Number getWindForce(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getWindForce(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { List oneSeriesData = (List) this.allSeriesData.get(series); WindDataItem windItem = (WindDataItem) oneSeriesData.get(item); return windItem.getWindForce(); diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index 8582f75c3..25a3a29a4 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -42,11 +42,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.common.value.qual.ArrayLen; - */ + import java.util.ArrayList; import java.util.Arrays; @@ -76,7 +76,7 @@ public class DefaultXYDataset extends AbstractXYDataset * order of the series is significant. This list must be kept in sync * with the seriesKeys list. */ - private List<double /*@ArrayLen(2)*/ [][]> seriesList; + private List<double @ArrayLen(2) [][]> seriesList; /** * Creates a new {@code DefaultXYDataset} instance, initially @@ -93,7 +93,7 @@ public DefaultXYDataset() { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.seriesList.size(); } @@ -109,7 +109,7 @@ public DefaultXYDataset() { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -125,7 +125,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The index, or -1. */ @Override - public /*@GTENegativeOne*/ int indexOf(Comparable seriesKey) { + public @GTENegativeOne int indexOf(Comparable seriesKey) { return this.seriesKeys.indexOf(seriesKey); } @@ -153,13 +153,13 @@ public DomainOrder getDomainOrder() { * specified range. */ @Override - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @SuppressWarnings("index") //array-list interop: this.getSeries is the logical ghost variable representing this array - double /*@ArrayLen(2)*/ [] /*@SameLen("this.getSeries(#1)")*/ [] seriesArray = - (double /*@ArrayLen(2)*/ [][]) + double @ArrayLen(2) [] @SameLen("this.getSeries(#1)") [] seriesArray = + (double @ArrayLen(2) [][]) this.seriesList.get(series); return seriesArray[0].length; } @@ -182,10 +182,10 @@ public DomainOrder getDomainOrder() { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(2)*/ [][] seriesData = (double /*@ArrayLen(2)*/ [][]) this.seriesList.get(series); + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(2) [][] seriesData = (double @ArrayLen(2) [][]) this.seriesList.get(series); @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries - /*@IndexFor("seriesData[0]")*/ int itemIndex = item; + @IndexFor("seriesData[0]") int itemIndex = item; return seriesData[0][itemIndex]; } @@ -207,7 +207,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getXValue(series, item)); } @@ -229,10 +229,10 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(2)*/ [][] seriesData = (double /*@ArrayLen(2)*/ [][]) this.seriesList.get(series); + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(2) [][] seriesData = (double @ArrayLen(2) [][]) this.seriesList.get(series); @SuppressWarnings("index") // this.seriesList.get is equivalent to ghost method this.getSeries - /*@IndexFor("seriesData[1]")*/ int itemIndex = item; + @IndexFor("seriesData[1]") int itemIndex = item; return seriesData[1][itemIndex]; } @@ -254,7 +254,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getX(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getYValue(series, item)); } @@ -268,7 +268,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * arrays of equal length, the first containing the x-values and the * second containing the y-values). */ - public void addSeries(Comparable seriesKey, double /*@ArrayLen(2)*/ [][] data) { + public void addSeries(Comparable seriesKey, double @ArrayLen(2) [][] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); @@ -339,8 +339,8 @@ public boolean equals(Object obj) { return false; } for (int i = 0; i < this.seriesList.size(); i++) { - double[][] d1 = (double /*@ArrayLen(2)*/ [][]) this.seriesList.get(i); - double[][] d2 = (double /*@ArrayLen(2)*/ [][]) that.seriesList.get(i); + double[][] d1 = (double @ArrayLen(2) [][]) this.seriesList.get(i); + double[][] d2 = (double @ArrayLen(2) [][]) that.seriesList.get(i); double[] d1x = d1[0]; double[] d2x = d2[0]; if (!Arrays.equals(d1x, d2x)) { @@ -383,7 +383,7 @@ public Object clone() throws CloneNotSupportedException { clone.seriesKeys = new java.util.ArrayList(this.seriesKeys); clone.seriesList = new ArrayList(this.seriesList.size()); for (int i = 0; i < this.seriesList.size(); i++) { - double[][] data = (double /*@ArrayLen(2)*/ [][]) this.seriesList.get(i); + double[][] data = (double @ArrayLen(2) [][]) this.seriesList.get(i); double[] x = data[0]; double[] y = data[1]; double[] xx = new double[x.length]; diff --git a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java index c3cc0e91d..654ddd0ef 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java @@ -43,8 +43,8 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.common.value.qual.*; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.common.value.qual.*; import java.util.ArrayList; import java.util.Arrays; @@ -74,7 +74,7 @@ public class DefaultXYZDataset extends AbstractXYZDataset * order of the series is significant. This list must be kept in sync * with the seriesKeys list. */ - private List<double /*@ArrayLen(3)*/ [][]> seriesList; + private List<double @ArrayLen(3) [][]> seriesList; /** * Creates a new {@code DefaultXYZDataset} instance, initially @@ -91,7 +91,7 @@ public DefaultXYZDataset() { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.seriesList.size(); } @@ -107,7 +107,7 @@ public DefaultXYZDataset() { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -123,7 +123,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The index, or -1. */ @Override - public /*@GTENegativeOne*/ int indexOf(Comparable seriesKey) { + public @GTENegativeOne int indexOf(Comparable seriesKey) { return this.seriesKeys.indexOf(seriesKey); } @@ -151,13 +151,13 @@ public DomainOrder getDomainOrder() { * specified range. */ @Override - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @SuppressWarnings("index") // array-list interop: this.getSeries is the logical ghost variable representing this array - double /*@ArrayLen(3)*/ [] /*@SameLen("this.getSeries(#1)")*/ [] seriesArray = - (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); + double @ArrayLen(3) [] @SameLen("this.getSeries(#1)") [] seriesArray = + (double @ArrayLen(3) [][]) this.seriesList.get(series); return seriesArray[0].length; } @@ -179,10 +179,10 @@ public DomainOrder getDomainOrder() { * @see #getX(int, int) */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(3)*/ [][] seriesData = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(3) [][] seriesData = (double @ArrayLen(3) [][]) this.seriesList.get(series); @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries - /*@IndexFor("seriesData[0]")*/ int itemIndex = item; + @IndexFor("seriesData[0]") int itemIndex = item; return seriesData[0][itemIndex]; } @@ -204,7 +204,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getXValue(series, item)); } @@ -226,10 +226,10 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getY(int, int) */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(3)*/ [][] seriesData = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(3) [][] seriesData = (double @ArrayLen(3) [][]) this.seriesList.get(series); @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries - /*@IndexFor("seriesData[1]")*/ int itemIndex = item; + @IndexFor("seriesData[1]") int itemIndex = item; return seriesData[1][itemIndex]; } @@ -251,7 +251,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getX(int, int) */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getYValue(series, item)); } @@ -273,10 +273,10 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @see #getZ(int, int) */ @Override - public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { - double /*@ArrayLen(3)*/ [][] seriesData = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(series); + public double getZValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { + double @ArrayLen(3) [][] seriesData = (double @ArrayLen(3) [][]) this.seriesList.get(series); @SuppressWarnings("index") // this.seriesList.get is equivalent to this.getSeries - /*@IndexFor("seriesData[2]")*/ int itemIndex = item; + @IndexFor("seriesData[2]") int itemIndex = item; return seriesData[2][itemIndex]; } @@ -298,7 +298,7 @@ public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getZ(int, int) */ @Override - public Number getZ(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getZ(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getZValue(series, item)); } @@ -313,7 +313,7 @@ public Number getZ(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * second containing the y-values and the third containing the * z-values). */ - public void addSeries(Comparable seriesKey, double /*@ArrayLen(3)*/ [][] data) { + public void addSeries(Comparable seriesKey, double @ArrayLen(3) [][] data) { if (seriesKey == null) { throw new IllegalArgumentException( "The 'seriesKey' cannot be null."); @@ -385,8 +385,8 @@ public boolean equals(Object obj) { return false; } for (int i = 0; i < this.seriesList.size(); i++) { - double[][] d1 = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(i); - double[][] d2 = (double /*@ArrayLen(3)*/ [][]) that.seriesList.get(i); + double[][] d1 = (double @ArrayLen(3) [][]) this.seriesList.get(i); + double[][] d2 = (double @ArrayLen(3) [][]) that.seriesList.get(i); double[] d1x = d1[0]; double[] d2x = d2[0]; if (!Arrays.equals(d1x, d2x)) { @@ -434,7 +434,7 @@ public Object clone() throws CloneNotSupportedException { clone.seriesKeys = new java.util.ArrayList(this.seriesKeys); clone.seriesList = new ArrayList(this.seriesList.size()); for (int i = 0; i < this.seriesList.size(); i++) { - double[][] data = (double /*@ArrayLen(3)*/ [][]) this.seriesList.get(i); + double[][] data = (double @ArrayLen(3) [][]) this.seriesList.get(i); double[] x = data[0]; double[] y = data[1]; double[] z = data[2]; diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java index eabf4aafa..44cfd7a86 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java @@ -42,11 +42,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * An extension of the {@link XYDataset} interface that allows an x-interval @@ -67,7 +67,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The lower bound of the x-interval ({@code null} permitted). */ - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the lower bound of the x-interval (as a double primitive) for @@ -80,7 +80,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getStartX(int, int) */ - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the upper bound of the x-interval for the specified series and @@ -92,7 +92,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The upper bound of the x-interval ({@code null} permitted). */ - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the upper bound of the x-interval (as a double primitive) for @@ -105,7 +105,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getEndX(int, int) */ - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the lower bound of the y-interval for the specified series and @@ -117,7 +117,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The lower bound of the y-interval ({@code null} permitted). */ - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the lower bound of the y-interval (as a double primitive) for @@ -130,7 +130,7 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getStartY(int, int) */ - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the upper bound of the y-interval for the specified series and @@ -142,7 +142,7 @@ public interface IntervalXYDataset extends XYDataset { * * @return The upper bound of the y-interval ({@code null} permitted). */ - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the upper bound of the y-interval (as a double primitive) for @@ -155,6 +155,6 @@ public interface IntervalXYDataset extends XYDataset { * * @see #getEndY(int, int) */ - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); } diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java index cbf07b26e..806a1dbd6 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java @@ -52,11 +52,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; @@ -262,7 +262,7 @@ public double getIntervalWidth() { * * @see #getStartXValue(int, int) */ - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.dataset.getSeries(#1)") int item) { Number startX = null; Number x = this.dataset.getX(series, item); if (x != null) { @@ -282,7 +282,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.g * * @see #getStartX(int, int) */ - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.getSeries(#1)")*/ int item) { + public double getStartXValue(@NonNegative int series, @IndexFor("this.dataset.getSeries(#1)") int item) { return this.dataset.getXValue(series, item) - getIntervalPositionFactor() * getIntervalWidth(); } @@ -297,7 +297,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.data * * @see #getEndXValue(int, int) */ - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.dataset.getSeries(#1)") int item) { Number endX = null; Number x = this.dataset.getX(series, item); if (x != null) { @@ -317,7 +317,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.get * * @see #getEndX(int, int) */ - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.dataset.getSeries(#1)")*/ int item) { + public double getEndXValue(@NonNegative int series, @IndexFor("this.dataset.getSeries(#1)") int item) { return this.dataset.getXValue(series, item) + (1.0 - getIntervalPositionFactor()) * getIntervalWidth(); } @@ -420,7 +420,7 @@ private double recalculateInterval() { * * @return The interval width. */ - private double calculateIntervalForSeries(/*@NonNegative*/ int series) { + private double calculateIntervalForSeries(@NonNegative int series) { double result = Double.POSITIVE_INFINITY; int itemCount = this.dataset.getItemCount(series); if (itemCount > 1) { diff --git a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java index 5a72e3ba1..55f4f3f6c 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java @@ -39,11 +39,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * An extension of the {@link XYZDataset} interface that allows a range of data @@ -59,7 +59,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting X value for the specified series and item. */ - public Number getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the ending X value for the specified series and item. @@ -69,7 +69,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending X value for the specified series and item. */ - public Number getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the starting Y value for the specified series and item. @@ -79,7 +79,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting Y value for the specified series and item. */ - public Number getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the ending Y value for the specified series and item. @@ -89,7 +89,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending Y value for the specified series and item. */ - public Number getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the starting Z value for the specified series and item. @@ -99,7 +99,7 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The starting Z value for the specified series and item. */ - public Number getStartZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getStartZValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the ending Z value for the specified series and item. @@ -109,6 +109,6 @@ public interface IntervalXYZDataset extends XYZDataset { * * @return The ending Z value for the specified series and item. */ - public Number getEndZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getEndZValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index 9ab26ac6b..3f54468e5 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -46,7 +46,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; @@ -62,7 +62,7 @@ public class MatrixSeries extends Series implements Serializable { private static final long serialVersionUID = 7934188527308315704L; /** Series matrix values */ - protected double /*@SameLen("this")*/ [] /*@SameLen("this.data")*/ [] data; + protected double @SameLen("this") [] @SameLen("this.data") [] data; /** * Constructs a new matrix series. @@ -75,7 +75,7 @@ public class MatrixSeries extends Series implements Serializable { * @param columns the number of columns. */ @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 - public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int columns) { + public MatrixSeries(String name, @NonNegative int rows, @NonNegative int columns) { super(name); this.data = new double[rows][columns]; zeroAll(); @@ -87,7 +87,7 @@ public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int * @return The number of columns in this matrix series. */ @SuppressWarnings("index") // documentation bug: this method assumes that there is at least one row, but the documentation doesn't say so. This is a documentation bug. - public /*@LengthOf("this.data")*/ int getColumnsCount() { + public @LengthOf("this.data") int getColumnsCount() { return this.data[0].length; } @@ -102,7 +102,7 @@ public MatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int * * @see #get(int, int) */ - public Number getItem(/*@NonNegative*/ int itemIndex) { + public Number getItem(@NonNegative int itemIndex) { int i = getItemRow(itemIndex); int j = getItemColumn(itemIndex); @@ -119,7 +119,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * * @return The column of the specified item. */ - public /*@IndexFor("this.data")*/ int getItemColumn(/*@NonNegative*/ int itemIndex) { + public @IndexFor("this.data") int getItemColumn(@NonNegative int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex % getColumnsCount(); } @@ -131,7 +131,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * @return The item count. */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return getRowCount() * getColumnsCount(); } @@ -144,7 +144,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * @return The row of the specified item. */ @SuppressWarnings("index") // dividing the index by the column count results in a row index - public /*@IndexFor("this")*/ int getItemRow(/*@NonNegative*/ int itemIndex) { + public @IndexFor("this") int getItemRow(@NonNegative int itemIndex) { //assert itemIndex >= 0 && itemIndex < getItemCount(); return itemIndex / getColumnsCount(); } @@ -155,7 +155,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * * @return The number of rows in this matrix series. */ - public /*@LengthOf("this")*/ int getRowCount() { + public @LengthOf("this") int getRowCount() { return this.data.length; } @@ -171,7 +171,7 @@ public Number getItem(/*@NonNegative*/ int itemIndex) { * @see #getItem(int) * @see #update(int, int, double) */ - public double get(/*@IndexFor("this")*/ int i, /*@IndexFor("this.data")*/ int j) { + public double get(@IndexFor("this") int i, @IndexFor("this.data") int j) { return this.data[i][j]; } @@ -185,7 +185,7 @@ public double get(/*@IndexFor("this")*/ int i, /*@IndexFor("this.data")*/ int j) * * @see #get(int, int) */ - public void update(/*@IndexFor("this")*/ int i, /*@IndexFor("this.data")*/ int j, double mij) { + public void update(@IndexFor("this") int i, @IndexFor("this.data") int j, double mij) { this.data[i][j] = mij; fireSeriesChanged(); } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java index 23a157632..9e499a534 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java @@ -44,7 +44,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; import java.util.List; @@ -98,7 +98,7 @@ public MatrixSeriesCollection(MatrixSeries series) { */ @Override @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated correctly because some Series are mutable length - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int seriesIndex) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int seriesIndex) { return getSeries(seriesIndex).getItemCount(); } @@ -110,7 +110,7 @@ public MatrixSeriesCollection(MatrixSeries series) { * * @return The series. */ - public MatrixSeries getSeries(/*@NonNegative*/ int seriesIndex) { + public MatrixSeries getSeries(@NonNegative int seriesIndex) { if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) { throw new IllegalArgumentException("Index outside valid range."); } @@ -125,7 +125,7 @@ public MatrixSeries getSeries(/*@NonNegative*/ int seriesIndex) { * @return The number of series in the collection. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.seriesList.size(); } @@ -138,7 +138,7 @@ public MatrixSeries getSeries(/*@NonNegative*/ int seriesIndex) { * @return The key for a series. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int seriesIndex) { + public Comparable getSeriesKey(@NonNegative int seriesIndex) { return getSeries(seriesIndex).getKey(); } @@ -155,7 +155,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int seriesIndex) { * @see org.jfree.data.xy.XYDataset#getXValue(int, int) */ @Override - public Number getX(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { + public Number getX(@NonNegative int seriesIndex, @IndexFor("this.getSeries(#1)") int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); int x = series.getItemColumn(itemIndex); @@ -175,7 +175,7 @@ public Number getX(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries * @see org.jfree.data.xy.XYDataset#getYValue(int, int) */ @Override - public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { + public Number getY(@NonNegative int seriesIndex, @IndexFor("this.getSeries(#1)") int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); int y = series.getItemRow(itemIndex); @@ -195,7 +195,7 @@ public Number getY(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries * @see org.jfree.data.xy.XYZDataset#getZValue(int, int) */ @Override - public Number getZ(/*@NonNegative*/ int seriesIndex, /*@IndexFor("this.getSeries(#1)")*/ int itemIndex) { + public Number getZ(@NonNegative int seriesIndex, @IndexFor("this.getSeries(#1)") int itemIndex) { MatrixSeries series = (MatrixSeries) this.seriesList.get(seriesIndex); Number z = series.getItem(itemIndex); return z; @@ -316,7 +316,7 @@ public void removeSeries(MatrixSeries series) { * * @param seriesIndex the series (zero based index). */ - public void removeSeries(/*@NonNegative*/ int seriesIndex) { + public void removeSeries(@NonNegative int seriesIndex) { // check arguments... if ((seriesIndex < 0) || (seriesIndex > getSeriesCount())) { throw new IllegalArgumentException("Index outside valid range."); diff --git a/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java b/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java index 002b96ef0..22585bc41 100644 --- a/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java @@ -40,7 +40,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; /** * Represents a dense normalized matrix M[i,j] where each Mij item of the @@ -69,7 +69,7 @@ public class NormalizedMatrixSeries extends MatrixSeries { * @param rows the number of rows. * @param columns the number of columns. */ - public NormalizedMatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNegative*/ int columns) { + public NormalizedMatrixSeries(String name, @NonNegative int rows, @NonNegative int columns) { super(name, rows, columns); /* @@ -91,7 +91,7 @@ public NormalizedMatrixSeries(String name, /*@NonNegative*/ int rows, /*@NonNega * @see org.jfree.data.xy.MatrixSeries#getItem(int) */ @Override - public Number getItem(/*@NonNegative*/ int itemIndex) { + public Number getItem(@NonNegative int itemIndex) { int i = getItemRow(itemIndex); int j = getItemColumn(itemIndex); @@ -136,7 +136,7 @@ public double getScaleFactor() { * @see #get(int, int) */ @Override - public void update(/*@IndexFor("this")*/ int i, /*@IndexFor("this.data")*/ int j, double mij) { + public void update(@IndexFor("this") int i, @IndexFor("this.data") int j, double mij) { this.m_totalSum -= get(i, j); this.m_totalSum += mij; diff --git a/src/main/java/org/jfree/data/xy/OHLCDataset.java b/src/main/java/org/jfree/data/xy/OHLCDataset.java index 3a478b4e0..6093a83ad 100644 --- a/src/main/java/org/jfree/data/xy/OHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/OHLCDataset.java @@ -47,11 +47,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * An interface that defines data in the form of (x, high, low, open, close) @@ -67,7 +67,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getHigh(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getHigh(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the high-value (as a double primitive) for an item within a @@ -78,7 +78,7 @@ public interface OHLCDataset extends XYDataset { * * @return The high-value. */ - public double getHighValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getHighValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the low-value for the specified series and item. @@ -88,7 +88,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getLow(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getLow(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the low-value (as a double primitive) for an item within a @@ -99,7 +99,7 @@ public interface OHLCDataset extends XYDataset { * * @return The low-value. */ - public double getLowValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getLowValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the open-value for the specified series and item. @@ -109,7 +109,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getOpen(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getOpen(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the open-value (as a double primitive) for an item within a @@ -120,7 +120,7 @@ public interface OHLCDataset extends XYDataset { * * @return The open-value. */ - public double getOpenValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getOpenValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the y-value for the specified series and item. @@ -130,7 +130,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getClose(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getClose(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the close-value (as a double primitive) for an item within a @@ -141,7 +141,7 @@ public interface OHLCDataset extends XYDataset { * * @return The close-value. */ - public double getCloseValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getCloseValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the volume for the specified series and item. @@ -151,7 +151,7 @@ public interface OHLCDataset extends XYDataset { * * @return The value. */ - public Number getVolume(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getVolume(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the volume-value (as a double primitive) for an item within a @@ -162,6 +162,6 @@ public interface OHLCDataset extends XYDataset { * * @return The volume-value. */ - public double getVolumeValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getVolumeValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); } diff --git a/src/main/java/org/jfree/data/xy/TableXYDataset.java b/src/main/java/org/jfree/data/xy/TableXYDataset.java index 644820658..938a594c6 100644 --- a/src/main/java/org/jfree/data/xy/TableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/TableXYDataset.java @@ -41,7 +41,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; /** @@ -59,6 +59,6 @@ public interface TableXYDataset extends XYDataset { * * @return The item count. */ - public /*@NonNegative*/ int getItemCount(); + public @NonNegative int getItemCount(); } diff --git a/src/main/java/org/jfree/data/xy/VectorSeries.java b/src/main/java/org/jfree/data/xy/VectorSeries.java index a94962400..f49d028e2 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeries.java +++ b/src/main/java/org/jfree/data/xy/VectorSeries.java @@ -45,7 +45,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; @@ -118,7 +118,7 @@ public void add(VectorDataItem item, boolean notify) { * @return The item removed. */ @Override - public ComparableObjectItem remove(/*@NonNegative*/ int index) { + public ComparableObjectItem remove(@NonNegative int index) { VectorDataItem result = (VectorDataItem) this.data.remove(index); fireSeriesChanged(); return result; @@ -131,7 +131,7 @@ public ComparableObjectItem remove(/*@NonNegative*/ int index) { * * @return The x-value. */ - public double getXValue(/*@NonNegative*/ int index) { + public double getXValue(@NonNegative int index) { VectorDataItem item = (VectorDataItem) this.getDataItem(index); return item.getXValue(); } @@ -143,7 +143,7 @@ public double getXValue(/*@NonNegative*/ int index) { * * @return The y-value. */ - public double getYValue(/*@NonNegative*/ int index) { + public double getYValue(@NonNegative int index) { VectorDataItem item = (VectorDataItem) getDataItem(index); return item.getYValue(); } @@ -155,7 +155,7 @@ public double getYValue(/*@NonNegative*/ int index) { * * @return The x-component of the vector. */ - public double getVectorXValue(/*@NonNegative*/ int index) { + public double getVectorXValue(@NonNegative int index) { VectorDataItem item = (VectorDataItem) getDataItem(index); return item.getVectorX(); } @@ -167,7 +167,7 @@ public double getVectorXValue(/*@NonNegative*/ int index) { * * @return The y-component of the vector. */ - public double getVectorYValue(/*@NonNegative*/ int index) { + public double getVectorYValue(@NonNegative int index) { VectorDataItem item = (VectorDataItem) getDataItem(index); return item.getVectorY(); } @@ -180,7 +180,7 @@ public double getVectorYValue(/*@NonNegative*/ int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { + public ComparableObjectItem getDataItem(@NonNegative int index) { // overridden to make public return super.getDataItem(index); } diff --git a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java index a72db1ac1..9a5e9de92 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java @@ -44,11 +44,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.List; @@ -133,7 +133,7 @@ public void removeAllSeries() { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -147,7 +147,7 @@ public void removeAllSeries() { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public VectorSeries getSeries(/*@NonNegative*/ int series) { + public VectorSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -166,7 +166,7 @@ public VectorSeries getSeries(/*@NonNegative*/ int series) { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // defer argument checking return getSeries(series).getKey(); } @@ -179,7 +179,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * * @return The series index. */ - public /*@GTENegativeOne*/ int indexOf(VectorSeries series) { + public @GTENegativeOne int indexOf(VectorSeries series) { Args.nullNotPermitted(series, "series"); return this.data.indexOf(series); } @@ -196,7 +196,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -210,7 +210,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getXValue(); @@ -227,7 +227,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getXValue(series, item)); } @@ -240,7 +240,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The y-value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getYValue(); @@ -257,7 +257,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getYValue(series, item)); } @@ -270,7 +270,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The vector (possibly {@code null}). */ @Override - public Vector getVector(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Vector getVector(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVector(); @@ -285,7 +285,7 @@ public Vector getVector(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The x-component of the vector. */ @Override - public double getVectorXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getVectorXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVectorX(); @@ -300,7 +300,7 @@ public double getVectorXValue(/*@NonNegative*/ int series, /*@IndexFor("this.get * @return The y-component of the vector. */ @Override - public double getVectorYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getVectorYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { VectorSeries s = (VectorSeries) this.data.get(series); VectorDataItem di = (VectorDataItem) s.getDataItem(item); return di.getVectorY(); diff --git a/src/main/java/org/jfree/data/xy/VectorXYDataset.java b/src/main/java/org/jfree/data/xy/VectorXYDataset.java index 97a8ec519..13d7112b7 100644 --- a/src/main/java/org/jfree/data/xy/VectorXYDataset.java +++ b/src/main/java/org/jfree/data/xy/VectorXYDataset.java @@ -44,9 +44,9 @@ package org.jfree.data.xy; -/*>>> + import org.checkerframework.checker.index.qual.*; - */ + /** * An extension of the {@link XYDataset} interface that allows a vector to be @@ -64,7 +64,7 @@ public interface VectorXYDataset extends XYDataset { * * @return The x-component of the vector. */ - public double getVectorXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getVectorXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the y-component of the vector for an item in a series. @@ -74,7 +74,7 @@ public interface VectorXYDataset extends XYDataset { * * @return The y-component of the vector. */ - public double getVectorYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getVectorYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the vector for an item in a series. Depending on the particular @@ -88,6 +88,6 @@ public interface VectorXYDataset extends XYDataset { * * @return The vector (possibly {@code null}). */ - public Vector getVector(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Vector getVector(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); } diff --git a/src/main/java/org/jfree/data/xy/WindDataset.java b/src/main/java/org/jfree/data/xy/WindDataset.java index f585c0659..0b620bccf 100644 --- a/src/main/java/org/jfree/data/xy/WindDataset.java +++ b/src/main/java/org/jfree/data/xy/WindDataset.java @@ -40,11 +40,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * Interface for a dataset that supplies wind intensity and direction values @@ -63,7 +63,7 @@ public interface WindDataset extends XYDataset { * * @return The wind direction. */ - public Number getWindDirection(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getWindDirection(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the wind force on the Beaufort scale (0 to 12). See: @@ -77,6 +77,6 @@ public interface WindDataset extends XYDataset { * * @return The wind force. */ - public Number getWindForce(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getWindForce(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); } diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeries.java b/src/main/java/org/jfree/data/xy/XIntervalSeries.java index 18f337030..2002bc477 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeries.java @@ -41,7 +41,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; @@ -115,7 +115,7 @@ public void add(XIntervalDataItem item, boolean notify) { * * @return The x-value (never {@code null}). */ - public Number getX(/*@NonNegative*/ int index) { + public Number getX(@NonNegative int index) { XIntervalDataItem item = (XIntervalDataItem) getDataItem(index); return item.getX(); } @@ -129,7 +129,7 @@ public Number getX(/*@NonNegative*/ int index) { * * @since 1.0.10 */ - public double getXLowValue(/*@NonNegative*/ int index) { + public double getXLowValue(@NonNegative int index) { XIntervalDataItem item = (XIntervalDataItem) getDataItem(index); return item.getXLowValue(); } @@ -143,7 +143,7 @@ public double getXLowValue(/*@NonNegative*/ int index) { * * @since 1.0.10 */ - public double getXHighValue(/*@NonNegative*/ int index) { + public double getXHighValue(@NonNegative int index) { XIntervalDataItem item = (XIntervalDataItem) getDataItem(index); return item.getXHighValue(); } @@ -155,7 +155,7 @@ public double getXHighValue(/*@NonNegative*/ int index) { * * @return The y-value. */ - public double getYValue(/*@NonNegative*/ int index) { + public double getYValue(@NonNegative int index) { XIntervalDataItem item = (XIntervalDataItem) getDataItem(index); return item.getYValue(); } @@ -168,7 +168,7 @@ public double getYValue(/*@NonNegative*/ int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { + public ComparableObjectItem getDataItem(@NonNegative int index) { return super.getDataItem(index); } diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java index a2cdb2d5d..f293e1469 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java @@ -43,11 +43,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.List; @@ -96,7 +96,7 @@ public void addSeries(XIntervalSeries series) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -110,7 +110,7 @@ public void addSeries(XIntervalSeries series) { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public XIntervalSeries getSeries(/*@NonNegative*/ int series) { + public XIntervalSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -129,7 +129,7 @@ public XIntervalSeries getSeries(/*@NonNegative*/ int series) { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // defer argument checking return getSeries(series).getKey(); } @@ -146,7 +146,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // array-list interop: getSeries.getItemCount can't be annotated because some series are mutable - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -160,7 +160,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return di.getX(); @@ -176,7 +176,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getXLowValue(item); } @@ -191,7 +191,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getXHighValue(item); } @@ -206,7 +206,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -220,7 +220,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getYValue()); @@ -235,7 +235,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getXLowValue()); @@ -250,7 +250,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XIntervalSeries s = (XIntervalSeries) this.data.get(series); XIntervalDataItem di = (XIntervalDataItem) s.getDataItem(item); return new Double(di.getXHighValue()); @@ -266,7 +266,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -280,7 +280,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -292,7 +292,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * * @since 1.0.10 */ - public void removeSeries(/*@NonNegative*/ int series) { + public void removeSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds."); } diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index bc086c133..e8164472b 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -48,11 +48,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.chart.util.PublicCloneable; import org.jfree.data.general.DatasetChangeEvent; @@ -128,7 +128,7 @@ public void setBarWidth(double barWidth) { */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.underlying.getSeriesCount(); } @@ -141,7 +141,7 @@ public void setBarWidth(double barWidth) { * @return The series key. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { return this.underlying.getSeriesKey(series); } @@ -154,7 +154,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.underlying.getItemCount(series); } @@ -170,7 +170,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getX(series, item); } @@ -186,7 +186,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getXValue(series, item); } @@ -202,7 +202,7 @@ public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getY(series, item); } @@ -218,7 +218,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getYValue(series, item); } @@ -232,7 +232,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; Number xnum = this.underlying.getX(series, item); if (xnum != null) { @@ -253,7 +253,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getXValue(int, int) */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getXValue(series, item) - this.barWidth / 2.0; } @@ -267,7 +267,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; Number xnum = this.underlying.getX(series, item); if (xnum != null) { @@ -288,7 +288,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @see #getXValue(int, int) */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getXValue(series, item) + this.barWidth / 2.0; } @@ -302,7 +302,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getY(series, item); } @@ -318,7 +318,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @see #getYValue(int, int) */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getYValue(series, item); } @@ -332,7 +332,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS */ @Override @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getY(series, item); } @@ -348,7 +348,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @see #getYValue(int, int) */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getYValue(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYDataset.java b/src/main/java/org/jfree/data/xy/XYDataset.java index e5b6d5978..9cf815f02 100644 --- a/src/main/java/org/jfree/data/xy/XYDataset.java +++ b/src/main/java/org/jfree/data/xy/XYDataset.java @@ -46,11 +46,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import org.jfree.data.DomainOrder; import org.jfree.data.general.SeriesDataset; @@ -79,7 +79,7 @@ public interface XYDataset extends SeriesDataset { * * @return The item count. */ - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series); + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series); /** * Returns the x-value for an item within a series. The x-values may or @@ -93,7 +93,7 @@ public interface XYDataset extends SeriesDataset { * * @return The x-value (never {@code null}). */ - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the x-value for an item within a series. @@ -105,7 +105,7 @@ public interface XYDataset extends SeriesDataset { * * @return The x-value. */ - public double getXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the y-value for an item within a series. @@ -117,7 +117,7 @@ public interface XYDataset extends SeriesDataset { * * @return The y-value (possibly {@code null}). */ - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the y-value (as a double primitive) for an item within a series. @@ -129,6 +129,6 @@ public interface XYDataset extends SeriesDataset { * * @return The y-value. */ - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); } diff --git a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java index 7873ff748..beca270bb 100644 --- a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java +++ b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java @@ -43,7 +43,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; @@ -104,7 +104,7 @@ public void setModel(TableXYDataset dataset) { * @return The row count. */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { if (this.model == null) { return 0; } @@ -117,7 +117,7 @@ public void setModel(TableXYDataset dataset) { * @return The number of columns in the model. */ @Override - public /*@NonNegative*/ int getColumnCount() { + public @NonNegative int getColumnCount() { if (this.model == null) { return 0; } @@ -132,7 +132,7 @@ public void setModel(TableXYDataset dataset) { * @return The column name. */ @Override - public String getColumnName(/*@NonNegative*/ int column) { + public String getColumnName(@NonNegative int column) { if (this.model == null) { return super.getColumnName(column); } @@ -155,7 +155,7 @@ public String getColumnName(/*@NonNegative*/ int column) { */ @Override @SuppressWarnings("index") // array-list interop: this method relies on row being an index into a particular data series in the underlying dataset. The annotations can't neatly express that fact (not all implementations of this interface would even have an underlying dataset...), so I'm not sure how I'd verify this. - public Object getValueAt(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Object getValueAt(@NonNegative int row, @NonNegative int column) { if (this.model == null) { return null; } @@ -188,7 +188,7 @@ public void datasetChanged(DatasetChangeEvent event) { * @return {@code true} if the specified cell is editable. */ @Override - public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public boolean isCellEditable(@NonNegative int row, @NonNegative int column) { return false; } @@ -200,7 +200,7 @@ public boolean isCellEditable(/*@NonNegative*/ int row, /*@NonNegative*/ int col * @param column the column. */ @Override - public void setValueAt(Object value, /*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public void setValueAt(Object value, @NonNegative int row, @NonNegative int column) { if (isCellEditable(row, column)) { // XYDataset only provides methods for reading a dataset... } diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeries.java b/src/main/java/org/jfree/data/xy/XYIntervalSeries.java index 9b3d1ce12..d57876e68 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeries.java @@ -41,7 +41,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; @@ -118,7 +118,7 @@ public void add(XYIntervalDataItem item, boolean notify) { * * @return The x-value (never {@code null}). */ - public Number getX(/*@NonNegative*/ int index) { + public Number getX(@NonNegative int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getX(); } @@ -133,7 +133,7 @@ public Number getX(/*@NonNegative*/ int index) { * * @since 1.0.5 */ - public double getXLowValue(/*@NonNegative*/ int index) { + public double getXLowValue(@NonNegative int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getXLowValue(); } @@ -148,7 +148,7 @@ public double getXLowValue(/*@NonNegative*/ int index) { * * @since 1.0.5 */ - public double getXHighValue(/*@NonNegative*/ int index) { + public double getXHighValue(@NonNegative int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getXHighValue(); } @@ -160,7 +160,7 @@ public double getXHighValue(/*@NonNegative*/ int index) { * * @return The y-value. */ - public double getYValue(/*@NonNegative*/ int index) { + public double getYValue(@NonNegative int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getYValue(); } @@ -175,7 +175,7 @@ public double getYValue(/*@NonNegative*/ int index) { * * @since 1.0.5 */ - public double getYLowValue(/*@NonNegative*/ int index) { + public double getYLowValue(@NonNegative int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getYLowValue(); } @@ -190,7 +190,7 @@ public double getYLowValue(/*@NonNegative*/ int index) { * * @since 1.0.5 */ - public double getYHighValue(/*@NonNegative*/ int index) { + public double getYHighValue(@NonNegative int index) { XYIntervalDataItem item = (XYIntervalDataItem) getDataItem(index); return item.getYHighValue(); } @@ -203,7 +203,7 @@ public double getYHighValue(/*@NonNegative*/ int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { + public ComparableObjectItem getDataItem(@NonNegative int index) { return super.getDataItem(index); } diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java index f85ecbd8c..e03ea7755 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java @@ -45,11 +45,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.List; @@ -98,7 +98,7 @@ public void addSeries(XYIntervalSeries series) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -112,7 +112,7 @@ public void addSeries(XYIntervalSeries series) { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public XYIntervalSeries getSeries(/*@NonNegative*/ int series) { + public XYIntervalSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -131,7 +131,7 @@ public XYIntervalSeries getSeries(/*@NonNegative*/ int series) { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // defer argument checking return getSeries(series).getKey(); } @@ -148,7 +148,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -162,7 +162,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getX(item); } @@ -177,7 +177,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The value. */ @Override - public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getXLowValue(item); } @@ -192,7 +192,7 @@ public double getStartXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getXHighValue(item); } @@ -207,7 +207,7 @@ public double getEndXValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -222,7 +222,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYLowValue(item); } @@ -237,7 +237,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XYIntervalSeries s = (XYIntervalSeries) this.data.get(series); return s.getYHighValue(item); } @@ -251,7 +251,7 @@ public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getYValue(series, item)); } @@ -264,7 +264,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getStartXValue(series, item)); } @@ -277,7 +277,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getEndXValue(series, item)); } @@ -291,7 +291,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getStartYValue(series, item)); } @@ -305,7 +305,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return new Double(getEndYValue(series, item)); } @@ -317,7 +317,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * * @since 1.0.10 */ - public void removeSeries(/*@NonNegative*/ int series) { + public void removeSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds."); } diff --git a/src/main/java/org/jfree/data/xy/XYItemKey.java b/src/main/java/org/jfree/data/xy/XYItemKey.java index 2d0bdaae7..bad67b308 100644 --- a/src/main/java/org/jfree/data/xy/XYItemKey.java +++ b/src/main/java/org/jfree/data/xy/XYItemKey.java @@ -39,7 +39,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; import java.io.Serializable; import org.jfree.chart.util.ObjectUtils; @@ -70,7 +70,7 @@ public class XYItemKey<S extends Comparable<S>> implements ItemKey, * @param seriesKey the series key. * @param itemIndex the item index. */ - public XYItemKey(S seriesKey, /*@NonNegative*/ int itemIndex) { + public XYItemKey(S seriesKey, @NonNegative int itemIndex) { Args.nullNotPermitted(seriesKey, "seriesKey"); this.seriesKey = seriesKey; this.itemIndex = itemIndex; diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index 8e767b592..a194cd094 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -79,8 +79,8 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; import java.util.Collections; @@ -113,7 +113,7 @@ public class XYSeries extends Series implements Cloneable, Serializable { protected List data; /** The maximum number of items for the series. */ - private /*@NonNegative*/ int maximumItemCount = Integer.MAX_VALUE; + private @NonNegative int maximumItemCount = Integer.MAX_VALUE; /** * A flag that controls whether the items are automatically sorted @@ -346,7 +346,7 @@ public boolean getAllowDuplicateXValues() { * @see #getItems() */ @Override - public /*@NonNegative*/ int getItemCount() { + public @NonNegative int getItemCount() { return this.data.size(); } @@ -368,7 +368,7 @@ public List getItems() { * * @see #setMaximumItemCount(int) */ - public /*@NonNegative*/ int getMaximumItemCount() { + public @NonNegative int getMaximumItemCount() { return this.maximumItemCount; } @@ -386,7 +386,7 @@ public List getItems() { * * @param maximum the maximum number of items for the series. */ - public void setMaximumItemCount(/*@NonNegative*/ int maximum) { + public void setMaximumItemCount(@NonNegative int maximum) { this.maximumItemCount = maximum; int remove = this.data.size() - maximum; if (remove > 0) { @@ -513,7 +513,7 @@ public void add(XYDataItem item, boolean notify) { int index = Collections.binarySearch(this.data, item); if (index < 0) { @SuppressWarnings("index") // binary search on list - /*@NonNegative*/ int newIndex = -index - 1; + @NonNegative int newIndex = -index - 1; this.data.add(newIndex, item); } else { @@ -564,7 +564,7 @@ public void add(XYDataItem item, boolean notify) { * @param start the start index (zero-based). * @param end the end index (zero-based). */ - public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { + public void delete(@NonNegative int start, @NonNegative int end) { this.data.subList(start, end + 1).clear(); findBoundsByIteration(); fireSeriesChanged(); @@ -578,7 +578,7 @@ public void delete(/*@NonNegative*/ int start, /*@NonNegative*/ int end) { * * @return The item removed. */ - public XYDataItem remove(/*@NonNegative*/ int index) { + public XYDataItem remove(@NonNegative int index) { XYDataItem removed = (XYDataItem) this.data.remove(index); updateBoundsForRemovedItem(removed); fireSeriesChanged(); @@ -622,7 +622,7 @@ public void clear() { * * @return The data item with the specified index. */ - public XYDataItem getDataItem(/*@NonNegative*/ int index) { + public XYDataItem getDataItem(@NonNegative int index) { XYDataItem item = (XYDataItem) this.data.get(index); return (XYDataItem) item.clone(); } @@ -636,7 +636,7 @@ public XYDataItem getDataItem(/*@NonNegative*/ int index) { * * @since 1.0.14 */ - XYDataItem getRawDataItem(/*@NonNegative*/ int index) { + XYDataItem getRawDataItem(@NonNegative int index) { return (XYDataItem) this.data.get(index); } @@ -647,7 +647,7 @@ XYDataItem getRawDataItem(/*@NonNegative*/ int index) { * * @return The x-value (never {@code null}). */ - public Number getX(/*@NonNegative*/ int index) { + public Number getX(@NonNegative int index) { return getRawDataItem(index).getX(); } @@ -658,7 +658,7 @@ public Number getX(/*@NonNegative*/ int index) { * * @return The y-value (possibly {@code null}). */ - public Number getY(/*@NonNegative*/ int index) { + public Number getY(@NonNegative int index) { return getRawDataItem(index).getY(); } @@ -709,7 +709,7 @@ private double maxIgnoreNaN(double a, double b) { * * @since 1.0.1 */ - public void updateByIndex(/*@NonNegative*/ int index, Number y) { + public void updateByIndex(@NonNegative int index, Number y) { XYDataItem item = getRawDataItem(index); // figure out if we need to iterate through all the y-values @@ -827,7 +827,7 @@ else if (item.getY() != null) { item = (XYDataItem) item.clone(); if (this.autoSort) { @SuppressWarnings("index") // binary search on list - /*@NonNegative*/ int addIndex = -index - 1; + @NonNegative int addIndex = -index - 1; this.data.add(addIndex, item); } else { @@ -919,7 +919,7 @@ public Object clone() throws CloneNotSupportedException { * * @throws CloneNotSupportedException if there is a cloning problem. */ - public XYSeries createCopy(/*@NonNegative*/ int start, /*@NonNegative*/ int end) + public XYSeries createCopy(@NonNegative int start, @NonNegative int end) throws CloneNotSupportedException { XYSeries copy = (XYSeries) super.clone(); diff --git a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java index 64ba0eafe..795c00070 100644 --- a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java @@ -64,11 +64,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; @@ -175,7 +175,7 @@ public void addSeries(XYSeries series) { * * @param series the series index (zero-based). */ - public void removeSeries(/*@NonNegative*/ int series) { + public void removeSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds."); } @@ -225,7 +225,7 @@ public void removeAllSeries() { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -248,7 +248,7 @@ public List getSeries() { * * @since 1.0.6 */ - public /*@GTENegativeOne*/ int indexOf(XYSeries series) { + public @GTENegativeOne int indexOf(XYSeries series) { Args.nullNotPermitted(series, "series"); return this.data.indexOf(series); } @@ -263,7 +263,7 @@ public List getSeries() { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public XYSeries getSeries(/*@NonNegative*/ int series) { + public XYSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -306,7 +306,7 @@ public XYSeries getSeries(Comparable key) { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // defer argument checking return getSeries(series).getKey(); } @@ -321,7 +321,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * * @since 1.0.14 */ - public /*@GTENegativeOne*/ int getSeriesIndex(Comparable key) { + public @GTENegativeOne int getSeriesIndex(Comparable key) { Args.nullNotPermitted(key, "key"); int seriesCount = getSeriesCount(); for (int i = 0; i < seriesCount; i++) { @@ -345,7 +345,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -359,7 +359,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { XYSeries s = (XYSeries) this.data.get(series); return s.getX(item); } @@ -374,7 +374,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" */ @Override @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getStartX(series, item); } @@ -388,7 +388,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries */ @Override @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getEndX(series, item); } @@ -401,7 +401,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The value (possibly {@code null}). */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int index) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int index) { XYSeries s = (XYSeries) this.data.get(series); return s.getY(index); } @@ -415,7 +415,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The starting Y value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } @@ -428,7 +428,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The ending Y value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYZDataset.java b/src/main/java/org/jfree/data/xy/XYZDataset.java index ea5e0c3d0..6ae12373b 100644 --- a/src/main/java/org/jfree/data/xy/XYZDataset.java +++ b/src/main/java/org/jfree/data/xy/XYZDataset.java @@ -42,11 +42,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * The interface through which JFreeChart obtains data in the form of (x, y, z) @@ -62,7 +62,7 @@ public interface XYZDataset extends XYDataset { * * @return The z-value (possibly {@code null}). */ - public Number getZ(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public Number getZ(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); /** * Returns the z-value (as a double primitive) for an item within a series. @@ -72,6 +72,6 @@ public interface XYZDataset extends XYDataset { * * @return The z-value. */ - public double getZValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item); + public double getZValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item); } diff --git a/src/main/java/org/jfree/data/xy/XisSymbolic.java b/src/main/java/org/jfree/data/xy/XisSymbolic.java index 8aa724f6a..50895de79 100644 --- a/src/main/java/org/jfree/data/xy/XisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/XisSymbolic.java @@ -41,11 +41,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + /** * Represent a data set where X is a symbolic values. Each symbolic value is @@ -69,7 +69,7 @@ public interface XisSymbolic { * * @return The symbolic value. */ - public String getXSymbolicValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public String getXSymbolicValue(@NonNegative int series, @NonNegative int item); /** * Returns the symbolic value linked with the specified {@code Integer}. diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeries.java b/src/main/java/org/jfree/data/xy/YIntervalSeries.java index 936ec6f96..85d3c7158 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeries.java @@ -41,7 +41,7 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.NonNegative; */ +import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.ComparableObjectItem; import org.jfree.data.ComparableObjectSeries; @@ -115,7 +115,7 @@ public void add(YIntervalDataItem item, boolean notify) { * * @return The x-value (never {@code null}). */ - public Number getX(/*@NonNegative*/ int index) { + public Number getX(@NonNegative int index) { YIntervalDataItem item = (YIntervalDataItem) getDataItem(index); return item.getX(); } @@ -127,7 +127,7 @@ public Number getX(/*@NonNegative*/ int index) { * * @return The y-value. */ - public double getYValue(/*@NonNegative*/ int index) { + public double getYValue(@NonNegative int index) { YIntervalDataItem item = (YIntervalDataItem) getDataItem(index); return item.getYValue(); } @@ -142,7 +142,7 @@ public double getYValue(/*@NonNegative*/ int index) { * * @since 1.0.5 */ - public double getYLowValue(/*@NonNegative*/ int index) { + public double getYLowValue(@NonNegative int index) { YIntervalDataItem item = (YIntervalDataItem) getDataItem(index); return item.getYLowValue(); } @@ -157,7 +157,7 @@ public double getYLowValue(/*@NonNegative*/ int index) { * * @since 1.0.5 */ - public double getYHighValue(/*@NonNegative*/ int index) { + public double getYHighValue(@NonNegative int index) { YIntervalDataItem item = (YIntervalDataItem) getDataItem(index); return item.getYHighValue(); } @@ -170,7 +170,7 @@ public double getYHighValue(/*@NonNegative*/ int index) { * @return The data item. */ @Override - public ComparableObjectItem getDataItem(/*@NonNegative*/ int index) { + public ComparableObjectItem getDataItem(@NonNegative int index) { return super.getDataItem(index); } diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java index b21f43c2c..9611f7fc5 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java @@ -45,11 +45,11 @@ */ package org.jfree.data.xy; -/*>>> import org.checkerframework.checker.index.qual.*; */ +import org.checkerframework.checker.index.qual.*; + -/*>>> import org.checkerframework.checker.index.qual.NonNegative; - */ + import java.io.Serializable; import java.util.List; @@ -98,7 +98,7 @@ public void addSeries(YIntervalSeries series) { * @return The series count. */ @Override - public /*@NonNegative*/ int getSeriesCount() { + public @NonNegative int getSeriesCount() { return this.data.size(); } @@ -112,7 +112,7 @@ public void addSeries(YIntervalSeries series) { * @throws IllegalArgumentException if {@code series} is not in the * range {@code 0} to {@code getSeriesCount() - 1}. */ - public YIntervalSeries getSeries(/*@NonNegative*/ int series) { + public YIntervalSeries getSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds"); } @@ -131,7 +131,7 @@ public YIntervalSeries getSeries(/*@NonNegative*/ int series) { * specified range. */ @Override - public Comparable getSeriesKey(/*@NonNegative*/ int series) { + public Comparable getSeriesKey(@NonNegative int series) { // defer argument checking return getSeries(series).getKey(); } @@ -148,7 +148,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { */ @Override @SuppressWarnings("index") // array-list interop: getSeries.getItemCount cannot be annotated because some series are mutable - public /*@LengthOf("this.getSeries(#1)")*/ int getItemCount(/*@NonNegative*/ int series) { + public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // defer argument checking return getSeries(series).getItemCount(); } @@ -162,7 +162,7 @@ public Comparable getSeriesKey(/*@NonNegative*/ int series) { * @return The x-value. */ @Override - public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getX(item); } @@ -177,7 +177,7 @@ public Number getX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The value. */ @Override - public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYValue(item); } @@ -192,7 +192,7 @@ public double getYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The value. */ @Override - public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYLowValue(item); } @@ -207,7 +207,7 @@ public double getStartYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getS * @return The value. */ @Override - public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public double getEndYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return s.getYHighValue(item); } @@ -221,7 +221,7 @@ public double getEndYValue(/*@NonNegative*/ int series, /*@IndexFor("this.getSer * @return The y-value. */ @Override - public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYValue(item)); } @@ -236,7 +236,7 @@ public Number getY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)" * @return The x-value. */ @Override - public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getX(series, item); } @@ -250,7 +250,7 @@ public Number getStartX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The x-value. */ @Override - public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return getX(series, item); } @@ -263,7 +263,7 @@ public Number getEndX(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * @return The start y-value. */ @Override - public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYLowValue(item)); } @@ -277,7 +277,7 @@ public Number getStartY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries * @return The end y-value. */ @Override - public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(#1)")*/ int item) { + public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { YIntervalSeries s = (YIntervalSeries) this.data.get(series); return new Double(s.getYHighValue(item)); } @@ -290,7 +290,7 @@ public Number getEndY(/*@NonNegative*/ int series, /*@IndexFor("this.getSeries(# * * @since 1.0.10 */ - public void removeSeries(/*@NonNegative*/ int series) { + public void removeSeries(@NonNegative int series) { if ((series < 0) || (series >= getSeriesCount())) { throw new IllegalArgumentException("Series index out of bounds."); } diff --git a/src/main/java/org/jfree/data/xy/YisSymbolic.java b/src/main/java/org/jfree/data/xy/YisSymbolic.java index ab8fb3e45..b30a2da73 100644 --- a/src/main/java/org/jfree/data/xy/YisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/YisSymbolic.java @@ -43,9 +43,9 @@ package org.jfree.data.xy; -/*>>> + import org.checkerframework.checker.index.qual.*; - */ + /** * Represent a data set where Y is a symbolic values. Each symbolic value is @@ -69,7 +69,7 @@ public interface YisSymbolic { * * @return The symbolic value. */ - public String getYSymbolicValue(/*@NonNegative*/ int series, /*@NonNegative*/ int item); + public String getYSymbolicValue(@NonNegative int series, @NonNegative int item); /** * Returns the symbolic value linked with the specified {@code Integer}. diff --git a/src/test/java/org/jfree/chart/GanttChartTest.java b/src/test/java/org/jfree/chart/GanttChartTest.java index 5c87ddbfb..ae8a44dce 100644 --- a/src/test/java/org/jfree/chart/GanttChartTest.java +++ b/src/test/java/org/jfree/chart/GanttChartTest.java @@ -271,7 +271,7 @@ public static IntervalCategoryDataset createDataset() { * * @return a date. */ - private static Date date(/*@IntRange(from = 1, to = 31)*/ int day, /*@IntRange(from = 1, to = 12)*/ int month, /*@IntRange(from = 1900, to = 9999)*/ int year) { + private static Date date(@IntRange(from = 1, to = 31) int day, /*@IntRange(from = 1, to = 12)*/ int month, @IntRange(from = 1900, to = 9999) int year) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month, day); diff --git a/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java b/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java index 6357035d6..e0baa39c6 100644 --- a/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java +++ b/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java @@ -203,7 +203,7 @@ public void testBug1572478Vertical() { = new DefaultBoxAndWhiskerCategoryDataset() { @Override - public Number getQ1Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getQ1Value(@NonNegative int row, @NonNegative int column) { return null; } @@ -248,7 +248,7 @@ public void testBug1572478Horizontal() { = new DefaultBoxAndWhiskerCategoryDataset() { @Override - public Number getQ1Value(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + public Number getQ1Value(@NonNegative int row, @NonNegative int column) { return null; } diff --git a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java index 6295ac64c..f771e7a7a 100644 --- a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java +++ b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java @@ -74,7 +74,7 @@ public TestIntervalCategoryDataset() { * @see #getColumnCount() */ @Override - public /*@NonNegative*/ int getRowCount() { + public @NonNegative int getRowCount() { return this.data.getRowCount(); } @@ -85,9 +85,9 @@ public TestIntervalCategoryDataset() { * * @see #getRowCount() */ - /*@Pure*/ + @Pure @Override - public /*@NonNegative*/ int getColumnCount() { + public @NonNegative int getColumnCount() { return this.data.getColumnCount(); } @@ -103,8 +103,8 @@ public TestIntervalCategoryDataset() { * @see #removeValue(Comparable, Comparable) */ @Override - /*@Pure*/ - public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { + @Pure + public Number getValue(@NonNegative int row, @NonNegative int column) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(row, column); if (item == null) { @@ -125,7 +125,7 @@ public Number getValue(/*@NonNegative*/ int row, /*@NonNegative*/ int column) { * @see #getColumnKey(int) */ @Override - public Comparable getRowKey(/*@NonNegative*/ int row) { + public Comparable getRowKey(@NonNegative int row) { return this.data.getRowKey(row); } @@ -139,7 +139,7 @@ public Comparable getRowKey(/*@NonNegative*/ int row) { * @see #getRowKey(int) */ @Override - public /*@GTENegativeOne*/ int getRowIndex(Comparable key) { + public @GTENegativeOne int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -166,7 +166,7 @@ public List getRowKeys() { * @see #getColumnIndex(Comparable) */ @Override - public Comparable getColumnKey(/*@NonNegative*/ int column) { + public Comparable getColumnKey(@NonNegative int column) { return this.data.getColumnKey(column); } @@ -180,7 +180,7 @@ public Comparable getColumnKey(/*@NonNegative*/ int column) { * @see #getColumnKey(int) */ @Override - public /*@GTENegativeOne*/ int getColumnIndex(Comparable key) { + public @GTENegativeOne int getColumnIndex(Comparable key) { // defer null argument check return this.data.getColumnIndex(key); } @@ -306,7 +306,7 @@ public void removeItem(Comparable rowKey, Comparable columnKey) { * * @see #removeColumn(int) */ - public void removeRow(/*@NonNegative*/ int rowIndex) { + public void removeRow(@NonNegative int rowIndex) { this.data.removeRow(rowIndex); fireDatasetChanged(); } @@ -332,7 +332,7 @@ public void removeRow(Comparable rowKey) { * * @see #removeRow(int) */ - public void removeColumn(/*@NonNegative*/ int columnIndex) { + public void removeColumn(@NonNegative int columnIndex) { this.data.removeColumn(columnIndex); fireDatasetChanged(); } @@ -430,7 +430,7 @@ public Object clone() throws CloneNotSupportedException { } @Override - public Number getStartValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { + public Number getStartValue(@NonNegative int series, @NonNegative int category) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(series, category); if (item == null) { @@ -450,7 +450,7 @@ public Number getStartValue(Comparable series, Comparable category) { } @Override - public Number getEndValue(/*@NonNegative*/ int series, /*@NonNegative*/ int category) { + public Number getEndValue(@NonNegative int series, @NonNegative int category) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(series, category); if (item == null) { From 787248d320c0c181192531b067fe77e06995e099 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Tue, 1 May 2018 15:58:36 -0700 Subject: [PATCH 62/79] remove old lib file, delete them from .gitignore --- .gitignore | 6 ------ lib/hamcrest-core-1.3.jar | Bin 45024 -> 0 bytes lib/jfreesvg-3.2.jar | Bin 44171 -> 0 bytes lib/junit-4.11.jar | Bin 245039 -> 0 bytes lib/orsonpdf-1.7.jar | Bin 68247 -> 0 bytes lib/servlet.jar | Bin 80054 -> 0 bytes 6 files changed, 6 deletions(-) delete mode 100644 lib/hamcrest-core-1.3.jar delete mode 100644 lib/jfreesvg-3.2.jar delete mode 100644 lib/junit-4.11.jar delete mode 100644 lib/orsonpdf-1.7.jar delete mode 100644 lib/servlet.jar diff --git a/.gitignore b/.gitignore index b5ddcde64..28761933d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,12 +3,6 @@ /javadoc/ build/ -jfreechart-*-javadocs.zip -jfreechart-*.zip -lib/jfreechart-*-src.jar -lib/jfreechart-*.jar - -ant/check-index-output*.txt # Eclipse files # /.classpath diff --git a/lib/hamcrest-core-1.3.jar b/lib/hamcrest-core-1.3.jar deleted file mode 100644 index 9d5fe16e3dd37ebe79a36f61f5d0e1a69a653a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45024 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 UgpPtD2z>DYYp}SJr5?)v0beu;=l}o! diff --git a/lib/jfreesvg-3.2.jar b/lib/jfreesvg-3.2.jar deleted file mode 100644 index cafda668002c68732f8c37870307c12ab64df702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44171 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 diff --git a/lib/junit-4.11.jar b/lib/junit-4.11.jar deleted file mode 100644 index aaf74448492932e95902b40a70c7a4da5bad4744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245039 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 rNwV0TBI*gs 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�d$6y8!%;jJ!Sh9Zrg&~EH&o(2T=f<*UC{pPz4_L ze?a>M8c=&;_ulWXLi+_<P|k6gG@=O&lnA@hNnzb(*ngX_AY(PKCYz#PhKkENRdq4b zSf0x8R$4JuQ%y4+oTFpQlFUr0iLDCSJ@DZD&>z5Zqqbr{fQ{m<jHOnK0SEIJ43hJd z?|<OD9whiF?mCTeOF{6vW{<&Bsb9u2ozcaWs%p=yOZX@AIrPb3HMIWV1@ulI3-s@( zUMWtWBkbxv(V!~D;*O1T3XdvxVYzem?JDIfmP`BP>lHN+e`$=JR~|IajRo6f$tqA7 zCtEDNZPwx!8MvRf2w<N>PGAm=x?*gU9&Y~+WA7LyS)g5kPEXrLwQbwBZA{y?ZQHhO zP209@yQej;Z*r5D+?RYWf9ijIwd<U<*Iu9*u9v^1!!CU+GykQQeY-~k`d3u4&)4l# zEJD&ak%Ezik5Z89-F@6VPz1q7UTw&kro1vK2E|52*~z)v=H;xTd>Rcx{#LI`29TME zQqZ{^_I{cvPFv~#tU=h~mj6slolR$50a-C*A>PN;CfMJE*bt0+^tUuO@5Ge6vy6;t zd3Je|o0k%3AipBK1?K(~O@E%TCPDi))QMdCuq65yEnl-jh20`xI%f*iaL}c;BoLqf ziPTdL@+2gr)>ea&l6gUlxZq8wKx@kFZyvb8Tiy!w0`*~h+$}{Z$?kd0%hC3>Mn0jp z@*En)K`zH-?t|D~Zhq|F)jqDpNaAp1LG!W_iKvft^X~2riMuj*RP&P%t9FuvAUQae z?CVuqvMd_NK7)i6&N*!Xa2t?ecn23!7gSI!;x)Ssf^!ccmZ6QJiu}&SVkgTnH19^5 zn(e;oM)lXRs3TcRH`O^e)3*kR0c;5jA;SAaXPfvUjG@3&#G~-Z!iq6@4(pNZzUlRV zS=2sdeJe`navZX@ucL`308h95micO1yB3X4R8S;HgIVE#=oF^0tLPEK0)qWlb4H+N z)1`i>4aw;kz)AhPViojtTswDP3-PK1ORGZyUcjKxMxc17CGwQahoYh_KTiYo1%=<3 zq!qIXZgz)}nk?dF?vgU;x6n@b-nw^OzcVm7<jReZd7I`o_#at<vrjMDGMnN%)&x5) zN;~j?)j-m9SRphNs#%yY4QNdX+8Nb&*kXfcpa#KV5@t30c4cef=8R*;tExWDjO1O# z3}1vRX2bWCg@|&ppqr2;yqv4sQ1IO?sX*J>JkyI|C>&S+zhd(K-u;wf6Cf)UQ7H_A zbMeVOK;G#Ugjpec(Ts|U8KU@Pt5h-Y$B<RzgmyZjd5<6*Wl=r4Bb)ch&ER<m72?-> znG81w!%cYotIt5n$|@xc(;PB|6&BppAgFYtvxL#RKS*)yVKS430aL=-H2K9}Kc<uF za5~K#Qi2N8Hp$f{%%#mAl|6?IEie~i3@i#;*FAqcj?cWPc%G{}%)07gF1QYuJ)WfR zjq-(}s7~eOuO|+-ccq=J6SbMB1mCB!m<OeoEE|_Ot~|x8EqwtoW3PEvblcGVF~zbO zgv+|>FN+rh#SXy}gZLq4e&h4A4|q|9CkzF*f5|P49hW4BEc^n)WuHN!UnxO4n{H&6 z@%~zN@bsM^A->=Fm7Z6Sw--}w-=V71&3b@TIJ{qs(bg|UHbM~`s1<q(25IbKcqTTH zzRsW8ifGnKIEye1sMK*;s8Kt~`1-?axGuac?=ep5P_T|W8yqdRQd*SmJ2Qn1ndL;Z z84Kv%AgDWY*lNT#_-8KaPclyFHR8&UVB+kFx-odTtWNE@K6=RP#8ieRZo1S76+*pS zqKh0dcDzz-cLF&P`bt9a8YA!{hZNU0vty%klZ1s_1zkmf<G0bihyG?@cD_PwsP^<( zZL&Haxx8Z8-86v<LU*beZE{Zxd8Gz=7yL_D57#`#Q)l7PdY!g5R=(upgo6Ox=`45V z$_dh?k4woI*y&1OH*}SZE%I7;4?4>@I@>L8N)1juxbde@TY(B*a<<7A5FWOCpST>? zM%;7~9eQC!!&#!6{!RT;EcfF*4R4?mmWHPH#pd?is=V7Dbc%Mm1-o5Q5^li}Z<Wf6 zdPGG%vSB`fk~f*khqAx;w)?#wGj|c+ByQPR&dF|BpVn{0Vcn!Mq}&t7(pbk~rXlGh z&X76w1Rz!-v*N-#k+n`21BFmzOA;9*G6)+AgFg6x@CHUit|uq>15G%-qwcWZaKYl( zv0xJ9cA?NeqG<)YVa7l~#Z$T6=^st>Pm4EuB=J8JlTJVZ>K=4xXc3SoW51ESB%@Y- z6_5HMd62d48@$OD*RnQV{+HCkf1uQwLe2||Z$D5y>i@=g{3i<i$L8?w>sqn;A7A7V z)W0z#?#AW>Eo}zC0$`b=3D)TdNOd?$2dm-8S|usKh;j2Gnj6sf<2u#9`N?_aA7vLF ziLDnpnXT6a;Q)fbMQZDh;x}B~HxGPfZze9z(3d`Mfi5OHlb#PTH=YlwGk;IcB7d;% z?ci<(u|14vouA&R!rKgQ5O-|>qvP%-x!yK|lXNWvs<?&qc1=Wbc4f|N6YX_peegow zoZOVY9_YjK`oVkL5peGhh29~4y_N;V-bLe`#L9`k76r+<*I~l9*=NM&9&^XuubFb2 z^_zB=jSwL*)7~&Z<{nJszT~0m?RsR#+bu_r@VNby^SDK6z@0qE!aCV<%fP!W!$K$a zif7^(cxpTCBhgN|tqP)Js7jY#IObQBC>>$ysKFGXFf277XR0X2GzW7}Lmujotabjw z0w#CID`#Z&_f;o;bk{8@-{&yTK^@Xmng)P7H*W&ZAlgi!!@v|WjzFn(jUxe2+6x5e zFb#yr6Iz|kFNkF&h!ilXqTD@Ug*YsxY^g;1IOjKaW70e_P{XTFN{Hk_K{I)-yD+eW zD?-jcW+2L_5v8XCS1{ybiz5xOB}7n-=|tq;xn`a+m$J;)w(pNRvEL9~rDfy=>V&=m zU|>;465vfEvDbUz>QVyU!(ENbb;V2_J80<m%GgG6b^%$Dm5n7S^9x8llXVsS@LqVX z!LE`l;3dsQ{qoKYe6y;6%^0ZtrS4u~3DU^EM#d33Sv*q0mF`f_PJUc2JNf8`1wj?p zm+R`yi5X4NbM$FUm8mo3{se`y9RQREBljR1o&+GYYKnNEobt{*<Zp1XsO8wZuA9iI zc?nF+DWE<Q=0;=IT8+~`a~XwAc}SUNq+|lAl}3K5Sfr`U-0UqW*d=>avfH{=u|(a2 z{*eY^v{D5LZtiE-2x%d4ww)w4N&#iQ;V;b3kTbCi9W}UVAQJ0i#7(7$d%_R5c6~0? zL~_p99Rq!$Jt`wR7I@Viy{&2_zU;2wvp8j&4B8@!TFnq`%slzi3KThuP9*8ACGIUS zO9zz6YC1BPtcq_awLiEkBT3M>s%WRTFc9ru)ZLnNA+pYz7)2VJlQ=#*au^{E!wF<$ zNawj?(3bvgix_!>dIe+q>+TdGtl5_R5yHUsZ{aD5LyApAqxlw%!O-}FPEekdr(aOg z+w4bWqW7t5Ol)@F6?wD8F`|gbF()(ZpU07o`$GDXout^)ks5Vjk{LhlqXB?lDfK(X zlLu3;Q|}lbCsqTyVfuzr-2i$6j*Kq)tx+I7v<E--o#s-A#E02#xyv;mwE<%EWCxkA zDM7XquW-6?w>p5Gfftew{$cp`H@^N@K#iUeWWpWt^n+5?q=pt0qo5u~nyb+%=H9G% zY|%$!I<N%IwVcwSIl14OZT?*D{O8X?9{}ILjPXZ+)~D1L#_veR`MmMD_rFQRfZqPv z_NJZDR~jF&>e;0TnBvKv1487N?6_OcnsGeh4~60Hl5<Gk_&c?a=m=Di<SijE+#Ak0 zcdvzT{!CxeMApxcQJLO?cgMTiQqoT-G0~1h%7p@d{DT`efnh#7#eP2H4`^hV3$)!5 zapmhU6J{lv@Xf)dcuoTr*nBGeUuohQ35ziln`D6@eU(~L#_%dRYTWTDDCgm~C($aJ zwS*A~JD9X~cZzsrnj~1vpLXYQoa}6w(#6dK7Wd=>E&RseI(g^EwRq`GQ-z`VPn57i zK3MfEbZui6689{&%q!4VZ3SEr6ASZ-P)k%(Hq;U8W%nTiY7)hQeAPun=UHR5z6?p6 ztTzy?DKQb)s0-PImgO|^CZ;MpeV)CPsd}Je(_Y&jad*oy2dqlVgwD@PL6;2ycHlIJ z*lGp((?_0YH4muTD)RC=z@Z7^NoT1-usWQuBF?I8OBA{rsvseiKbv~8MAahmr%99B z)^nv9t*Z9}huT`m)XZce4BQqwy31#$$Wa#7B|ICdBOZrX@q5Na{r1a>!A(tM#v4#U zonVU+B#;JrDa&*#ys`^XrXKe^n7n_j%zmeR$LAeOc3FqU>V^J!!HF~H_0!t>jjw=P zG$&xFM*ql;{a^=1_Zu}+>`Eyv;K7bgNCz!vq6`amzOwa`+ej3zS85t57Fg&}TLN$N zSLLn=tom?`2$Q8?TJ^AX({ZcOfeQ?<feZL`(L<&^tSG(Yn{e1TOT+T8Sxe%vET*1~ zCAX}tg7j?E1y%`a&jzX&(mbHvpGsjO+$x)W5$U7>zBy=9gs)@Gx=>HR5H@<n9y<L1 zKs_}dYIdrzm>a<51b8wv%imMf?TA(WVcCbY9C2htgsH)w)ij@AklO?TYqYqfA{{mt zyN<XKbYd2LNPsrkPxjGiMeLLVVwkkq8L)@)!K^W62dE^((a`pUVuXz@-92Y_d@Dw$ z%cF1ss-%##^s;O;0v#JOz?o{eohkgI$jd5oh*1aUrh!pi1)aG@YNel9pKOf?1|ku! zx@d@ZO#p|-nqc`1U1-pvpc^qu1)Ad!-#{)IpDr^fFqLqm-4ZbE<OmtV+hD=dd^{~$ zYORKs3pv2*)ERJPiKX*kc2?8vx2!(fU|?8SS?_|o;wr`cJ6aLVf9r)~^(>V(M^r~R z=%^~}1_P*YinTE@>F0$AY$vGCawz^r%#{^*$l4Fl)oKjGR{bnk!toG0woaY29(ZS? zFAs|+WkokG5nCjsIEaR;v=GtPyEu+b99c$N6ma`6*+?XwZ~)MSI_@$<e+q3=1cAtX zg#OfuiM8p{{CMT44jLuQn?kIJB{nL2{G_Ih)F`^PBV0c9diw$AbbjGRa-<8{P}`gc zyxwYr3juJ7L-uNRQcfXAaadjbOhVd9qmtRkAhpo*V%Qpl#s$9h$^m^fXMGm)p|1TL zr*jjlh1@)snDwaW2E<G@b%&^TrgjoPgBUrcV~d!?7Q~1t_+DLJRx<xVl9j?@Bc$Na zHTRczQFR^`mYp)Wdh8NADRz5Kzf+b;3{ulpW-Yju*&&#FwNVE_<kXRhzO91FZHjU* z@?&8w6xYvg7xTM#<4bNEBR7nM2j;Apk#XW{x`fk4;^ode%&z4WWpc%bG73Y|JQVcu zm9@#*5pR{Wwe;ZhF>Bl3pR5m@^*_Z=>W(1U-I7g2BIro;ZBYn!f~*U8*~$Of_Nx|b z@*BPkbKd^_<;lAI`7b#VdU}NM|B%4ve@oy=|2Im}*v9F<3*Unic4UzSP=<TW)lzAx z(1Hw5f$}ATgMuwZWaN<&D)?bv7Oqxp8n;;9M}kK7`!TwAfxO5M*aj@BSy(eUm>i$8 zcDziFz5d=^LH*{<Kvh?Fwga|oR38z-!eV8$W(Kh_`NX%rgsf`aFFJv}Cm-!1jwMVk z+76diPRdT-QX1xketl{GZQ`hTo9GC1L4Qr@zfp~^X#1cqMsj0JR%Duw`p(FmDv|dR zyf7~ag1?JvIjB#*pgh;ea8xzSTf8(JkB;Z7Uut}Fewn^_Q)yFkkeXTT|3Ta>FUlhq zY8FLdI(-AK-<mxp4Vz9|_gX97&wHDqcn>lzlYQEBz<sx*koV`oFx2vg?Wyx&s6D1| zHyh=}hz?e)_G+5Fg22|WA-Y!CLvYDfAis0bsg7x$SH)(=B<8)2;0<S`j&cq})mQF} zYi3m{3u6k8aeezL0m4#6%5)2rqw?-7*TfQ{<i`(F&l9G>XY?dmnJB3V>UH4F0_Umq zKI~%-x+wQ+{?-w~6sThg)2Sxco&sw6pPa*=0lTSSnw@Y|c^)bQjEQ1y?`&VR=b&G| zFFC$c-_GHS4Ft={<&8HBY4&(k*|psGwOIC7FGa!r)zY5^FE=*(JrO<sw~6?V;5enN z?}_+su&Ab?F09Vmr9-2R7;0P6ie?i=Hn4_3xDLG%2XARK^38ZvCq;-x=k<%#FNoFW zZd^92&i@W-vOSqhPki{iJh{Q+19FRcZ*241u+ex{=)=Kdn=3OYj!*&OP*zwNPIotS zBCMMWPaN1KZzY9J*woAh;e!`SPG1G%YQKsZl>?>J*eRN7;WymZ#I&ju-mofN<+x@V zSUCB)^<;kd_xAReUS1dArHQ}Vu<H6a5IFm?JTPq3iwsVssTS$rnW*lP8``hjmg8zl zyttgSfpbXp0kTmYJJrkcUdm<tO6>YM%B0ybIsT@a>*C8Mi!9&AJZtcX;VT}KlJu!R zL?H{)^HtOIvrTPCC!BPd*kn&inSqEQlqB3U&T60u21J#V0yu>Z%7y6-Gmfgxs|Q9W z*c<sN%xX>F>oV?YtR!cl$#?Ob4w*WowqL#!yVeB@7S1+!K)Yf^XZi;b^e#e=W1Q8A zh)?(awqaE>>omS5{EWOscj!w@T&R>b74c6!`2)(x8_aX{UtNqL+QFG|BGl1ATqrK4 z4bGBVN=dwVA6iRvR$j&Nw!Y*Okj5N}&vw;yJ~(U`6CZfC`aQFV(oJqY|HZ2G4>JVK zAx-$@_e@ZJM?L%>o)Z6zfh+!J9;H?$yEFQJN`*EQNz#w<g<*W$a>^nI;v)G9w5Rmw zMq;dVmiuC)+~6d?f5gDG;=h5THrhx+#$ys#xes%t7N#?C?Z|ycQr==rxhL7JggFyk zx7*1(+JnE~aNFI^3S{Sd5f@~j=;!K}^B{;3h6P=N)^Y&@OymG<cNgqRH%ZbMm{;s) zpn=+z)Zz}+#z<M5Lh<G5;P36*IN(YS6c?3E&tdtT$thr-gz=mkbh4x_TJf%-d)D5n zw@%rA<(GyD0=FVM6Y}R(HLs6vxES4uIOCa72J^$<L<%O|t(s)eVelDsF)vk#=amzT zy+!kz$re|}i4RBMP3syPGD$ZG;m114*LlJoh?D4&#&okFSc2sFW}GpG%ICY)7{8w! z;8@tanAoZI!G^fBBR|>2Kr68`R}1<k&;9z|Gp!5GHjVaW-!(chBJ}+yt9v3kjEu}= zWB=^uC(q0Sa+dx+K;=n7@68HN)N#+y1ILj%K*>1GflbY+`HLw;KDLUPW<ECTVEF&Z zB%1uAMWp_PzM4B~qaSV*Uf_?{CYgZ#cj8f($lJT$0r;4AYw+CGsq)tSEADq_5Kqt( zAay!^s~{&=dF~GHbQ`6EO|;dn@^p`NS$w1ES)~evy~&b1NALeV9{yuq&TfPKWWEoF z&;Pf1`Df}|w6c~hk^;gP96r@X_0YNjYV~Tt(fl{+;cY61HzR`7B`mrLJpzH#a2eB; z#>D#&>Pa(W;e7@EM)e#Un#I2u*0$1_PBLvxo+q>L_<Fs;<%bSX5=Jj(ziXl~uPbLl zVtz(oN@9*<vH}tW^xpnJ3Dul=@HirHGSYX?+6SFv*0z&n?aDN*lU(K$ZFz@0^;6s3 z#StjDb_VF@Q{db&V!H&b9OGnCN6M`1KNGwZY35=gQzC-VW59|iw6@<sH&ji9CGX@f zG9Dy}749@OcC{wAnzRof0syQ~Q$W5GGMQXF4=SekRli*46|Lw8H!CWP4CJmBG4`)m z%ga+PIk+KEoh$fBJ(3=ldkcd6o2ERHVBxiGV{hLF3tKm58wdTBNpx@~^xEg-e2&#y zE~H9d1VOx8EA=OSvq}R~oPr(8Gn5fofZ_fU8xR5pa2GJ;KA8gMPmqn(Gg2r9&WDVY zgPzbmisiF38Bnq4%C6_yjUjht)TkD-W=z>OL4IR9h{XtIg3miord)t3AkVl4+qyRp zoqL<R0xXndy`a_>MlFll!ifL!^<m^lm+*)>-PzRpW6RWu64?W&vsJ|;0&xmm;lMOb zB)IaL8%~SwP3z{-2YKfyW2hcw1g91d(Zto<1PP)oiBpHEC*%!N`<x9Fvu@(?!SJ=- zK%P<UNybOS$=fCFF;aQ6pzmp+61eQSU<;a1H^cgk>=T>RQC{IK{=j@Ef*3<OQ&B#! z7TXt8@5>T9wn;GxysUDf6&{``MzG)hiwZ{}JkVO^+s&o%ovBXz{|j^eNlAV0uGlBe zzVK*ZDe?S%{C<Q)1O%&~G)NE|es%Fdgv9&}{NEm~%cbidR5YD#@HjS^!xD+CXX%wP z^F;ND%I23vDOmoHGFiG3g{u-7%+`slJo`=d7mwoeR6GS=J8X@Ojo@`fA3j_UQ*1Y$ zH-BSpx?f;heQxjMkmh`PRAo=jY&YAy24vvprH&qD-n7!+xuScHN)$abaKCg5eeIMu zx(VTT(9V4qPje5yW-vb^H+zXvZ=j}LC{Ojyb|_DG&iKCb|1rIHWSk%MjvjX&`E0bm z)I|9Z-Zt9k$AXU(gOatY>L+BTv<vLZGhOV%yXKf_6Fu8ApX;;^prV~e_hlT`s3#~{ zY8;fvzV&|=(UzNwL(QmN$rp!;bU_=;Hg*dFHc3*6nXM0%MomHoT!-6Lce3p_Nb6{O zjWV>ITV0`A#!YIX){GYDoUy~Y#g&szZS9FK=9hufn@1(cj|tK@sS`kKu8y(8;9E}X zS=URivTQQ9I`?*LCG9gZJBQx=MS2H7Y%&WIn0WJU@&}&GJ*nYokMZJzVK|WQ2lhm8 zom0}7cR?OT7J%qs6L0jyc=>*GDJY#yHau8N{al&FnW8CaVM9ow;l&K0o6Hw6LFlnM zKEw!7FH)Qot8@-DC_^)l*va7jzBEMr3e4`)-pdyf<or5YW)wNUDlbB2tUIy<hCp-6 z<qQ9@v9CTKAa2Aorhu`!A7*-}w}2<3L<9XZeh8yL>1J!vi#k5W3#Md?TmuK3KEaal zIr%{hxoJImgTyar{Ym9mQQ)uJBtEnRQ_K0}H0VBqDfb^)&qBRHko-xKMX+5YVvI^U zr0<r{6o{V7d)W=*)~pLav5bqiOMdnEK7PAz*xAA2i#2I1Nam%=t<5JL#k{7BBpyn$ zVc-V&&>{Q3oqkgsF9t`7;?Lz?5bY>5OX>qBrm)&+rB=W+rX+bjh>z*uhLe7)6#M|; zb*pV2AyUE@pM;KqmKi_i>@XTc>+lcZLvfXi2I|$B!Jt=~jIm^wlQ5Sry4TR0%IG=J zBXtpTsWLqp0M(+DAFkS9ad~|DS+cqip+A-8<n6dQQ8ICukR0dm53k2ypB?}B*|2{2 zbF3X5k2kk0*Qfbzw;@IAFiHTmlQ(U^2@Sb`cy8r}NxpV|BC4yTL&?Gnkr`qC+IJi! zexOJLckExdNRw#1g<TUeuKL2(LXFT=<xA+Kf<nx+{@skNob3>2;0x9+o?yd|3m01G zFC|^N!HN`Gc~0iSavYCsR4YvFL3#t0Mx-{Rq`gcDCaa)T6NKa#8l7%7S!X$ZrycE( zidGWtB2W*uK#9oAoM^XLqu9%BP^Yndgt_W*s?H?JUr>>WP?<*_+-8IUwwjvxysWDM zsJlNEKXiCZQ12y7Zc=vGY9)}9l1PxD03|2eVn8MG@8ccaK7g<)x44392p6VCNeA_Z z`zaQ@v(VD9#bm*)8;$t|C@~|L*5-1zmA4FG)rn!rhv>q-3-uPdb92zG&w>(}Gr$n& z9DLe<6<VeZf)6k!7f-ub0_a%r+T7$`d+{?)(OVhIj__6lFHI3<%VO7kUAH_xTpXhZ zF{$D?2iQy>G*hpV05!6r9ndJ<aFXVV3!|e&?e1Bc9*9nw3-j#BgLvwTHd~j0xeKxt zE-}4x9rbeeGl`EB8dSdm47c$j*n>L-L7kIR$V)=FQOTCl+xAa+pnqF8msO~aRJXKH zCpYR(v$`t*haR%l9SPbt6Kg%N@b)V`u__62qsxQ@nhtV(f?_hkOQB4~{8WqFbxeRN ze1P^b#wxJ}P+Wz5f`M(+k5~H3P84`-inD9paMP<^bjy4$NNs)b{|*~*b#-=Th(0+; zoD;OA_eRmVN|^X+%K9WEvsD<6OEir=;+x{;rC&?E$n4uZs-%n?(WBHt_4_?;aUE{P zh(=$BrqD4|KEf+dqU0CA`N^rXa)z`u?<RgSz-Wlz;PJ4Yvf7Oo`5Gom&@tNNxaC1W z*w6XrEI>B5SZfvbj3j26zcjZfSI|bfS31=(dt1PE_KfIJAv^ZIZg|AWhXrrNP51=a zOYuYjR|r|>mt*Mzd+z*e)AY+7;MYE6_BT%|@FtS&lkOu@s+TzNZnxLyh4f?+O>O%k zY;Rvy9(Otk!K&AHkyNAp48jxQowg<B$L~zV>7At-^zu2%X-?SLI@ZX%6ma_SL+-+? z(w<`mzUJl#c)zvw{E<VT3D>^W&qMrR<@AG|ub?s4=IjxLC%SMk1iGlMBhQh4AE}4& zcZ4ai&9imY=>_+MS**qVqIb5Cm%@ouQ`LfFQ<c5?iF?fHW8tGAr<l7ysVgDcs{-Q2 z!vKm@b`QVaB72ErmhR+8p<hO+qu}K0&+f8?)YAz}GUqpDJ=yXi#yffH<6hFKQrX&4 zw!C~jYxqNsl!(Ck%9=StgL^8!NwpPMXZVP|bz<qK%0teQ7QsXuC~y5WIBz9_Z~%+% z$K`36mz+A=f)>lxc}G;9x3<mLgEjd};OOxrfMZ4T3S3D?6vr7msM67N&UEI_!NKrS z&^fbwwGQG_+}h*@kMAdCskcVli}FtQ@U}Eb4t+!zBAje`6{zx6{9Jx`c<4+P4vvqT zg_+ag>Fi-SlY{7Af;J%MoAYeJx6ycb??m8{)!V~6C9!O~CV4N6@I6iclPN2pKkv=p zP^QHxF;%+l*`Muo+bLLfb&86zWh3|Av*R%Xf<GI#DTt23iriJ<z(V`=nWwA));Vtl z#rQc&J3`ABLtnjk+p08s8Zt!B$`yu_Zyppu<A?n<R-`D9Ljohr9q|iKZ`T!BkV7!x za<4dNByFNZ%<*4liYC7zNtfpGDTj8`VC%tT*^k90(4^H^tma#yaa}-jH};EpQ*13K zJYQAtp63blaRpmzi#hMr@J;yFg^?&|4u*`hu3v(m<Qgx0SAubu2`o%;;cL!Q;@2SF z>UKMZ_R^dKXzu8!gKEoXxE|&v?%_kcHt=g=qTH24p5rBEt2)w4pk|M=EXlG<!OO#N z3s&MHD~bb2`<Xmkoy8hur5i1{L-F3eJ5K!2VA)U?xO29{O9?l*c%+ms-BYyL!g;(B zCAq1TIin@6NR#!od9QQ`Ut}tNC;0$FM^F@`nYZQqNbD>Rcq@;9n{(lmux6ITVHQ>B zs%8S6{mCO)B+3v0tWJ2KGw<UHxT*Pd+3(#S;Jb8`z&ogVB6b_4JL%&?ljEDEYs$wL zvvlf8k3@o;lCZ(e(lmCYQ#6I4oB>>>lDu4snFNw`^jiTo=}A3vSwFLSfb|X1cvE<| zv*`0Wnl*vVp9qc?EumH*M!jmJQCthZw_|2$SF;4Oq$eRH!MMWMgN<d>jB25@tfsap z-^ufYa7nNCQxVe`CwceH!$C-q%g9+klC210{$O_}W+(HEMp=?&QJPPNukh5<>XGNM zaU7WOjpNNdxL3?v872q!4Kzwyk}bADEVeqc%B!+ju}ONa7uKny$9Cifr{$<H58?W0 zrvJ5M9Ck+0&>~IMoaq{56xB}){I_}G%0}IVW0bBfaODgGC#DlObl3<z(Iys8+#2)o znR?OH`5UEns@aJ82$M#MH=gth$k`)t!0xBrDL6`wNn&JlX}nMPHYlK28M?L`ToEL_ zW^%!dz;VoduK$kR4LTHUW~A(AJj6?^GxY+_zT=c<Hfy!~cS2EMs+lQfoEF6!BE~Tr z4!))p0*xf|!6)mRN?PftehwOR(4TATG{><q7QU=;ZabHBJI#i@D!(JL<=}^HmfbG3 zK8ggUCeV{+v@8>lk!u)y6{;q1e)^pbVb8{TFSrX`yI<xl^~_r8l4X$FlY{eC`V2cf z<<bv95lJX$`4*@PcCgJ$^6!N1qTPU*ZR2zDg7<E7VG|VJV9GN&b2jfK#Gz`m3Q6Jf z_r`*@rGA4R&-s{r_#X@4SLD3bBn&T5&azVL>!~SP6$aN>aPBr6P&QPO3-xC$hp1!V zxRLK-eL^iBc=w%hB*gaql44UhlvvS1FAb>Y8P86FuV2QT^1>^&zB(qU<(U**Jlz32 zx7NguH~2i>=tp~=P}#&uqD95<bGBuNa~1Q6_}7hyFB}MwtfZfz$=2_e-cKkz*7|%A zou?|K+ZshVR-ImY60FX2jYY(aCP4>if4q$Bu^ZS^AV#QNE*<Kq#`M(;>MMtQyoZfO zuKcJpe2s$PWL*i59wpcHin!uquM_&VR>neq?ply*6!};hh*|8%vD8Bj@r%M1&+Pn2 zq6}Mw^BnC?1Y7h*5Nuh%b-pRmb;c|5T-s9BM^F&0B8p&BKvnA>&?@)8Fym62gWDGL zyuIvmBvVU-kKc|w@!^Kw_sP1rLLv(O3&sQO>}~O=HGV?W0xwq8O;#8?Cv&uic(h`0 z`By-*h@^7x6isEkc4p4Orx(tI%Ro%P$M_GaiTww{a%Dh>wgbG+3$K_^VLPIpsYusK z;Jl|>e2jMQCylLY^lo?2Kz;S4e|DFXAJ^rpjmZ1$24#=F8ds0fk(!tzF`C3ktAy>a zYi#rz^7FPAfE&~~G$?jOI<VVNaWW<bcvoko+y#5d>Xq~CAbTd(_1E<*tldVC*L)a6 z{5vgY$+af}MF|?XUyvK0^*%1SZ``@NA7*=M#;a`6HqiQzs{-^+bl7QN%ID#cP|J&@ zpV)_1)a99?z5I8-PtY70gGI16F`;lS92eoYL#sRdI`3r9+qC(zuK5e)GbTN-{#*So zEtB!(-aNq9qbz#wLOW;wIsu(5_A7)JeLKrYy=D`0^Q)^}8#OTkm6M@cxNwyZrpx+J z<ibL;5WOud_PblKuAjloCu{wcxCysUm)#%470FXS3hWhSYoN66oi}3_(l{P>_flAT zJ8ws2%{n!E3vT{KV>`F$iXIZjcjvxGnL6=nfb|n^_0b?+naJyBuiS!ZRhXOP5><gs ztlHaC){h!l0K_w()8`#E|F`W22WPVELbRVWw+M+B-{ixOt7G%^i4%nJlPmci;EMEd z<pQ%(!S)T+lFToJ&}b*}%tsS)*A3(2MyCnNs@lf4zGGBQSh-C$N(Has%8v)!c{MY^ zX+YwPDJpUgzcDs{8CZD?EW!+@q)x?d>e1P_l5x-E_4oo=B;g+?>pc(kDMS{6r6jMA z3Z4LXuB%HVnJs1GJmSjn2a)+#q}@rb26-h}G>e8G>LX|$x_Rg{`S9g%VP)8t0GBqt z>Shb;R|PX1M>9>EjV)<<S(%9|)m3TIa?<^WS8x9wvv8Pz-q+!)<S+E{EC15Q1dI7O zNsdeiCNpE=yIrf|%@(89d+&IXKi`xIlJ{ByH%v@Jk5_QXk+wT6SEiohYCZQz%n`ul z!*J3&_-pVwN}4NW+=hIDbsr0H*VX}}eo?goMQ42|YPxJONl``AH{^Qia69!lrpQ@n zOzs5@oQd6c>iFX%;o|oR-RT7yUT$IOuIYV)gfjwZrh(L2Z&9z}OK*vo-A=H0Ht9p{ zM2D;9i{iucf04-igCA?JmmnAT=2OMKIWo%sk&aMuHg_^6{<qJ6Q*ayqhpaw+N9v~l z!bq>>da;Iv#<36vf!NdRTqB||2E->qcfhTA^PVQh%f5}=t=>gGUmhQ2MkjbQ`<cGW zN$0~_diGlFO|0Ax^fIm0<~rMaQu#DVK2rblv9nzp>eBhU;^!<ZJy8Xzyj8WF6jC@q zxiNmKshV{1n*esqsp_AkFm(W@9KXK@-Lk06sfLKf=|c0ef4nFtCldQxvh*~tY%I*# z;KATCpE%p?lG$+HlBb6q*Ne6Pz$H};3=g9;uIb1IuMB%BmnT`s{k2qU_hT^5rzpY8 z>w1G7{w$2(3}8ePKo-?pLhmq-$h^RUgKXb<#Mh9R=cu8f?13F)ZUlmvK7>wmh^L{r zhK4X&Uw!Kv$^8=evr<KsL*1(*#X}^?&9+YW#4JaC7>pI!^@qT!Am|3nWqop7(Wbx> z?bp8$+p?9`LIhwxen2Ar_<{4k{}BI92xY68yDo^LbRUpJp!z2w<OR)V2(oVU@#kBM zt2h1_3gY);okc?tlRz=z5O;ub^1puf^><tkN)g)AnmLO-Kg*0Kq)I`8!K04e?rMLT z&UCjO{`>W^vhxFOmkkn6>QxwQ02Y#sq--iJC0<yfKPn2N$z)P8?O@6sz=`&4aIp|z zvbhrg^Gz~NE4y7T2-;xe{57@;$|Zs(CQ4TEQBS<5bnO_*cP-gAk|(X|EQZCZys>Qc z#%-CAapcQ7qg&ws%%T+ueV(9M#@V4je%`_~8keznBE3|ui78Z5<5{L&e+&h!qT~vd z@|(O(K5)dWs45vfyE7m|-_&-eV;UxWZybiBII^QWT5Vz>!&xJnb#z|0DoOdE!s6^> zgNgC&DRlNyFr7cDUxV?iB7a8-r`sS#Q#F{$Dt#d<u|&gOSuFFebbIMydQ^U@J)jQm zSqDBHBcatTFrTJCPE|*p(C{=Sj)bs|tqp|PVq-mgOGi6fTa0H&UKPagQC33hkeHYV zJz*-le|#%nMu>BaW0)Qz=c+@&DfL)ch0Vk)_^oChljDKY{zlz4WRO^<^9zOt_9qi| zWY&b#DdxHLEJs(JSDUit7R;3bRj+e)9<HykYQ3`XCXQ~jS#U%*spmsHkXGukSD_%5 zGSi<5H>`@yZ~4WAWV|}HWwT;-#5U`9c_-Y8poqR(&Y>pekquXJnf#v%cmNx%N2UpL zr_tF$#&2T`h)~NVo&x-sus*^m_a%yUjJ>2vm1z@3H|5fmQYcsXv3b*{1ahrSOKmSt zilswN#E!Fc_bXfMz&&9*cUoyWGm;Zyk-_WBlP5lq0Z%x3?5JOE`oe|h<3W;@H*NkN zeg3Q(<(eec(kITEXd<?FE5GZ!voplSG`DC~>@dhEGU)6*7@U^*#bXLnS^hHTO;0GN zGCg}0TTG_$$eL(QP^(&Ll`aG&dW()NjiwjvI(qfh$t4X)%cX85Qm9#zG1bzV16Yuq zra<Jnmfuw5Z%MAD-12s*ysCGxyejcSxmOqo_qaey?|A-V7_uuOmt@A6q*o~1#vpXs z&C`oEX*64~BO7pb2*l4>)ppqh;k_P+fdVd7zZ0ZXZ=rpn)nRO5QKfea0tly>y6W$E z^E&W0brWNXGaU`oY$~>h1|Q)?Ht~O^Xcj>=D|{3Yr`b18&b)8;&@W`vb+C?)uSKY+ z;wUHy64i(q3xU`;NU&7US})qKEXiA&vTx4rq0*LyZ(DLl;2<gxJ(xsD;_Cw#6<UXz zDR9WBtT)2eTLql^Y&x)R3NkrVFnYXCKheC0>cF8CS0iZ~oDz?qw)z3xuDn2*1~Z6} zd?Hq$ccCXa_#8{yO+U}l?ZgX{wGB`6pG^kO(g`MPnh@>iyeSTszyRK(^Qn_e0bT4v zz~anstEpQ7$HqlDh3#qYp-iMD>qmo1P0~Y+6HcMNQ8HAkAJi{o^Dyw{!rFDs$aLh0 znzwM}ZmCwl0rr`Z5k7DJ9xr)*pGEtArNdWT;y0~lBc<uL0d`^Qp^#Hcu7Q_cyfkZG zv@aOdRA!!si4y@vN!x}2%m*C_Q7=E{_8+C2!0dv$EFWnCa)M96K|kZfd=tNj?WIX3 z9H@Jvo>8sJPjd0AB7uB{PSilCkgE&XTS9WRViJpU{(>}@iF<w++rFJ$B0EWwsMfKh z#zOS5Xg*y4L7M9cuEPspmU=;6pBHr_w0SESgaoG{%0&tFiHH3<bo}#m`pXO@N+X~6 z;!PAR&@v(%Z3PA1Ofjfrspnu(t=3%G4D$gP<>6V(26Ut04_{q3>6lC~)R-=@d#hfX zn5@z`2=L-Qc-YHTIK(W#B75k4ao+%HaiBYKZKwV--)@&NBdGq|l#s*ik#>~hXTD>f z)Ekh8<Gqm$pmr&66Pj3UK353opbcMn4sg(yb@y{2snELfAU^hhcEKC-0Usfj6t5C8 z6$H&zW}nfZnkdL)NGuxKmm||NMpkh9PnoQ~=?|4>1!L_Y@B+QzP+SW{CERlb!QBeQ zpU!~V6}e6(`l}@PjC=kAUF=!~xZ4*oHzkBQ*aRP2r_!(gVqpBoOWy5HIK}Y$i2nDx z%JqM0?{=iKwly-gq7(gxi_z8A!BW)R*y^8h*k~1<?^g{%_r+j54J)1uz845NEb%Ka zLNN`^U{DaV%>pOTc@p?r5j&PxIiZ5a@d4l6j}yO*g;3m_KML5_<NfwVrLV7U)m!b3 zuE*0+A72B#e}P^xdowXcs;NcoHx3(q6$Ej4Xe>_XAWNw)gXL@uL~MVR!B%=uV7*Fg z_^{TI(l;o%Bz4l*bu^grHPfs-pR4A%XsbY1k2dkkkKJY2DePKZiz|P{|Gtgrtp*vU ziYaByc-Nv_ZEDrdkyic4xZ-U97P~nZ*t1(Phd8A4k#Bv@=<0*Y$SDm7X_muXp#*>K z@i+$e^@$+rUWi#LtF#Mb^*?C$QWIXHx9j5cHw2;f%)wjFKk)22RHXeYhCX|}S_O>p z$tZgu;5gxI@l&Y%!_c3a$llG8A5NgXXrb(SedCL%+50A#-+p(OWsQMvQ>CwCzF*i? z<!PvkYQXM*aS~gSTmvHe^*EAD+Up#_W~dnpcD+%h^m<L73E!XtU4fDsiCGxQ|IfAJ z_RjhN3-q6DA~e3Hz){17+$C*qT_rifWY`abT{V9y;IMhLZ@>Q2M+d*pFLeL&yw&-< zp}C4Qm0rN2^4eTAhckwq3>hs$c*Gz`Ph8rFG4KVFDLs)r+6ghM-Og{|@CP@uUAAya zR+8gedBV`HK~(MH!@yu7hRDdDso;}}zn=4GEo&;zTRO29GvCLdxrPwiW}z#VlnduT z^(P#|<Z$PFtbAJf-uk!^ro-76p#KK#g`F%rg_9)^jn^ppvRJ25lf6Cd8F~$|Ewb-8 zTXE5F<VyRHF$^Uhcu^7!!OKDW3ZX>U#(PZZK#{e@=#%%uA!n0#WOSafVv^ZIh2_X5 zCJR+tVmNMxJ@c2$_RB*L)N)1<&HX74lW1XJNSr;ox$_NFhCVC$+urkaa%X(mJFbUw zWVYd3#QXpsm5PJJ#5g_wWS}Nl$e;jbuAOJa3Gyr_-HtLr99d0XE&W~Z7hdO}W7R+u zH%P*3-qQXTc2*k9EjeHNUD_`zH*G$GMapu#=+}-jWXd(fus>l%?CwaySEM%xop2iA z40|HOOtyM))p5QeqeRnsvRn(1LW=wOYpqxt%HLF5X=<ep+x<;Av&b9z^?r55KX*iC zy~f9yXD(H2cixZh17iREVr?Ap`zrDqjiY_1%+vgjK=5DwtTM*d2LD;CuJq3wP@B%# z8o$j!52~;RnpD)A`4A9#V$$M_ragh&661L|8`mjaVIQboKXhHMx!u6KwcfqI@-vqy z>nZ4)MkiSu4^!W^{pstOot++Fbs+{=94P>`AxWT$x`lh5Ax$(f?z!7w9HoR97#0j9 zQ}0Ngb?1A4eib#20_2AC-jdr^$*Ay}wVh|Ir{Wct0F9YME`gp)cZo9sQv6YH3=#K^ z1#+zQm0K4LoX*W>jl8x<NV-o>A^eGUWhx29lEo0L0j71tuLb)}zwZOE_;5hFuNv<z zUc0elsrlV?`V+k93(T3Cme&ps%Da{r%*1i=(#Z~El(O-{p1^7RVUmQRvfX^tLx_J< zb;DyIc?IOQ8N;`wAfz1kcO}0Yx19>xqsyT5{s=h0jBs$8p2yBk_v`Z4^eaCJZpv3? zoy~+O^Afwf%99d*X^l!5b%N2cXNL+b_Zf2}1OInf`x5kOOZ!bFkZx28l;rG$qV?xr zleRgb#||HS%!+fTCD`te)%f$mG|aZv3R(<|;jowyu$<lU7*ntu!|C79RZP^nihlkQ z(h4i!ptGh+J1R?E(_J1Gcv%O7L*&j4L!S|^!YCQY>0dFfl*`AbdW-ov`t&N8)#mHg z3C2c=!L`3~$0YEDEGeN(e$848{?P6tU#ssKWzPdrV?flXNRcf$vw~off44j=XC^a( z^!u0xgkZR&&cyv<7fr#A-UCla?jJ`liiuy8mHYaT%yKE7lqW>6PYF9QZ}rol-uED` z<}cEaq?ejUQr3&v*N_wm=X6MR1!j{-LCPUgj_MWBjl#SsuyGyQA&}vi6fn=cS?x^H zSo3V#8KRlT@+4&-*LwYzv$r^d{}}T3RP%r9F#cx`{r_jG|B*%UpZT^**0x9j2tH_W zRBli-!j|6UbY^?x-3EMsW<3ZQ=~+?hw;?&`t^PUV*h`$IFDjV`QlEdfa=V&Q8T9M8 zn7AINo0^)q`hI*o<M88f0o2`o4GIzA8rKIYf?c>}4Ix{plWUdH8;xkE2-b8G8mXH< z{YmRgsI2MSxsH^5^@_l7m;wh9+8f{&=e%_P{?7UH_s%O<u}SD19z{vB{#>`QK~68^ zx>;{;hs_Y4U-6J0dx%!4d)DrIWxi~=iE>AA1WS2tA=(p4`%`AKXm5V4#q=a^IJEHX z&yyY&(&-<7-@kepH`s{be+s0W7o;bjE6*_sY=;|4NVpl!?J6>&OeD9<Sm!to(m#5k zs@s`;ZsVQBtUgF{4gv0Ig!qS;Rm9%>OFQb<1eb<MEm&*zI-+43SZn%Q;s;V-(Kpb} zS#t_RPa5n1FkI;Ba>0UBw59=HH4HZTdj+F`InQ#27sCPXiZ|RW&vL>KR%Vje(0}6h zG~DYSa#nVY*0g~yUfKSxlf=b5xc=21TKfCvG-cR*kGDIY#6x||YugDEUuG(XxjB~` z5|iWb42fpJDs`D+UZj*0$dQ#yoV^(`VOp(-SL_ru!CWwKx{iN7=2+y-HbGV&wH3m+ zO_vbx2WpyQm7^w3a#q|&;B5gW*)zO?zF0Hz6vGC2DjUKV{e^IYGub)NMB`pFtmj{J zK8v4=2dof3ejFhGpP!oln6H0dr=wNheNoiDz2`3ac+x_+C}v3Gie?>aAT9Eh{DREf ziVGq95->8S17p{5*>&k_)01Fz79!><Z*i(xGIa&35rmZ0#zI(;)tY!Jz7O!XbP6-= zOzBh8vitpHt~Xhp(=R?V2RWX6e`elWfi4I64%~j67>e(;L*&E~1=-%;R<rj+L)#<u z{%%Aka-#@HJqSDSLfP5diB#z7@2wq19B^IP^>mA7(ThEJe-%J!RG1X8r-;C7c#LLu zVVB~I*k|<B4%;75_y|I;9lTZQ0t{(&Z6!nappB?%AMKq`6QK3}X36Qs7@@PL3Ali{ zrDE+K9;hXHg_W|o9ogXS8d&d*-qnGO!-qfZu)rOqN-5SvA|!*abeSHNGy`NQnj|^t z&XFyYcrezQTsAc>)95?LmRP#f2FZ*aEpdvH1i@oysPwN3$f$)zEFf2K6i6RR%rl!A zC4H0`SbSVT4Y<e>A>jmuaHQu@&ZC((j($`<GVdKOe3md)=deyH8Ivy1?yMGB&^g#j zxl|4IC@h#pDV^st1$XJ2Gg*991@TDXa4<56fNhagh~O*{?*F19y_%K<twuvJkg;I_ z-<1f%<4jb5ZZSDk1!1EA4q_J8l~h;T8>+Lmcq0Z_r77HNs@5+R4uyB609cwX<K|3d z8~WM|<(rzlJmed#;seV}U^gPFjfuq%2E|xp28elKeT*S5s2Uww>eABRy*hZL(xMNg z511>RUyy{Y)H4@RJIxYQOi}ZXF4IhvnhlXuHH3AlVXDz1<QojNUr*G<+X4ezrHiMW zk7WsJA@a){o*OjR6AiAhJx6Y@MQDY<pko}MR5GFN!esN0jYtCpv+t$U?$t`V4wI_v zHK(pip)MttwVyAWi{^HIfR5HVR*ac@ca$B5uVn)zPl6E`8bkynD^+DVl2dpX(V<Hd zX-$@;9JpD|`X7_{Ben$34<9*|Wx-c~Dox2BlDoU&P@T81R>xSRi28gxk^6$hi>HfK zhsif?&x(lM?o5=Wu!E6-!Z#7{T^Kdw@KHCcE0tBcnw>PNHz@KN`1?x}R5n}|e<<nc z+V!tvD2J#liir*)o?iggI$!=?&ufWH)!*dRFI((~P$Ox%9)DrJ*U-n)D^}XbO{q-P zjD$uPq$|9$*l=EWVREhN0Xh{D?##VHAXXr{t;w{eCfb5u2;KCC2i$~*$>ApI_`N&Z zvBhh#l$`%?O@9@n%-m~4ve!WZpkHxxk|C)~Q6AQWWz!XqJL1XRt^|j{yOwM=V|HH{ zd4*+%#n@5%@Qh&gVx6pTl<qf&@;)L8)A1Dy1ZC6<oF`t9aZ?#+rG*>JyY21u6sg*9 z;y87am4_j@ar;IXzoJY>s|1Zjo7T1_L>xxl#Ea!<l-9t+vY*Y;E;n!izJ2IKua!{} zhlH<KTj(q%qQhj^2^3icVga>T#veF;;}`-L7^iouq9BbdgpNBZM=Mr5M9j)xcr`s6 ztFLtU(+K+ScGkC9dhOd^AdZwMP?WPtHxidpwV#lGR}1z>t%nfZvwVsu?JMiK;~+|q zNO6sQs53UKOUN9h@=N{Ta835`aq!~;X*~+GAg!fu8J!{QsB^TrxE)=c6B4$%doB_S z$yE&=g@jk>Fo8W)KJy5XVXmBMctsU}ykLtqhqG|T!W}{L80G!pGsJ4gm#4urRgP=E zDW&&WR`{2nn+2X?$sO6*c0moN!@R20m3uaTUh^z`I|TPl^Tx~&&jX0zojQM>C2}Tz zW=J~H_Ls`J&f?bXt}65%&reYo6zw#})mY%7q2WN{BkK!v1WYMsmnkCceo8*cRDKEe z4BT`N>_LKhUAY(@VYJ**_cUVQM={tblC}vF4C4Tjs^`KRjedsn0;$2vx(WN~qt#4{ zD@ua>JYm}z!mVb%)zzQ-h7als-{mjgDcMsQ=jP=4SKOG}LWVdoj(I``E2R6Q<?1q7 zSm6)6`<l<SD-X4)Z+nP+73gAj<n<iKcSd9M5~4wLdiZOngnDNh`%+xu2?Hf(Xc<~` z2fr?;3uG>83{)1fg{Tnq<OW=FtZv<RPpzo;YP8JK2Wp_=RN;eA)>plh^4t^abQm05 z!7*)oz{6WrSvMQ3MwOJ?^AMH}*i~K)QI_qwMO=SRxcyAMC1$hyfQAxbB~pwp_|dW} zFz*wUNGK60k)NK4lJO^jkT_Wa(4VFi1m7XjR+5!;(ZiXgsTgY6#fhy4R4@du4<<OP zbCS|<LvHnq7u*OW)^~RdnZR?lmo(!A`Q1J_4Vv|baa0M#0^BG|aN??1A4qE?ZI-*m zImOPF!`i<73wwG056M+o9~S{EA?SR<w;)Opzx|zpxsYl;dM7hzoUAIB)tqeqieyvF zl*_5x5qE5Z0+;r|)J!ikPP>ov%X%Xj$q*7p@ZBrh>8bZGT&mEH>=jZQ|IpLVtG`IB z3L4hKB9sMcVNaEVPlV1DD_u-Ipjz?4lwM~qUS}f`8TRUDL%WQ;*DV*zCPiURr324G zc6C`WF3INXpPn%RF5v-p!wG)P9+^#o$TUj(FCuoHo7c7FRQ^{CvF7VD5`{tyI>L5v znOuDRF&b9HIb55JR0KSc;;)qb1blDNB-|T3Iajm#vmOFoJXaQ({VCg}eM{I+==)Q~ zmF?n;9wMM(yFPr=;Qokt;As;FVOahc8%jAY+qaafK(B7$-<#VQMo*9_Wko89-gCtZ z6|A>%x1O`a^#kkPPjdZKzJ!aEwL=ZB=w%_=Qw}ek51+twNIZH8W!TSmy#Kzo#r%@3 z)c*#!gWmx6e`=ck4~|8`#@xwV-^$!W-^tw8M#RCv*5Thl$akaeH^fEZ85kj?T20n0 zvPiB#RkvDsdzvo^@58hV<CPDOmIID)g50t;ab0?=v?}N`d;GV;doW?B$3E}0_7k5h z&zZ@~+MOMrpWhA^WUz7bA_a*)R)rz!#NQTBmX!PCc4WcMU{nb6N8KfH{uiEfuDDEf zrZ8(6H=qPB{iHV{gyDT77>c&7#gE4P$xpPtBiZCmp0Zo8{jecU16OX`QANMVWrEni z+eW%$8awGeU%Hl%v9y$ptvYhBY#1g}$tb8~LWHM$g}fY{SCD5415@HUE0PG*UN)FH zO8-E@XNUhkrCkR+mhJafMrK3Nurf*rQ8w8jBU_Tncx)coN`oX@*(;J!W=Lg4R7NO5 zWu`=1sEm^Le{M={p68+8|NeBBx3~Ly&UMbY&N<h)mgCFxSNb0-K8g1D`!j9!WUhB! z?SJj<r;9-(Wh|b`KDRaro!gZ4D49b_d`i{sz-ssStwPQzlDn_Vsq_Sxm{^ca)~Yh3 zxZDlR+r84Br$gts_+%)#tt2IhN?jCBtAS3OQ_^Wxi~C{bMv}*)hN^>!jdY?mH}*S_ zIp@C{w9rg<<UjY*<H{&sqH@P{GyR1?wex{ChNjo2YtIWjX!xL(b0&~kr9Mo#yoz{R zs7d<N3AMf;eS@O+QtHgq(eDrJdS_khNU{B~4{NFxz1X&pVb2g}<%{b3>yB)F!qaJ1 zl;FnFn0H$CQ>-SV=b<Mps~@Rry2Tgr(>_{LsCDn^bd=hMYcKdCE~lL8s}K2M+|m<m zrPq_hmiduaVuX0)uE(trx`4gmwc;W-vh~VkcJqgRzq#+%&chFdOm%V|vVIg+zg}24 z=Dz7<`(Eu+iE(K=pL#TyMRu&iL{B{z8ldTBWDZIdxL733K4z_ev9eTYrEc4PVGr>w zo;PLbxliZWE3!A<S~4ZX9c*<Pl4fB7Wd?OuI~Qw5JIp>4Ydcpb%!0d&qV$Xm7~noT z4cgdUY9+p^s=TzeFr!G5Yw$?1izt4J%z5or{o`BZHzhVcC~?e;`S4`8N#y9~Lyr{O zetbG7t<rOHyNsNVs$tOXx1VnEznmWH6+1Ka{VSHpp^ss6%y5S99dlpDGSVlnLW8L@ zIMkE`*k66tFF%(PT;^f0Z}m;Vc!Ao&N&WH*<DQc;)p8qx1g{ozno*2nT>9ko8^4a8 zy~Q#*sto5r{1`6q#ZV-ZyNJf;X4iyUNR(oF8#E~V%T~S>jDBC7^`0-&@0t+n#QK#_ zJB#d%Zp%lP(75WTpUiVeb1v-<r6}6@PEp5I%4mJ@i4P|vMH#XT)%f$eo<*0MTA4+d zw@c<FluB?lM~QwGEa6yNe~@(ac~Yyo{bQb7t1-3&$_Gx*xLFM-q%ZSS`<LadFHR6^ z;L8w^bV|G})tdJ0>9$d`G)t-b?G1jysUOHzT<$&6{)jLAu}sl^o4dD?+#f0R>Relw z6h%jj<+X9xMmZV0E&RLhwvWD+tsD_$hE2!Y*jBvXEBK9W<6$F_pfvV(S=Ulld0#wz z{!>;p#<)q}xM5JjQt`@-$NfwPL@2lL6lJXz3Y0MBE|VY`h!xteb|hc&q+UWx+?DB@ z@9sXXperYd`rzgB>b8BhM54&i+#SWi8@J_f?>L)yS(<pwKyh(i$04tvm?}BR>s`Db z>emNNM$y=}N9AW+@pq*t^`Y_NuF}->seiST6yvqMO26+ck;e<kYJF8^q1%jMYs3R& zIWvz@b<w(QkgVaMJTf@o?3L1|+I#BZ>7+he@0N(^R&};c-H`uY_)~w*x>xs~eczT( zdQTmF5(;jVI`57)Su584-RpVlJ3r3u-CSuEg9lb@ROxg2<^Rmx)hO53?`aE*?cVSl znYR>=b_(dcIk7)sYWMESeW@{Z`tELuW;q!}vb&qh^9<cow*8kH@WaF-R-%W>j7BNr znm2C*Z97kYRcv@j?RI_s^uy2eEH%2^etEHIj%J*>e)$C@8>PI?WdW<wiMKZn-QO54 z_mgWK>DCCbTME9y*#m_Z^dx=^+eY~N8C`SPX}9%cs=3Ba39@vM$&9R&QjK{>LH>&E z$A}~e*^~~W0P`X7qa#nw`8Owt$Bt2i?`#!Qc=@=ES>eOll&NOsYH8NdNM92UYx`9G zX2rmsZ#LiIg3jK1<nqOXm6De?jh#Du?XKKQ89@(5VfC_gCsfZ}5qbYWyrnJ7|5NJw zRYxzF3H=<UIvsrPKoKqb@crmLtwn{&N4KuyzT)UV=%p4o6==1$aqpUDw)_Lqr+!-X zoC~Kie@kL<gXxNTpHZ51E8nn$_@JNZW%Y`IVLsEccZcefte!XBE_+w<->;WvR)4-a zPGZJCarZN)&8l6pAKBT?#3@@ea#in^9W@x)QV@Oh%SVs<Z?iP(*+aR4U(;ineFV7W zUp#q`&TpBZ%+x2@A0(+hsiIIJZ^Z3&mWs9J$EUTYJhR#!TGqBxGzVY2!*DSm!NJs$ zC_;~V`&8$ZEMbaD;d`RLoF!az^{lI3s!uOCTDBy<<e?Q*OJiw>i1re2Wg1u|4BVMy zZKmt#h?zV2!&x7qvAK!MpE!J3-^id%f5Y_S?v?T+q^n33YpKLH9?QCY{g}1)iMMQ| z1vdPCaiYGDIppikc0Qk`IC|<;<{IPd^NPj|?G<B3zZLviXI~i+;B2<3B`PZ7l-pP@ zxV61+InGS~>|!9=I4r-Z_V^vT+Ff)tdn~FWE$F&+c3tah*tMbCzN*}duWo$YD1Qg% znm5CGn^-07?z2nk58wJWwXf>V=;UP|&e6<UuhvF)HlHtI6twr3F&NgB)tB)U&y{G< z-*?5`M$zcGwpdeRhTSh~jRO*yPs_Btn}zQ0Nfhv|c+qPyqUe1uEvki7JcC*%nQJh{ z<)p09Bdu03O!}?vs}>ASLtMm<3k$aI62x?LwC%sNmaEJvzVvSNqum;OLS{W}VnR=; zo>2XeYI-(WdjC$)p~rPrp_qoYQD*Px@8QwM%gT2Kg<eus-)yVFC1R|~PsM0|PsYzO z=d4ASCFu!f5rO*m+tnY~uSk|<P3yXiiFi<TLfL!h&|~Vpk-bMPPv%l$O*(E1r**vB zBwzHH!BEFJQ1~wG_na}O2=kx4`erp*nLRmN*H+f=3vm$>-g&uST>aDYOhbzRsogw5 zHB?eM`@imIe_-rJ<Gfe%y72mUFAX@nJJ$Hv)fAsOP_riZ@b=se<_^`6i`nX1M(sL= zcamKFGP<$&YsID}|A*rogZ5p=yPhS*)EPUF9L7Gocr05#z{yQomc(K&NzUfh;c~sA z)*m$T4lk$OnN;NkF9t>&)Ni@4o|2l5XX41iU3^rDR^=CZlh#XCaFabxPXF#>b}-}K zr9ijd0-D_tTIO9Y2^T!x6NP5gvEHcmeaL7wV$~_g)U@mQRmIk4&vUv<lL8)vFdC0v zIUME_sCQ7%$fzowa+RX@?w>DKa_`&Kc~Rs03GI>1dpC;y8ajP_V&!waoCZ1jx>s?G zN&Tc@-fMoz3?I%Tdcv2x*5DpX1g})-^9#W@3QPMR^43NYNe+fRe63!wnl)FmS$*H8 zoFiw`-9l>IGs{;$)na{3?M<?})~ze#8R^b-)^KWX!G3OU<<!Fm&yIBtJSnw`Q@cEA zl%_NlFYs`rNT<yy{8RB|-a*$^6P3=%*Lyv?*6X)4dIWOWrd}1*&U~8|#eZ-+lj_fs zJAU@+LhA;eG#sDaI`UR_h;2V>FK6aPQN{OUUgc*UO&QoOP0>{(i+z2yr`BzvN8s%0 zqStU`$ur}^8pChIc`l(^r0HM%M=l3X2A-zf7Ck{)!8>tnRd4X*1>#FGFL_+nD6HJ5 z<P(r|%!$F9h1m3K<r$8vFBLy=&`+Fc54s=R_As`G@5844@1sh*p(H+5Cetd^YjZ=o z$pjR>xP9BIsPd!sQOCpKb!TWu`Ly+WcBT)~riU3vCl3!Ee?9PPqnT<=cD?jkuYgzH z&&j2{Xa-&h9}+jZbC5me07JS)l)Mwws@u&KA)!o+-(FR1&wKi{S=EIjyt2Rfp0K#c z@z5;31MQ0Kuhd<%=sYR(ve<N84JaK$&y!{DNRyCr>bL9MLsc&G=)jAjo$Gn?ISO~Q zXcuA%vx}=o$qmAbPU#gH7<cXs8`JBRbd&6q76`4jlq@;NE;+X9CH1PQ`&G)jXpdEr zu~!ALrzjk-k{RQvJN?V}<&Ce0%>*6~P%0N^_L$x?J5nj<mE`nuz_Rj3_i54>H;&vn zDob%VV{NUF*N5$lFBMsj$eRR<Jb6G%+VVjwmi>GxT)148G@g2*nsgIe?uNJWX(v`h zsC`+TJRTdFX1ulP*VCk(UFnb9Vjj8O*BglAiLng*Xj08v)15ck*dA#aE+S2G<U;bU z+lP4$AD4JXcX5ilv3e-FqI%~I{al_~!C9jhi{G1GFVk$_(q`1w<CZQl|9Eg@iaNv3 zmB<5pcoQ`d5$ud3!a7;<+qlA5iQj4FqPsuCr`g^Aa<0~P=5upi2I@x0ZS9;Ko2l7X zvU1;gaZpxnWlfk3Ps(-8oI?t#J2u$cUN9#=XR`gVn(n9DKZnXbWf*xS(c5^o<(0m} zzFYI|hSksBIMz32!!4xa{oT$lzb1v96rB40<qQ9c#E0$zJ7Oa)g|YgUz&TrA1y&!e zJ9x2R)45=NiG1HO!J%9IJe!Z!HV0u%i^H&H{<3rz8eZ>{rB)QM64V#htj-FiD0q&^ zdFZ&o+4QSSj=z5NRs&tt-Hb-nDRDyIFU9AIpAbuUo|x!M?0MJxx<>m`4r<|~(34$- zHj#xonD*PXt?NrDdILf~`VFZmTdC6UE0Z6HQ&d0p(NEaO_~^47PuCJPl_$Z5nhjK0 z=|Ok-sU@<-<EWcr^|{LQw`o4h+Tv%?(c$_!@}~2ULt$1-P`sk;<=zpYRwotZO)5g` z8))uancP**l5kqPnLE^BOL>BQ2~XmQp6|>?#w~;KJCt2Gv@Yzaw22Ele}?U9sD(tu z5qBybiVF;>g<2gUYS^_xuQMOMW)ktHCG$Cq6<U`&@#FoeZkj!52RlnAmAh`WGaL)* z2$dW@EI~`HPSf$^nlDxE+VL^xd%2~Xd*~HAjvT~{shoR-y?d|u4!P7C`juj&+#*Iy zFYl0$3{UDS#T%|FZfWNhZ#Q*I7SX448EA5-yo@Ez6nUg_Az}TOB;ShX<+1r0^!j3% z(L(n!b2cZYG0@8WkonwE+-$(B+A}=zgrxrH6R*Ok$*ya{(IVOUvSk@%OxY=uiS(kB z8hxiK-bgim%)0w%?D`d!TDr7dJ6V~VDPP!)efr>+YUp<;?|Z3rgJ7;$uIZsrhe*kr z)orEJ^4<Y~zKy4uM#&UQ4?RoHx(byB+Pn?E|JA3+p4<_a6?;3EKSm_HRI80Qw=Yt} zFM_nyQMV^QqSVZGAS%s<v)#NROCtVdZs}Ng@!j$oBTDA#a1$O!O}bCaTpq!JK3^wf zWLLLR?tP$S_e<UI;)p^OSrX;tk)C&ZEcC1V$-Da)eo-oK>ix1p_}0;uGpmKC0!Iu2 zX(C+>!um>L7%CbZ^qwXfx*C6bse8(-QG$Mbgsp!dr`Z`}fn3+9<{0f<ks;C-6xHe^ z-E`klk1!0bIcl~!BFn6FB;w+JQbUT1=MN0)$h=xbZfn%W^LD(LiZ#G3&#;s6fVQBw zaNgOxZ^CKcR?De&S^cDYWtlfdq%_jAlA5(KoaN2_k#ENX1%0=Tti66IV`pQ;bu8!o z@BSy*awOjvGQ1sfv7oxtWF&DhMv%SB>ZMB+TRDBY&#ve1xd)3`-ri}c&8z3Y2nGbd zE>g|t+C7w4C@LR(Q^-`#DR0ohk3A@QoHT@6>#*h1%B_i>p~S3H{$>*Xyx(1XkIER@ zu-`p5`LekrME-_gf^IISP{6rZwiN4_HWO*SGF?B%lz_mC<lJQi0h4KbPH%pWnBBZ* zxRq;fX5L!*<o2B>TPnR*cjw&9YRlm+ZZp?Y9$UGqhK?nb<t)pN0LP(?p6`yR?IxAF zY0AXX!$?&YR58rMtw^!{nkgfNd)}J+k_R?=R_Hd+tg!X{@oSfVd+p8}7gd{5d%moC zAW?SMK)5WW<n`0LA6kva8@4As4lcSY^TnA%Zi4v29Y=G15v`5Gr<vkBLe$FlZPz## zL1X?}Nbt2C_t{3yDYKhjzkXZu*6p#Ggy<usr|vwvC4P*W7JoM7Sf}E9rn<gG;Z66! zJv|$HswK>vlBYOL*-wqqhw`3gxpaE^%a==1k82J6WxPEU^Mpo?O){hFuGN(ubUqc= z|DMZla?9TIvE$PQj+ZMG>WB7xlr8Vl5UdDzQdg2N{n&AvlZ5`)(~asx(%JqA_jzBQ zT*toVGh>TnZi7&+p^azn%ZyK<Wk06QpzB|<Pj06rf#Yt1m(a3>SqH9TW`!|#wfp13 zjYA43;kpOKFWI*;U5~GwBKc_Q=;lsKLN#Q~V7p(9)qYBJmGr$Z+V$&5UXJ!T4&8n7 z{MU+O=eX|sva+Y0a=mn`H9Ws=Jhzx4@4WRy%VzfdymzuAVje%b-h0wli&;kB<*~lg zH8}_7!`4CAOU4)Is|#<^U@vPC-(g94`#di?{=fIW9oR9=+l5<bSF*|#?-)z)U-4h9 zvLtK%y-OAI?)60?l`C`0_9-Mn!K!Ia0+C9`#l!_;4+qxFmiNwU7HHhxwW0iZh6+Ur zFR!#_0TD6%?(0-OTs|p!?wkj6Qy=UL)tTVk&OrtzlE{^lkg!L4U6ZJkFq)q5I=RZx zJ9X13H8#e5v9#4Z_C-h6{@}c3E9Yp>vcV+LCUq#DTgPGB&G5_CHqM55>8-ib0>qW= zLa#(`Ij{%%1^L<rYvs|?jYpckPdA7XoDScmD`6;{Low3ioX33kc1Gwfv%5th4ehxO zs!Ek9U*(3(eTaywr(W`qN4On{d}{aLl>YU^+>Yd1o#H>+DkNf4YmYYPF<;NMq&B3m zFlA1>>vN>E-(TQU<0ko<Hz$cs=B!&gR_0iJ<et~PlWhYv3#MxAGdu)oA<Rp{H6Vlp zICp0FtN`yCzyaayO#f+&#Wq<etJRThl#P}@SV*C@wwdGVS{gDH%?O{f`WKom?zFSG z|A|jItNoDf17;h09`Fd(QdRq_wX}?~+mDP@d_I*tw)f$egt*H+pZM|zTF1gJd;aYG z@+<Vqm+^{9ksIa5hj*RbopyzVs=%lwp9S;6I8@k60Z!g!4x7+AuY{2tyx)I%V%Qhv z^!1O4kLe!cPofPAtM}*(JGJSOzy~FvF{(IX(|*~_7pBPj`cF%qyH96z@22Tzv5|34 zfgirj-&96CQdTBc2MHb-HKTM3l1`=%i@}t$_3y5}|K!m`;z2K2tLgGJN7sHa_%*>+ z!O`FF`iV)(C{J}?!|N{w5BqHe;bc38y<V+ho)gg*;nK}7<kFQq{X&~xeoft6c50%+ z<3E|kO74Bq8xqcNFiVg1b53LiC#wwSVS}>k(|kV+Ftjz<=p1hU8Q+*mPchI_u-8~U zokm^Ge)@#%FSfw8+%Ij~zXE#APgWny`4|uxAGposLw4bt*35(DnL12q@AS+p4+U{G zt}|p-%{Uap8C;P;V=WbJ1Go9*ZLZJoR=7crwGnAsVXs>K!YU4H*v3{)k%JAh9+9)m zn@Wxqw(p3(n=7!Nk4@v%%B_|+BKsWrk9hA_dtUmK_~V{bCF6~6)tW{XbVF|FhQv-_ z5Bv}k>clE;H!%&BlQ&{{el>Hugv|#%8Z$p%ooCECJM!Ld2p8vwd?>nO;|KLG+em`! zidLo$m>$|4ltEkOVdH%7qq4PM{QgbV4q4JQ?eCS&7b>Y{2tFL_uzH`xKvnmwih9R- z%8PW?>-(N%-MuRnU{|9!eLZvA;r)~Thl}3OWyck4P*=UUN{u2*g6oEy!r7I?6gtj~ zI!yfWg{!q(Iy-57%cBJ-ZmNzQ_OX>=iriI6lvsD1CSGZK<<Q9!jh-7{(#9X?>x-rI zrA)nbt)xx#ld(yKMt7QW*Ti04%!TXUJG&py?sVd&YBh{HU(aWknm@STTj=QcnQF5% z-|n?L<s$Om|2L@O_lz>X=t)(#W3M$AX=j-tulay}PL~XyNyP!lj{lfMKiS-1qpweT zaO{Ao3R~2E>J4v4gv<wXEGR55AJe#gEwI_`+A5*@-5Kkijq3VQtBCtWtJRWT7+`+# z&@aW|)<|Tk_5J2=k-o|T0as-LWsHI%tYo7YF=cXhVvg63IeU4yU9y!oewE{Dc(J4` zNN;;{6Wx1_%>s9y<W13?@Umqnb9<z$)UmHF&&+(c{SGCC3A(1~^rI=JA-11F-`B1y zkW4x**%b|$-j#zJR}b-=|H8Q;@mrLQByU!V)M1Z9lvnr$`X--C*gV9f%5dEvJscZ- zvw2;Z?I|0t<9o8UMQl9G)J|rPRkgYn*WhimVRs0Y-mOb8M5=Pfr~7yMW4j%9lI$0E zc-X`oLZQL;i6t(P#A(m>Zwvvvua7*{HobZKhN)}8o7Z{1y}ac?ZsdjxOa?E~Vulnt z{cS!A9DkMRlBeYCYeIT?LX7`|VI{wA#4mGo(v4T;s}x@!-^-^tOf?nG#oKtjC5Cyc zrKlKY|M>t--52DFdQy>nuc*FfCkTZWX+BP&tvQq4cOq@W)RxLiBSxf^_s>zD4trj2 z;kmY9;+&84>jShFQRE@b|5=i1IeyzXrB~hf)JFZ&&xGJgo?_xJI>T%14D#vZDW?O@ za21n1=bjMhT^q(OXe}4+=v$=cD?pd2=EN0lG`e=8AiXO4=(D(Ooj-h2xWWx~P`-JR z(83cQ{8^ItggCQ7KJlGL;Rh}~+E(eyRm){SYUH1<>&+gRMs6TiD-lzkZmGzp{xS2# z+31@dgXaTyQ+f|#{W12&+vNOe_{F8t{M0PS?bmr~)Smoqn0e9W!`_%H`};R=u*yA= z_6^kK(!=axJV~!?HJMhy!4xze$naUTHd9k=4cAi@?OSZ^efo-9o(P89q@Uf{&h?b! zy}97@@yd;jUkjhwq}rQZKht?|kXK{c+tFlv-3Kp$pZ(je1q_^NYuoU+@aFgIdcMye zBI`;gw{-O}=3NdC*_q*dC$Hx7lcFKtOSGZ^^d1#8>#g4$KKgb;NigHrAgt5GyKJ`R z4~#r<41;N}>o7Y`X$wR>yV`v4k?frcd+wW2FU?Myaut}nS9Zb)M&J25xcTTNjn#Ig z2EFuP<6%0VPx;lGtw+v|L1geWSBg(!w6@uaQMQnb!{^@X_6p_Yx0)BxHCzi44bKkT z%)fo8T{yj6w17FLWLh!T<}qvR!}8TzbhEAx_N_d5fwSB$j=YUU)h$0#Pip_0ZY{lL zol}>b_&T#2+iJfx1%$luukv8q+?De%;C_eV%7aEWY9IQpWWY^N4_E6|MXHl`zf;|o z!&SXb^-#MBi^K7zPio(4>NNdapGnjVC+f7^4i+s@$-YJ#=~(+oC^k@dCrO`Nh*e-; zRN#M)@*|~htG@kDaGLMYWF=!1qx;pMe!8>YM7xKN4@~~hQvQBH^Y)1id8ZsLFC_h_ z+v~y3f0a*g<z)U()?f*emmlIswI-5tZ=BiEtEJ0$?2D}B{T0Cx`RfzJu15|tW|eLk z?@zOEZ$9PWU3=>u!!ViTnqxN2Ov8`uqped<xN0&h(%dRm5;&b;ux0P)p?-3ku!3#J z95Vaq!){_G>Y7ff@8TPDUY9i?8RC7py2V`Wftp&?&OKY<lEXYX_L4KJZ;#w1wmc>> zXd3y&a#u1R|GjP9QY0-bS;x6bS^FvXkM;4k6^DxJYoA-Sh4*mHrI?@D1zT))xF>Mk ziFW$p{$|MOjlPK#pJmozwHHE(Wj<V6hdp@mNE%!8EZFoyKNefm^QV{Jy4|MoT723g zDqm+)hJx7J=ewlWmu^|Z?^s6fu`=oG&lN6v$RwQ;?#g~yk^g0F1(~;Te#b_NANzJ4 z=j=ZD@nIvEgcjYm61G)vPL0V9S(XbC@2iE^yke?1HCiK`+(dqrw6!^q{Bc#Bg4f>1 z{mudnxgq{S>%-jE*EYQG*khV4AQ<=5q^7Obhe|txMd0ddR#T}L$7&o40^%56KXZ-? zU`}-!Har*Nzn)lN%Q2OhIOTSo-oh&q^t2W#RFkqwr`HegexrU|FmCj&C8MG7+|kHF z2|1TB(UucUJ;oLsuF;YGAuQIMMuA+M7A~Ah31Xev-GSF)qx3k<2W+N2Sc-DH6?Q7z zYV;o_N;>3cd_4eeC*HvPrg?>$t4Y+sSp6Eo<fL0it%phy<8K^0lDFp<x#0;$X^U8Y z)j{Pqg^iiow)PP>GbBVSL!^5(?O*1-Hc~zi99$c`F7Y;1zi51Yi$>j$NwIO*04r^i ztohacdWCYSHR}W-6yJzX=eavphG9isUhCZ9vafW@Q3Y3GF^gy1d#jD_D;>esnF?IG zUG?Z&f$*=KNBf^?@@6~G@*XxdV7MjLn;7UG+dJ{@EsY0f?j%=bljK0wxzvk?J}CFR zQx3Rk?|Evy0k+1i>*Mz6^_M(J%7z3;3-i;|m2#S;ZnH;+8;RC_6it?^pS(>go7WrD zmm7CiDR`e|a=TUf^cLns+xJgh#o}%4nrM5^yLUNcQXk<kD^FKCG8D#Gaa@{h-Sh4# zo6g4vv8+Fb>gr#47^SbF^H|fH5Fu|nD9m}`j`M>rOcEE}BrYD}S)2TE^PU$edj>B! zNywL+6aUgkk^YQgKx4G<VO)q?m(J%>E4Sw&!N)>7YT~72!+PqX{V#RYuk=w=$yaZ3 zGSg(PdM}~H<dSfI_s%TFeXcjX$iM18PvqL+I(_rL(rU7vlUBlVhd!A{)TcLJPAfA$ zT*C0xaZSLtBabANGk?D8{bk3xrse$wCd$hfC?<&Z*7fP{x?Wanq}lU+XPa?OAW>L` z6({p<rMRcMBdkLg8?`zm3r$__7{(7oR(dOZdd#KW&Ji8lCKamdqYdZDrQcp7vG#V? z+SMW6j<S1wZJEfk)yd=To@W>RxM|npqGOW27FqV0)=X7mvV$kqy<`^^IrsV3W;;@; zWGS*PrFWC5hdmQT(l}qlCZ#pDMs_wl`?ev|geAc9L6uv|IeQVTp1T0?%C6O>Co2O! zi?8Zpo%c(f^u=m1<d*~Yy|ESgXZ1!^KZhsVMNN82<i2L9dj0EQA<qSV=YUtoG@1^$ z*-W$Qe0U`?Z(N2<Xg^d)xn~RGv6Jv};2f7ZnwZ&|SYmjs9W1c3V+x7y*ynr6$jIc$ z+}z0Y-N=OZk>&MGJ-zxy_fBJ??mn_Ap9gO~J@}^E(^y{QbvNfhp~610lBugMzjB_I zH`4yP`n0^f?W*Z1bG=~dm0MkZhy{4Q|1qs%m|4F~jhZ@`T4p8nrp>Y59P5dxV7KRr zl^clR$|RU?&jWUW!?}lo2qxlZp0z}uXa0}6qOL5jipD<v=|@EKJ|!nYS~}wL+4d0p zb4z$P%ziiXdzv>=Ii34dT~<S7pQ4T~pZdP}#E~)VypM=r&*|?6A$|vbo~^si{|2G@ z=U*Xz!XDM%5AsbH{5<;&#=`~U;0)_p;7YW4?Opge9Dg?NbIKKeKDYR@|A^q%Fv~aZ zYtgx{XA8yu@Tu9{r!K&_t2OFVp^W!3f9N28{?QN-5z^#P_!KEo6KW;s`uBr;k^lRP z#ll^v5V%rn-ghrh-(fr)VFDAWDwx=zh%W?T`-3sVE)6V9`dd*)ftW#+!V>FbjX|qy zAszz?4>?g051ze=2SLVIP(Xh8ft)bTu=Ip5S7@;N1i*ezBFxv<!X|D-aYh9D<?uAo z#R{{uz_?IodzXP`?En`DIxL}AWRL#rgBaEMWxzVSIy%}}W1I*}5|+)+!)-$0E{ie7 zKi|(7+%#?g)7g0&!mOZ?M4{vT)x#Vs_9iY+LR`?Og?<K&<b)f^33J>PZl^=@v=9kx z{yBJ%a2VM_AXb!^1_%SqZiyjevuHRDm_WlJt3NYnPEc?q+)U&|-Ps4RE;GV#&VLG= zgfY>Ubq$5NEG?p=#S0X`(oI5#Dl&+6e<iexh=E*H{8u7ExIVWxaj<rDwVPSbiE@1l zb&tk6jtk2H>tbzT4L%uSC_yaRKWxo(w_F@pgtf8>^?eV{?-!aMIS~>Rok>^|SfP6l zfFh{oP>6`qyw|THB2rV4SJco^<a6<G`D?f2M2N4oIIWp84$-U=KHh=)&=^AHq69+L z%*EObgA{>hPaqMPP1zQr>YWsIjRC}skXLO-p~gdvc_~!fm|d$vI}0J0bU^oHM`5~x zF)qT?#yDaiikc(5;s$haWZk?50I30x0|jUW-D43T0;GU3!#e$4m9((gtrrG{20)nR z&~!EwVhLP!gcDH*<KpW0XG7gWyrVidJU##(4RE*>h1U!D2!6c9?M19UkL-uG4WOKW z7cD@tEjZ8?C*}*;)4FCgS_L;bZ3Dag>(vpXE0_cPn?1@pJ7b*isNzwk`^AgU(7T|H zzrhqi$^p&HHgq8pbVg+PE5>}@a_xm2CZ<=#b3>O<0$ctY`w?7UFw2Fw@>qLE6DMnD zti#MtW^=307Q&VnJgDLaR&_xy$YjZ%C(ZjiB>VVbe=pZvtRAE%p2$%T^?)wF3al9o zYR$J8boO3$#3p6UO&lRd!41k&vd`%WaQX&-0cGw<^WHAB3{ZI!i0AmMGl={8B_|MW zD0JzabI6ErWkr{ZjhpMn6(X1Afa_BrU$i;=k|KmGZ{iF~qRmXqF}QIB8^d~HfzwKO zSy3EckXekY>4bH`n7Npk+TnqFzE@u?3Sf%i1%sb^(!7tzE{4PJh)#_s>FxlpeHV@x z`WucALGsAq#z7j2yNP*kig|Ux{fL6wM>jD{9XA$1qb#z^8f%4y=|ksan`<D#8k-hw zI5lf$7;fUT$2-k*tPcQ7Y>|f)(#DOaJu~9KXM=m1S)c1cQ#m1{*oxv$OqUQIZsBbf zYB+cSxXS_CV@07g8sSDG7zNLcZf|_E8r(N{+rNV%M0nxG1mG6)hIsG36Bg~(z>_Du zXieO-TMV|e^LBZ7U=<}ujUAXnxAn07AH3hGm>gIeV!hfksq|v@5bu=`XEIF%qI(E0 zn!WVX3*df35jK=b&5f$=faMITK=-ZTGYjzaVZ;H!U@>2a*bZXWj#_}o+~7s)AlZ8X z&eAdyeVN853MtJYNc6S>;GZYWTh8YX*zc;vtl4Th&5Vr}vxbNaTOfQZ0s<2a{p{gl zf6<Bq7oZW6KGMpB<S2dIt@Hy2H5-tAGq!XqeI8%a9|UGxLHv-m%spw|T+#Crby*9% zVaMwFs?Q(c!!rPZ)}CC<B8Zs->~M=H)7edde+?1QF$jntrMV}~8v}m)@0fv5Zt-*C zX#NP|5g}7SW7J(+fZ=M7$EyZrsjPSl)DeqBV|>n@k0FP#z&hc<@H2d{=@Vdh1IFKx zE8-2va~ER}5XuIRsGv~*3Iw3db0R^2c=P51{l3~AU-S|o@yw2f@a+hZ2XcYAC(T>` z1`1{_EBYNNIF_9!{fPM<t`8l!0OC07907z=>01Oz;I@X;ec!#eL!*fR5*;VophEiB z8unRxsAG_W1P(aOtw&v$!rfe1nob8;)$pP<DqJ!jOU2RwuSQce{|o*M?3@J*bjkNj z>3j@r7~<n@k-NDS-6r@t7+$n0lgj2JApM_11M7eX#<{(I#1SC8Krm=VK9?_q!OaK> zx3lp^=p>|&Cn6_-{CU#6!z$(@psJL}ZVfv-j2&VRuHXys1?i7+^*?t2co76@-ap9j zXPWods%3-Y=G)#`qRkd~mH{Uri-NXzh!=WZbya?@(8}@qN6&rMc6j|-(-(=9tsv-0 zc;!&!b~XMZIoPvj=W34mLlt-P){Vbl#Z522=^yE-I4px6zsM->74QixG(<##==MGN zH+s0+lX_CW@h9N=g8X)&@VB=A1HLD2^qedGMErn^48g@w=+@8hq9dhod916Qxdzrn z8)ITF58Zvie#(Wu<AjR!;WVJ34K|G)_zXWMNJrho1A*rdz}HhgZ*nzJgif5bXyDV^ zu{>nll3^E?Zi<FfBLbWZy2@kQy&PQJsFG>f^jRQhB+{e%wGsr&zy28IG!S`%9F$?0 zfOYc3Cx}hakA1g;5WFC0OQTdN`EI$;+OW_QIfTpF!IE&U+3y_FstmfsfPX^UO(g{E z<+TIx(6e!oKzS%~s=pDORVX+s9#o@_4lk1qZbh^Sz5Tob8lV8+=x*gQju-gPRL<|H zj)(|1I(Ef)Uml?QLgu>%#rFLlOQO$Yz{n7KHX+7MAy#Z)Xb8++6!=G{BKN14q%aGt z{(I^HpFz1#FuWcF60gC#p-GUeT!Bx=e?+u^#P2%|7rKSPthAauAaQOH2`SQlCGq=; zyoDru*uI_Q1riZJVmC?^d&&Qi1a3|IC!H7=0j>?18bf#Ka+ndu(-r<qWhgqB*<qdk zT-m;m_dUg_`&)o#5r9Xh81dA2q334x6ii%9G_f$6!p*m55R(H^rw{{hbPp(|`3Lad zr)V!^y_TMGe?QpfB^dWXX>0CD^X^!^H2U18Rvl|g2NM_AuaBn<@#B&_z`rUeSY(a{ zk|xp8{|lAhQ;WEX9Kebff<%ZK;6?ko@QwdK#93#Sin$z~SX^J}DkuaEAq7j7Ks9C@ z5?(xpG^cG%sJuBKCvw2R4upnGt>f$1pUQ4}DnMg&f!IM5q4Ny?8=*hhz|6j6$PZyF zvg=YQfsKT_2O`oA=r>|0E~J_MCoXVn&sbXAk{?K1hDe1DizX~flhOS>Mb0tvgQu*6 znH3h2c6^c@*UqNngBa`$14Jmh&OK?~pV|IrVz}GoRnla(4cf&7AqGv#jq`scg~v;4 zmZhI}2Qou2>O&jm82A533U`~rroDdEgVWdm(H>oTui3qPLb$Ohk8o;EfI^Og$)PjQ zF7ahz<LS48rw?|)h>r-&iAa7<<%knvl3W^jZY6-Mo!#sSsDB&<-ofFasxtPop!&U_ z6MYmxNvZ!I!Py$XocEpS#<<1lIOLg=2$|;BO$$enyJY`gJm4nh&d4FQ9h$qJZlMq6 zQT-QkbG{Kz*b=%u(2q<}$wSljqePpj^AB|9BxrpCV?JAHgK{f@S+}Qhyy6fSiJrlW z4wsmNOVj<kGzQ73G3EzwRCbZ_>D77xlF#7u??4}uLA9>l@PDE5JEGy4NXt-VH~j); zssNrBoxN-@o=@#>4{&la@%&pUBRI>FM#{B{3ly~jhG^&vThjzLxU;jXy(6+7LEjn+ ziyUAQ)WZxj^B1^Hj=|2e1gXNwfGMDd9t{|r6#jB9?*vzkI9Z$E296hR{GbMUJ^-3P zCteS2Z~`lOn3(+@Db38Z5=0mAlCPBj<aNM0x*l=V4kx;b1Lj}wt@)$ugTZ#L!pniO zp$`r?@n@!8bv(f??QzSas3OA%104GT$DAm{Vk}O?Sudr7bs|te>$nz3A_AZ~i$G1C zmIlQW2yb}qv_W!-ap*tWP@ML<ED4Ic@r~g`b<AK4FX3fJL27#7goJ{N9U*BBWUaXO z4)_~^Su`|{H#~6y>cW~)!h`*@H`W9TfE<aSugRcz?1Vb*-^6sTBhM|5gP5j(u`q%4 zkD6F;y{6W7aA+LH8FlQz!jZ%2^ECWIK+PEX9om4c&o4pE0hS#hJ)0nYLA-xyDM;H9 z6p8MBLji>GXA9ee(X|GA#;CyVjzJ61erYUdS?Ir~ARO?{2S?kssWSkDEkFV7R&`)C zFClHr^u*l+g>%CvAu=3<vkHWR1}}rfCQE|vAqY;#?rsG>h$sWNM~{@_fhHkv4Ocrm zg3x)K;l{@Rwt11*wIT^a&rC<pdK7{bk~8hUBj?OTL28dqf{9~rQkYv42pg!)Y+am8 z%rG;R9jLASuDsy(2#PXl>i0nWE@1!YF>PxCVM4lAPFQ!Oa3pWy>Wm>s<fk~3;3FWC z2Sm_=uXoAIB%+RSc7|OD1j!_r7e*q>RewV2CV=uB6i^Muq47DPAxB&3m{<^oe=7CH zI2N={4kKptc;V4?obYpNWM_NX?21|3YA_3u;w%H~RKP~}guHCR*t4@C+JwN9RI-fL z0=O*52JM4x=Me@+q8?ZfUUXz?o5R)Wu?tB1JiKVJY$za%zVuA@sY3zU$aKef>V?Co zHaytB7ZcA)9BX23ji;7_-8S9D2*^{=!O-Q#iaWTu{*647R>RuG-;yD);$l4g+&N)z zKu_UCJ0RY>1W6#ND1;RPQ`NE&3P%D#qnn@wXuqFVK@b}6IjRfe;?MTJp&ZaCF))vo zPhb^63bSrsbY5V=SH6%t=xTo%OtJ`+tBLBa0Wj%{qr3hoW8xrjz;0$8=?vAG^>$0n zDFg|RSlEK2cmqpG(UscB+JB^ur%T^^ceoIw=MIh!ts~9mr3vg=h5)ag2>j{}R`6tz z73hM^EhRt{1w1LJO3(*+Yska6Vf83FJ7Q}8Hww6AbTsT3<7<%7OOO%TV?Towl|Tz- zL#Xyl2ghF^;|-A-lm`pbhPZ?Fs;hwNvf**_Uc?k$26;FUvg8>J9y7Rna2$e1oa%Ve zgp2`jZM<Qj?>P8w+2D)$Mxc+jjK5NcLGtl63!}l0k!3(HIQMbB-$2kq<Wt{bL7VG< z!cJ7Dj)FOP0wSN687<};DJPr_{pO2I0Mf&nIBpcO#xH`%Gc$j7CeC<@FtTrXb1lF~ z20`5Dk@ruMm4rA(aA)msF~f)`Bn=v5ia->d;APOMRTc$7;MpAnim<d7Apz6gu(<)( zdQF5#W-d`|ELh<%SRuOLd=s{>5s>#R5yIybFI29u=mZ^%T8LVJ7&?!;4(s%nB&LnA zu!Hrwus=Z_mZjicwu`hWrsuP=6KL2MUUcB}Uq_J4(g{VCWtW{C=tBeg6}knAv;?7N zx6B|5g=TJfTcQ`7G3g}=0oBWby`t0i-Yo>l%-bEL2%8qoTnLnn5K*<7N!MtBMtDFY z=+y23^KuCx=>~2KrorS44FGZ$jPO-ZUCwOlzn~v*(1qQXSXUR0x#OK+^Z;u)aFdN( zwIzuddZZ`xNVJk}u>VhFag)iu(0#lUWQS}AL{~v6b}W~Sih~>07DLDjl%2e1OAn3l z1FJ(PQexc8r2^}EXV!A!@L-4$9Ee}LvlZ0z74iUKl$x&c{R4^FgcA>qWJB%X*C43f zQ0Uo?qERm}pT^vfY9>khJzT?s87W`;+zzn3;N6D8`~owRf8EI(CgJ{#h$6#Lb*mXb zIl~J%%iNRZog_RTa%rT9_U*yaAXIPA9lF61Q0e>2+^l1m85PK5VX+;uDFs)?i*Wb# zo^MG52(boifn$z0WbURyY$;6KHvH{OdCqg-vKD%%915{P3J2nhOPN=T=9qOd^ZsV8 zgW{&wDpyWl1hlTuF07uelwAfr+@O;Tm>)+#EQR1L(Ou*xT(G@J)C(K&+sN?NQxM6! zUCKE-1bw|0$m~GLDF<fr7n6WmFYGCXWhGcwCo`NIY!K9Sij@ps0TsK*M*3i{_fn{f zg@L3wHOyXh8NeYG;BG~6x>0j6=I=Zh=lWHI!;bE}nks0s2Z$EEy8b5)G$g#qTbWqn zn9xDMQhd1{w}G)S0T?riwMm%VU)Wr5S_mGVzE4;C<3Cm~q(B(_q5D3?!Npj*7<(9S zn>cyy!~Q+Nc42n1a{QSMayS99J08uR{SjP{kXpgTt+=(|mpkH~3{Ct1FB*#)3V#cm zilk{sTNh&?ViP&^wjc_0upfFoJ4$SC@n9Luu9d>)Mr2oOowx=jmjD?&D+=(gId0~D z1LEdS;epAeQjpmv2p?##lxj@?4mR-OWAIEkb~p4~qIf`LLot|aM;H+|hvywSYoH89 zv<{>QTd?LH*d&L=fj66L;D+M;NIcyDP{<f%>l_f`f~k)$hJu|dGr2duhN@CT{>%q7 zV?aZj2_5W<S!gDI&=zxsbbPwi!|UikXjee9tSHV_xT3L;YCSB8CA_A)S9ZUE8^F0h zCqwsqJ*XMXXAK31o3|$hS~>o}QxUvqg_57Z0j7X)HgmEz#hu|JZC!0F`v56zJAgLP zc+L3n2+W>R#2cN<glv&&<3g>bgEv^z*qPh}S?G(qwIvKRWCuX24j{g*C`|-k#DVs^ zI*Q9ikhZqkYku7cN(g{)E80djhvP@X%~{f~9i@rDQ3JearFuhUdQm%Pmqp@ZjAh`v zc@P+`Hu$COsAe9D!w<H^<lSgW9Sa!nTTlkNr*d7!i@CV1h}#rnP5BSj77@W%d4b%{ zrQm{cbuh4Yv099U=s@n=8y{p6ToSO*Yz<z;jfHnY?Ec>2qhkPtoUnl|aM-8efI=N} zFk7p~r;iWaCdYmPgQeg#(a5<lhqXw#xR7yFlaS`WO4+F*56Jfy@jRNjOyu3T1)HB0 z%=Q$J^TEK;MVT|OM{_wm<HmhbWfy$|Y;qk)8a=5HcVl_D_?=G+cD#8l;9i9ny}~jw ze<^GYEE4OTVdXkxNd(5`h}1b`oo)s~8%p6t>vO7LDLTl+3;q`L9!g9>f><W>UNmwu zR3iyXo$x}2Yn#28kfEgIB7F`NEf0CIK9SCRps^vx736RMUUZ#;sCX${!ecc=(soZS zuSf)0+<?RsUBbJM3mtV_2*Gtf+oK<@s0Ts6f{uf(@m?>-!8QsQ@?XNf(m29t^EUuT zHqoPt-xU?h0RK}L#OF?$qboO#1HA1b_!U+E0*}Y1kf@f9i~>9|OO57U2~Lz+WP=Mu zGsit1$8x5tJ+dAQ5lLUr@cs|~1%A(BdqgZI&e`|H6mXxii2Eyb{{k<B8(#132AS_T zh4b;zzrYLQhIhT!oq$-5=OXU;oBjn}1ULNal+qOBM3b`+#3iA_{&~{8k)tY>uUceA z{g0k;Q>x57_&Nu|-HNpf`&S2ep=DFT4W2SC^%U0S6J^4S_VZ6WmIBvt!8$s^9IU4v zoQXof&m+Fg=$3^UZr>);wG<t~z70Wt&)gGY0~$C1FZ&-&z@KT}#N9a1mj;yMdO?M( z$A^kN(N+{-9u7cfepppC6Z3EjIZ0|G?PEZ*2ltD1?7Mmwv**k&XNNVjoyosZ^N)Cr zDe@0^JA49c!whl&bQ+-6w|w-)oFjrAyumuL4>*UC@`C)5b_5spEYpjz5O<P4Hf1vg zIEvt{wxMJiIf@Hwwrn#Sit!Xkh?)wV1%W+!fJKL%rti2QQHy{%=KgCjzewB5NLKeF zZHJoZ0<Ecy{{uK4)-myynD$Y^CVCi+$)TjtH?cH2Vr=s!zxQFC<{E>CUS6vBM;q`} z1#}Cg??+6$$cw-UU$8CO9)qlzh4s>l1%xQ{=ux&yh*_tAS#L)*VK)sPNZ0}cAs@yK z_yTh5ngjJP^G{T<2vc#*l9+g+Fz*}QfKPzQ4elDvry&$e7CO+GrvK#=Pw0I=eEuwy zFNww$VFs*U5))6n)e1OguMQpA5YjUalsvc4FNKL)LnUxwsw}h|sWYKR9+}&5A<iBI zGxPh5b>S*ZBAVC8wwFf=lN2yqM-LSRVT=4?iOwM6X3=9rA=(U-{U4;I=rlc)4;R$z zl<dAg$GOf-G~!0a1m61`1P!N$*omGYl@MG8^6btJ+|bGb-u3GNS_ZU__B-o@mIaNR z>wvEdwEb%97lv{}KP<XI^L<=o+2FYOUU-xAA0tci9+k!qy{z?6h{s%b@$X;wt8)0^ z|807G;f<VsY1k{_r?I^IIp-J45i?(SbKGBA0_yl_%{n-|Gc5@4!W)hL0*}IW{Kfre z*63$}7u;{OkmrSW2>pfb(!mc+U`7k!cj3J{e?b}b@Pp0;sl~>KSj)mwwf}-To8SV) Zm9-%!eZV646_hI`4?(783XX*6{{TREv-ki2 diff --git a/lib/orsonpdf-1.7.jar b/lib/orsonpdf-1.7.jar deleted file mode 100644 index 90892c7238b55c2364b8c79204d3aaff9e55d0d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68247 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 diff --git a/lib/servlet.jar b/lib/servlet.jar deleted file mode 100644 index d368d0f6d370b346f5c7d63c93685c0f980b0030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80054 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%0D{1?lkqtV>;95-WakExwf>+9g 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 Zm>YD&q{1RtAD!UG2%ZajDTAjM_&>4X3!VS~ From 468caee097779c1a50a3f8fda582154f2500d318 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Wed, 2 May 2018 17:36:50 -0700 Subject: [PATCH 63/79] minor cosmetic fixes Vlastimil noticed --- src/main/java/org/jfree/chart/date/SpreadsheetDate.java | 4 ++-- src/main/java/org/jfree/data/DataUtils.java | 2 +- src/main/java/org/jfree/data/statistics/Regression.java | 4 ++-- src/main/java/org/jfree/data/statistics/Statistics.java | 4 ++-- .../java/org/jfree/data/xy/DefaultHighLowDataset.java | 8 ++++---- src/test/java/org/jfree/chart/GanttChartTest.java | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java index f9ab66cbc..b745dccdb 100644 --- a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java +++ b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java @@ -82,7 +82,7 @@ public class SpreadsheetDate extends SerialDate { * @param month the month (in the range 1 to 12). * @param year the year (in the range 1900 to 9999). */ - public SpreadsheetDate(@IntRange(from = 1, to = 31) int day, /*@IntRange(from = 1, to = 12)*/ int month, @IntRange(from = 1, to = 9999) int year) { + public SpreadsheetDate(@IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1, to = 9999) int year) { if ((year >= 1900) && (year <= 9999)) { this.year = year; @@ -445,7 +445,7 @@ else if (include == SerialDate.INCLUDE_SECOND) { * * @return the serial number from the day, month and year. */ - private @IntRange(from = 2, to = 2958465) int calcSerial(/*@IntRange(from = 1, to = 31)*/ int d, /*@IntRange(from=1,to=12)*/ int m, @IntRange(from = 1900, to = 9999) int y) { + private @IntRange(from = 2, to = 2958465) int calcSerial(@IntRange(from = 1, to = 31) int d, /*@IntRange(from=1,to=12)*/ int m, @IntRange(from = 1900, to = 9999) int y) { @SuppressWarnings({"index", "value"}) // Though passing y - 1 is technically incorrect iff y = 1900, leapYearCount returns zero if passed 1899 (same as 1900). int yy = ((y - 1900) * 365) + SerialDate.leapYearCount(y - 1); @SuppressWarnings({"index", "value"}) // Preceding month can't be December - month must be 1 - 12 (12 -> current month is december). diff --git a/src/main/java/org/jfree/data/DataUtils.java b/src/main/java/org/jfree/data/DataUtils.java index 8f0c9787d..501de58b7 100644 --- a/src/main/java/org/jfree/data/DataUtils.java +++ b/src/main/java/org/jfree/data/DataUtils.java @@ -242,7 +242,7 @@ public static Number[] createNumberArray(double[] data) { * @return An array of {@code double}. */ @SuppressWarnings("value") // the result array is manifestly the same size as the parameter - public static Number @SameLen("#1") /*@PolyValue*/ [][] createNumberArray2D(double @PolyValue [][] data) { + public static Number @SameLen("#1") @PolyValue [][] createNumberArray2D(double @PolyValue [][] data) { Args.nullNotPermitted(data, "data"); int l1 = data.length; Number[][] result = new Number[data.length][]; diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index e22ad9b12..1717e053e 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -70,7 +70,7 @@ public abstract class Regression { * * @return The parameters. */ - public static double @ArrayLen(2) [] getOLSRegression(double /*@MinLen(2)*/ [] @MinLen(2) [] data) { + public static double @ArrayLen(2) [] getOLSRegression(double @MinLen(2) [] @MinLen(2) [] data) { int n = data.length; if (n < 2) { @@ -157,7 +157,7 @@ public abstract class Regression { * * @return The parameters. */ - public static double @ArrayLen(2) [] getPowerRegression(double /*@MinLen(2)*/ [] @MinLen(2) [] data) { + public static double @ArrayLen(2) [] getPowerRegression(double @MinLen(2) [] @MinLen(2) [] data) { int n = data.length; if (n < 2) { diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index a535453fa..9ed834b31 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -332,7 +332,7 @@ public static double getStdDev(Number @MinLen(1) [] data) { * * @return A double array with the intercept in [0] and the slope in [1]. */ - public static double @ArrayLen(2) [] getLinearFit(Number /*@SameLen("#2")*/ [] xData, Number @SameLen("#1") [] yData) { + public static double @ArrayLen(2) [] getLinearFit(Number @SameLen("#2") [] xData, Number @SameLen("#1") [] yData) { Args.nullNotPermitted(xData, "xData"); Args.nullNotPermitted(yData, "yData"); @@ -444,7 +444,7 @@ public static double getCorrelation(Number @SameLen("#2") [] data1, Number @Same * @return A double[][] the length of the data set in the first dimension, * with two doubles for x and y in the second dimension */ - public static double[] @ArrayLen(2) [] getMovingAverage(Number /*@SameLen("#2")*/ [] xData, Number @SameLen("#1") [] yData, + public static double[] @ArrayLen(2) [] getMovingAverage(Number @SameLen("#2") [] xData, Number @SameLen("#1") [] yData, @IndexFor("#1") int period) { // check arguments... diff --git a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java index fb7e32850..16d4d14fd 100644 --- a/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultHighLowDataset.java @@ -101,10 +101,10 @@ public class DefaultHighLowDataset extends AbstractXYDataset * @param volume the volume values ({@code null} not permitted). */ @SuppressWarnings("samelen") // While initializing object, SameLen invariants between the fields will be broken (because one field must be initialized before the others). The annotations on the parameters guarantee the invariant holds after the constructor finishes executing. - public DefaultHighLowDataset(Comparable seriesKey, Date @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] date, - double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] high, double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] low, - double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] open, double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] close, - double @SameLen({"#2", "#3", "#4", "#4", "#5", "#6", "#7"}) [] volume) { + public DefaultHighLowDataset(Comparable seriesKey, Date @SameLen({"#2", "#3", "#4", "#5", "#6", "#7"}) [] date, + double @SameLen({"#2", "#3", "#4", "#5", "#6", "#7"}) [] high, double @SameLen({"#2", "#3", "#4", "#5", "#6", "#7"}) [] low, + double @SameLen({"#2", "#3", "#4", "#5", "#6", "#7"}) [] open, double @SameLen({"#2", "#3", "#4", "#5", "#6", "#7"}) [] close, + double @SameLen({"#2", "#3", "#4", "#5", "#6", "#7"}) [] volume) { Args.nullNotPermitted(seriesKey, "seriesKey"); Args.nullNotPermitted(date, "date"); diff --git a/src/test/java/org/jfree/chart/GanttChartTest.java b/src/test/java/org/jfree/chart/GanttChartTest.java index ae8a44dce..2cf92760b 100644 --- a/src/test/java/org/jfree/chart/GanttChartTest.java +++ b/src/test/java/org/jfree/chart/GanttChartTest.java @@ -271,7 +271,7 @@ public static IntervalCategoryDataset createDataset() { * * @return a date. */ - private static Date date(@IntRange(from = 1, to = 31) int day, /*@IntRange(from = 1, to = 12)*/ int month, @IntRange(from = 1900, to = 9999) int year) { + private static Date date(@IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1900, to = 9999) int year) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month, day); From 2852491a6eb1c14242a015f02932ca5d490a7234 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Wed, 2 May 2018 17:44:38 -0700 Subject: [PATCH 64/79] add travis integration --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..746e2f12b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: java +sudo: false +script: mvn clean compile \ No newline at end of file From 90dd7160ec98130b347aaf29526e45926e4d562c Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Fri, 4 May 2018 11:48:21 -0700 Subject: [PATCH 65/79] change timeout --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 746e2f12b..d3d2e7556 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,3 @@ language: java sudo: false -script: mvn clean compile \ No newline at end of file +script: travis_wait mvn clean compile \ No newline at end of file From 67929f409ca87d4b93657bf48354aca9bd33c8b9 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Fri, 4 May 2018 11:59:16 -0700 Subject: [PATCH 66/79] some whitespace fixes --- src/main/java/org/jfree/chart/LegendItem.java | 1 - src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java | 1 - src/main/java/org/jfree/chart/axis/ValueAxis.java | 1 - src/main/java/org/jfree/chart/date/SpreadsheetDate.java | 1 - src/main/java/org/jfree/chart/entity/XYItemEntity.java | 1 - .../org/jfree/chart/labels/AbstractPieItemLabelGenerator.java | 1 - .../org/jfree/chart/labels/AbstractXYItemLabelGenerator.java | 1 - .../org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java | 1 - .../org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java | 2 -- .../java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java | 2 -- .../org/jfree/chart/labels/CategorySeriesLabelGenerator.java | 1 - .../java/org/jfree/chart/labels/CustomXYToolTipGenerator.java | 1 - .../java/org/jfree/chart/labels/HighLowItemLabelGenerator.java | 2 -- .../org/jfree/chart/labels/IntervalXYItemLabelGenerator.java | 2 -- .../java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java | 1 - .../org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java | 2 -- .../chart/labels/StandardCategorySeriesLabelGenerator.java | 2 -- .../org/jfree/chart/labels/StandardXYItemLabelGenerator.java | 2 -- .../org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java | 2 -- .../java/org/jfree/chart/labels/StandardXYToolTipGenerator.java | 2 -- .../org/jfree/chart/labels/StandardXYZToolTipGenerator.java | 1 - .../org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java | 2 -- src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java | 2 -- .../java/org/jfree/chart/labels/XYSeriesLabelGenerator.java | 1 - src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java | 2 -- src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java | 2 -- src/main/java/org/jfree/chart/plot/PolarPlot.java | 2 -- src/main/java/org/jfree/chart/plot/SpiderWebPlot.java | 1 - src/main/java/org/jfree/chart/renderer/AbstractRenderer.java | 1 - .../java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java | 2 -- src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java | 1 - .../chart/renderer/category/AbstractCategoryItemRenderer.java | 1 - .../java/org/jfree/chart/renderer/category/AreaRenderer.java | 1 - .../java/org/jfree/chart/renderer/category/BarRenderer.java | 1 - .../jfree/chart/renderer/category/BoxAndWhiskerRenderer.java | 1 - .../org/jfree/chart/renderer/category/CategoryItemRenderer.java | 1 - .../org/jfree/chart/renderer/category/CategoryStepRenderer.java | 1 - .../org/jfree/chart/renderer/category/LayeredBarRenderer.java | 1 - .../java/org/jfree/chart/renderer/category/LevelRenderer.java | 1 - .../org/jfree/chart/renderer/category/LineAndShapeRenderer.java | 1 - .../java/org/jfree/chart/renderer/category/ScatterRenderer.java | 1 - .../org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java | 1 - .../java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java | 2 -- .../org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java | 2 -- .../org/jfree/chart/renderer/xy/StandardXYItemRenderer.java | 2 -- src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java | 2 -- src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java | 2 -- src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java | 2 -- .../org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java | 2 -- src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java | 2 -- src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java | 2 -- src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java | 2 -- .../java/org/jfree/chart/renderer/xy/XYItemRendererState.java | 2 -- .../org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java | 2 -- src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java | 2 -- .../java/org/jfree/chart/renderer/xy/YIntervalRenderer.java | 2 -- .../java/org/jfree/chart/title/LegendItemBlockContainer.java | 1 - src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java | 1 - .../java/org/jfree/chart/urls/CustomCategoryURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java | 2 -- src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java | 1 - .../java/org/jfree/chart/urls/StandardCategoryURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java | 2 -- src/main/java/org/jfree/chart/urls/XYURLGenerator.java | 2 -- src/main/java/org/jfree/chart/urls/XYZURLGenerator.java | 1 - src/main/java/org/jfree/chart/util/ObjectList.java | 2 -- src/main/java/org/jfree/chart/util/PaintList.java | 1 - src/main/java/org/jfree/chart/util/StrokeList.java | 1 - .../java/org/jfree/data/category/IntervalCategoryDataset.java | 1 - .../java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java | 2 -- src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java | 2 -- src/main/java/org/jfree/data/gantt/XYTaskDataset.java | 2 -- src/main/java/org/jfree/data/general/AbstractSeriesDataset.java | 2 -- src/main/java/org/jfree/data/general/DatasetUtils.java | 2 -- src/main/java/org/jfree/data/general/SeriesDataset.java | 2 -- .../java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java | 2 -- .../jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java | 2 -- src/main/java/org/jfree/data/statistics/HistogramDataset.java | 2 -- src/main/java/org/jfree/data/statistics/Regression.java | 2 -- .../java/org/jfree/data/statistics/SimpleHistogramDataset.java | 2 -- .../java/org/jfree/data/time/DynamicTimeSeriesCollection.java | 2 -- src/main/java/org/jfree/data/time/Quarter.java | 1 - .../java/org/jfree/data/time/TimePeriodValuesCollection.java | 1 - src/main/java/org/jfree/data/time/TimeSeriesCollection.java | 2 -- src/main/java/org/jfree/data/time/TimeTableXYDataset.java | 1 - .../java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java | 2 -- src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java | 2 -- src/main/java/org/jfree/data/xy/AbstractXYDataset.java | 2 -- src/main/java/org/jfree/data/xy/AbstractXYZDataset.java | 2 -- src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java | 2 -- src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java | 2 -- src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java | 2 -- src/main/java/org/jfree/data/xy/DefaultWindDataset.java | 1 - src/main/java/org/jfree/data/xy/DefaultXYDataset.java | 1 - src/main/java/org/jfree/data/xy/IntervalXYDataset.java | 2 -- src/main/java/org/jfree/data/xy/IntervalXYDelegate.java | 2 -- src/main/java/org/jfree/data/xy/IntervalXYZDataset.java | 2 -- src/main/java/org/jfree/data/xy/OHLCDataset.java | 2 -- src/main/java/org/jfree/data/xy/TableXYDataset.java | 1 - src/main/java/org/jfree/data/xy/VectorSeriesCollection.java | 2 -- src/main/java/org/jfree/data/xy/VectorXYDataset.java | 1 - src/main/java/org/jfree/data/xy/WindDataset.java | 2 -- src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java | 2 -- src/main/java/org/jfree/data/xy/XYBarDataset.java | 2 -- src/main/java/org/jfree/data/xy/XYDataset.java | 2 -- src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java | 2 -- src/main/java/org/jfree/data/xy/XYSeriesCollection.java | 2 -- src/main/java/org/jfree/data/xy/XYZDataset.java | 2 -- src/main/java/org/jfree/data/xy/XisSymbolic.java | 2 -- src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java | 2 -- src/main/java/org/jfree/data/xy/YisSymbolic.java | 1 - 113 files changed, 180 deletions(-) diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index f602ca2b2..b41d6ac75 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -67,7 +67,6 @@ import org.checkerframework.checker.index.qual.*; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java index f31e433a0..3461d69e1 100644 --- a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java +++ b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java @@ -54,7 +54,6 @@ import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/axis/ValueAxis.java b/src/main/java/org/jfree/chart/axis/ValueAxis.java index 895277c4e..5ab8fd62f 100644 --- a/src/main/java/org/jfree/chart/axis/ValueAxis.java +++ b/src/main/java/org/jfree/chart/axis/ValueAxis.java @@ -115,7 +115,6 @@ package org.jfree.chart.axis; import org.checkerframework.checker.index.qual.NonNegative; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.dataflow.qual.Pure; diff --git a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java index b745dccdb..46a436f03 100644 --- a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java +++ b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java @@ -33,7 +33,6 @@ import org.checkerframework.common.value.qual.IntRange; import org.checkerframework.checker.index.qual.*; - import java.util.Calendar; import java.util.Date; diff --git a/src/main/java/org/jfree/chart/entity/XYItemEntity.java b/src/main/java/org/jfree/chart/entity/XYItemEntity.java index 04a759aea..d007174f4 100644 --- a/src/main/java/org/jfree/chart/entity/XYItemEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYItemEntity.java @@ -53,7 +53,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Shape; import org.jfree.data.xy.XYDataset; diff --git a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java index 6038d2c98..707ba2960 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java @@ -47,7 +47,6 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.common.value.qual.MinLen; diff --git a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java index 975f83ff6..9c7294c38 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java @@ -60,7 +60,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java index c5a825261..bc0c94a02 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java @@ -45,7 +45,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.MessageFormat; import java.text.NumberFormat; diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index b0fccbac8..623875566 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -51,11 +51,9 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index bca6ab1e7..c9f90e03e 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -47,11 +47,9 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java index cfb79f8a5..c4ac4b9ca 100644 --- a/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java @@ -45,7 +45,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.category.CategoryDataset; /** diff --git a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java index f8803278d..89d614996 100644 --- a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java @@ -49,7 +49,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.List; import org.jfree.chart.util.PublicCloneable; diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index f868a41ab..da8f88e89 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -53,10 +53,8 @@ package org.jfree.chart.labels; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.NumberFormat; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index 0124197d6..7a51a14cd 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -42,11 +42,9 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index e75e05d4f..2644dbaed 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -45,7 +45,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java index cfce0e119..4b47a7aef 100644 --- a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java @@ -46,11 +46,9 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.MessageFormat; import java.util.HashMap; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java index 8c5b0dac4..d70fd29a0 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java @@ -46,11 +46,9 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java index 97f7c63f8..22297190d 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java @@ -61,10 +61,8 @@ package org.jfree.chart.labels; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.NumberFormat; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java index 71cee4822..297098685 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java @@ -46,11 +46,9 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java index e7cc93508..3478214ff 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java @@ -43,10 +43,8 @@ package org.jfree.chart.labels; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.NumberFormat; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index 1920a81c4..af3a03252 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -47,7 +47,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.text.DateFormat; import java.text.MessageFormat; diff --git a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java index 62385d3d5..5a2622a62 100644 --- a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java @@ -50,10 +50,8 @@ package org.jfree.chart.labels; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import org.jfree.chart.util.PublicCloneable; diff --git a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java index 9775c0abc..a94cfb4b8 100644 --- a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java @@ -49,10 +49,8 @@ package org.jfree.chart.labels; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.xy.XYDataset; /** diff --git a/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java index beab5f873..2aaf0ebab 100644 --- a/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java @@ -45,7 +45,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.xy.XYDataset; /** diff --git a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java index f8d7c517a..3c449ad0b 100644 --- a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java @@ -44,10 +44,8 @@ import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.xy.XYDataset; /** diff --git a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java index c165feadc..1fd357018 100644 --- a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java @@ -43,10 +43,8 @@ package org.jfree.chart.labels; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.xy.XYZDataset; /** diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index 7c6accf3f..834c72a6b 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -63,10 +63,8 @@ package org.jfree.chart.plot; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java index 404d6b99c..2bc136aea 100644 --- a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java +++ b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java @@ -74,7 +74,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java index 3934c0137..e4ae310ee 100644 --- a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java @@ -102,7 +102,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java index a31cd81df..8209bf980 100644 --- a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java @@ -64,10 +64,8 @@ package org.jfree.chart.renderer; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java index b8bf94cdc..72a8b14f2 100644 --- a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java @@ -44,7 +44,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.util.List; diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index 924550aa6..b79a83106 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -114,7 +114,6 @@ import org.checkerframework.checker.index.qual.*; - import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java index acde54c6e..6ad008f0b 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java @@ -77,7 +77,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java index eef2a90a2..27b178c82 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java @@ -100,7 +100,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java index 9535936a2..2eee704de 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java @@ -94,7 +94,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java index 741b71544..a5afd5d12 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java @@ -100,7 +100,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java index bb0d75a0f..5487cfbb0 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java @@ -54,7 +54,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java index a304851a8..fe9e21043 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java @@ -57,7 +57,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java index 140f21667..ee588108b 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java @@ -54,7 +54,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java index d4cd6b639..934dcc448 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java @@ -97,7 +97,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java index 37e706229..d5e421f68 100644 --- a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java @@ -48,7 +48,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java index 6b705ff45..56b2c0a07 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java @@ -134,7 +134,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.AlphaComposite; import java.awt.Composite; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 49745e6a0..4ba5a7a11 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -48,10 +48,8 @@ package org.jfree.chart.renderer.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java index 273832c7b..8895dc0b8 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java @@ -47,10 +47,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.GeneralPath; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index d3b5e1720..d885fc1cd 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -112,10 +112,8 @@ package org.jfree.chart.renderer.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Image; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index 0846f0805..bf1f99ff5 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -90,10 +90,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.BasicStroke; import java.awt.GradientPaint; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java index 649eba33e..4a1960aa7 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java @@ -88,10 +88,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index 779f467de..71373dd6d 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -107,10 +107,8 @@ package org.jfree.chart.renderer.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index d0183d38c..caabca426 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -80,10 +80,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index d77551447..cd7de0807 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -66,10 +66,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java index 54c7cada5..44dcce634 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java @@ -57,10 +57,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java index 456b538b9..994998dc0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java @@ -87,10 +87,8 @@ package org.jfree.chart.renderer.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java index b3f5663c7..45931f603 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java @@ -50,10 +50,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.geom.Line2D; import org.jfree.chart.plot.PlotRenderingInfo; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index 46967877e..43bd0bbf4 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -75,10 +75,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 18c8586bd..26ffbdce0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -49,10 +49,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index 07610a059..d463398a9 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -52,10 +52,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java index e5af10d5f..e349516a8 100644 --- a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java +++ b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java @@ -45,7 +45,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Graphics2D; import java.awt.Shape; import java.awt.geom.Rectangle2D; diff --git a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java index 3d8ebe58c..1aac4b362 100644 --- a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java @@ -55,7 +55,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.category.CategoryDataset; /** diff --git a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java index c6e6c018f..9b386509e 100644 --- a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java @@ -44,7 +44,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java index 43fb7ba7f..0f11cf0f0 100644 --- a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java @@ -44,10 +44,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java index 6fea2e53e..2f0b98762 100644 --- a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java @@ -50,7 +50,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java index a37d44954..2b132e4e2 100644 --- a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java @@ -58,7 +58,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; diff --git a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java index d80b9857e..e5fea59be 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java @@ -52,7 +52,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import org.jfree.chart.util.ObjectUtils; import org.jfree.chart.util.Args; diff --git a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java index a0a53feb5..126193ee2 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java @@ -43,7 +43,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.xy.XYZDataset; /** diff --git a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java index de9c5f4c4..b1acd7827 100644 --- a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java @@ -52,10 +52,8 @@ package org.jfree.chart.urls; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; diff --git a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java index b7ca67184..ba1137873 100644 --- a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java @@ -46,10 +46,8 @@ package org.jfree.chart.urls; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.xy.XYDataset; /** diff --git a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java index 12911181e..028870bc8 100644 --- a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java @@ -44,7 +44,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.xy.XYZDataset; /** diff --git a/src/main/java/org/jfree/chart/util/ObjectList.java b/src/main/java/org/jfree/chart/util/ObjectList.java index be1c4c7a8..266128987 100644 --- a/src/main/java/org/jfree/chart/util/ObjectList.java +++ b/src/main/java/org/jfree/chart/util/ObjectList.java @@ -29,10 +29,8 @@ package org.jfree.chart.util; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * A list of objects that can grow as required. * <p> diff --git a/src/main/java/org/jfree/chart/util/PaintList.java b/src/main/java/org/jfree/chart/util/PaintList.java index a039b8147..736f932d4 100644 --- a/src/main/java/org/jfree/chart/util/PaintList.java +++ b/src/main/java/org/jfree/chart/util/PaintList.java @@ -31,7 +31,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Paint; import java.io.IOException; import java.io.ObjectInputStream; diff --git a/src/main/java/org/jfree/chart/util/StrokeList.java b/src/main/java/org/jfree/chart/util/StrokeList.java index 7fa9170c7..b8c152a20 100644 --- a/src/main/java/org/jfree/chart/util/StrokeList.java +++ b/src/main/java/org/jfree/chart/util/StrokeList.java @@ -31,7 +31,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.awt.Stroke; import java.io.IOException; import java.io.ObjectInputStream; diff --git a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java index 951680b44..3e1de2440 100644 --- a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java @@ -49,7 +49,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - /** * A category dataset that defines a value range for each series/category * combination. diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index 8a72f87f8..a271a351b 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -42,10 +42,8 @@ import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.util.Collections; import java.util.List; import org.jfree.chart.util.PublicCloneable; diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index bb84ab801..81dd2a866 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -53,10 +53,8 @@ import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.Iterator; import java.util.List; diff --git a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java index 22b868fe4..578992661 100644 --- a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java +++ b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java @@ -42,10 +42,8 @@ package org.jfree.data.gantt; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.util.Date; import org.jfree.chart.axis.SymbolAxis; diff --git a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java index 262a08874..56e8fa48d 100644 --- a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java +++ b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java @@ -45,10 +45,8 @@ package org.jfree.data.general; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; /** diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 6d876fe0e..8845904de 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -132,10 +132,8 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.util.ArrayList; import java.util.Iterator; import java.util.List; diff --git a/src/main/java/org/jfree/data/general/SeriesDataset.java b/src/main/java/org/jfree/data/general/SeriesDataset.java index 9b0a867e3..8f8586a5e 100644 --- a/src/main/java/org/jfree/data/general/SeriesDataset.java +++ b/src/main/java/org/jfree/data/general/SeriesDataset.java @@ -44,10 +44,8 @@ package org.jfree.data.general; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.category.CategoryDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.IntervalXYZDataset; diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java index 3d2283f71..52427ad97 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java @@ -53,10 +53,8 @@ package org.jfree.data.statistics; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.util.List; import org.jfree.data.xy.XYDataset; diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index 6453633fd..f60701696 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -61,10 +61,8 @@ package org.jfree.data.statistics; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.util.ArrayList; import java.util.Date; import java.util.List; diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index cee3936b1..841a961ae 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -65,10 +65,8 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index 1717e053e..f207fd7dc 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -49,10 +49,8 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.chart.util.Args; import org.jfree.data.xy.XYDataset; diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index 22198b996..f87dd9fe4 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -44,10 +44,8 @@ package org.jfree.data.statistics; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 3d26868d8..f06aae2d2 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -65,10 +65,8 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.util.Calendar; import java.util.TimeZone; diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index dbe3918f1..da1985ac0 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -65,7 +65,6 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import java.io.Serializable; import java.util.Calendar; import java.util.Date; diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index 3017434b5..5a27e5591 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -55,7 +55,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.Iterator; import java.util.List; diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index 7f3b904d3..1c2159fa9 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -91,10 +91,8 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index 8c8904138..b12057320 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -62,7 +62,6 @@ import org.checkerframework.checker.index.qual.NonNegative; - import java.util.Calendar; import java.util.List; import java.util.Locale; diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index 43ba20563..0d3b92c04 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -45,10 +45,8 @@ package org.jfree.data.time.ohlc; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.List; diff --git a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java index 18a547c10..464c5cb44 100644 --- a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java @@ -44,10 +44,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * An base class that you can use to create new implementations of the * {@link IntervalXYDataset} interface. diff --git a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java index 6ae6094cc..3b4e69fbc 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java @@ -44,10 +44,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.DomainOrder; import org.jfree.data.general.AbstractSeriesDataset; diff --git a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java index 752f54eee..c4e2796c5 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java @@ -42,10 +42,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * An base class that you can use to create new implementations of the * {@link XYZDataset} interface. diff --git a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java index 6dcd316ff..80b578918 100644 --- a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java @@ -50,10 +50,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.chart.util.PublicCloneable; import org.jfree.data.DefaultKeyedValues2D; import org.jfree.data.DomainInfo; diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index 73465ddc6..bace41a5e 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -46,10 +46,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.util.Arrays; import java.util.Date; import org.jfree.chart.util.PublicCloneable; diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index ae8f7fd7c..f1e66f621 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -64,10 +64,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index 668429ce6..f008083f2 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -48,7 +48,6 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.common.value.qual.ArrayLen; diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index 25a3a29a4..363ef4256 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -44,7 +44,6 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.common.value.qual.ArrayLen; diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java index 44cfd7a86..45f8ffeaf 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java @@ -44,10 +44,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * An extension of the {@link XYDataset} interface that allows an x-interval * and a y-interval to be defined. Note that the x and y values defined diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java index 806a1dbd6..f4156a998 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java @@ -54,10 +54,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import org.jfree.chart.HashUtils; diff --git a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java index 55f4f3f6c..0c53b43be 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java @@ -41,10 +41,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * An extension of the {@link XYZDataset} interface that allows a range of data * to be defined for any of the X values, the Y values, and the Z values. diff --git a/src/main/java/org/jfree/data/xy/OHLCDataset.java b/src/main/java/org/jfree/data/xy/OHLCDataset.java index 6093a83ad..3e75973a7 100644 --- a/src/main/java/org/jfree/data/xy/OHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/OHLCDataset.java @@ -49,10 +49,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * An interface that defines data in the form of (x, high, low, open, close) * tuples. diff --git a/src/main/java/org/jfree/data/xy/TableXYDataset.java b/src/main/java/org/jfree/data/xy/TableXYDataset.java index 938a594c6..4d8cffb98 100644 --- a/src/main/java/org/jfree/data/xy/TableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/TableXYDataset.java @@ -43,7 +43,6 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - /** * A dataset containing one or more data series containing (x, y) data items, * where all series in the dataset share the same set of x-values. This is a diff --git a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java index 9a5e9de92..f2b539277 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java @@ -46,10 +46,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.List; import org.jfree.chart.util.ObjectUtils; diff --git a/src/main/java/org/jfree/data/xy/VectorXYDataset.java b/src/main/java/org/jfree/data/xy/VectorXYDataset.java index 13d7112b7..a32cb4391 100644 --- a/src/main/java/org/jfree/data/xy/VectorXYDataset.java +++ b/src/main/java/org/jfree/data/xy/VectorXYDataset.java @@ -47,7 +47,6 @@ import org.checkerframework.checker.index.qual.*; - /** * An extension of the {@link XYDataset} interface that allows a vector to be * defined at a specific (x, y) location. diff --git a/src/main/java/org/jfree/data/xy/WindDataset.java b/src/main/java/org/jfree/data/xy/WindDataset.java index 0b620bccf..7f7cd2462 100644 --- a/src/main/java/org/jfree/data/xy/WindDataset.java +++ b/src/main/java/org/jfree/data/xy/WindDataset.java @@ -42,10 +42,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * Interface for a dataset that supplies wind intensity and direction values * observed at various points in time. diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java index f293e1469..cca2eb1df 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java @@ -45,10 +45,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.List; import org.jfree.chart.util.ObjectUtils; diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index e8164472b..0de7266ac 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -50,10 +50,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.chart.util.PublicCloneable; import org.jfree.data.general.DatasetChangeEvent; import org.jfree.data.general.DatasetChangeListener; diff --git a/src/main/java/org/jfree/data/xy/XYDataset.java b/src/main/java/org/jfree/data/xy/XYDataset.java index 9cf815f02..2d5b1118d 100644 --- a/src/main/java/org/jfree/data/xy/XYDataset.java +++ b/src/main/java/org/jfree/data/xy/XYDataset.java @@ -48,10 +48,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import org.jfree.data.DomainOrder; import org.jfree.data.general.SeriesDataset; diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java index e03ea7755..4f627ece4 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java @@ -47,10 +47,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.List; import org.jfree.chart.util.ObjectUtils; diff --git a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java index 795c00070..d0d4ccfb2 100644 --- a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java @@ -66,10 +66,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.beans.PropertyChangeEvent; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; diff --git a/src/main/java/org/jfree/data/xy/XYZDataset.java b/src/main/java/org/jfree/data/xy/XYZDataset.java index 6ae12373b..f73851d56 100644 --- a/src/main/java/org/jfree/data/xy/XYZDataset.java +++ b/src/main/java/org/jfree/data/xy/XYZDataset.java @@ -44,10 +44,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * The interface through which JFreeChart obtains data in the form of (x, y, z) * items - used for XY and XYZ plots. diff --git a/src/main/java/org/jfree/data/xy/XisSymbolic.java b/src/main/java/org/jfree/data/xy/XisSymbolic.java index 50895de79..f7a648c9b 100644 --- a/src/main/java/org/jfree/data/xy/XisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/XisSymbolic.java @@ -43,10 +43,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - /** * Represent a data set where X is a symbolic values. Each symbolic value is * linked with an Integer. diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java index 9611f7fc5..bfcf72d0d 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java @@ -47,10 +47,8 @@ package org.jfree.data.xy; import org.checkerframework.checker.index.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; - import java.io.Serializable; import java.util.List; import org.jfree.chart.util.ObjectUtils; diff --git a/src/main/java/org/jfree/data/xy/YisSymbolic.java b/src/main/java/org/jfree/data/xy/YisSymbolic.java index b30a2da73..7b61ce059 100644 --- a/src/main/java/org/jfree/data/xy/YisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/YisSymbolic.java @@ -46,7 +46,6 @@ import org.checkerframework.checker.index.qual.*; - /** * Represent a data set where Y is a symbolic values. Each symbolic value is * linked with an Integer. From 3bf0c0ad78d4902a0348e0a564674a166a9e420f Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Fri, 4 May 2018 12:40:19 -0700 Subject: [PATCH 67/79] more whitespace fixes --- src/main/java/org/jfree/chart/ChartColor.java | 1 + src/main/java/org/jfree/chart/JFreeChart.java | 1 + src/main/java/org/jfree/chart/LegendItem.java | 1 - src/main/java/org/jfree/chart/LegendItemCollection.java | 1 + src/main/java/org/jfree/chart/PolarChartPanel.java | 1 + .../java/org/jfree/chart/annotations/AbstractXYAnnotation.java | 1 + src/main/java/org/jfree/chart/annotations/XYAnnotation.java | 1 + src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java | 1 + .../java/org/jfree/chart/annotations/XYDataImageAnnotation.java | 1 + .../java/org/jfree/chart/annotations/XYDrawableAnnotation.java | 1 + .../java/org/jfree/chart/annotations/XYImageAnnotation.java | 1 + src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java | 1 + .../java/org/jfree/chart/annotations/XYPointerAnnotation.java | 1 + .../java/org/jfree/chart/annotations/XYPolygonAnnotation.java | 1 + .../java/org/jfree/chart/annotations/XYShapeAnnotation.java | 1 + src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java | 1 + .../java/org/jfree/chart/annotations/XYTitleAnnotation.java | 1 + src/main/java/org/jfree/chart/axis/CompassFormat.java | 1 - src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java | 1 - src/main/java/org/jfree/chart/axis/DateTickUnit.java | 1 + src/main/java/org/jfree/chart/axis/DateTickUnitType.java | 1 + src/main/java/org/jfree/chart/axis/MonthDateFormat.java | 1 - src/main/java/org/jfree/chart/axis/PeriodAxis.java | 1 - src/main/java/org/jfree/chart/axis/QuarterDateFormat.java | 1 - src/main/java/org/jfree/chart/axis/TickUnits.java | 1 + src/main/java/org/jfree/chart/axis/ValueAxis.java | 1 + src/main/java/org/jfree/chart/block/ColumnArrangement.java | 2 -- src/main/java/org/jfree/chart/block/FlowArrangement.java | 2 -- src/main/java/org/jfree/chart/block/GridArrangement.java | 1 + src/main/java/org/jfree/chart/date/SerialDate.java | 1 - src/main/java/org/jfree/chart/date/SpreadsheetDate.java | 1 - src/main/java/org/jfree/chart/entity/EntityCollection.java | 1 + src/main/java/org/jfree/chart/entity/PieSectionEntity.java | 1 + .../java/org/jfree/chart/entity/StandardEntityCollection.java | 1 + src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java | 1 + src/main/java/org/jfree/chart/entity/XYItemEntity.java | 1 - .../jfree/chart/labels/AbstractCategoryItemLabelGenerator.java | 1 + .../org/jfree/chart/labels/AbstractPieItemLabelGenerator.java | 1 + .../org/jfree/chart/labels/AbstractXYItemLabelGenerator.java | 1 + .../org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java | 1 + .../org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java | 1 + .../java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java | 1 + .../java/org/jfree/chart/labels/CategoryItemLabelGenerator.java | 1 + .../org/jfree/chart/labels/CategorySeriesLabelGenerator.java | 1 - .../java/org/jfree/chart/labels/CategoryToolTipGenerator.java | 1 + .../java/org/jfree/chart/labels/CustomXYToolTipGenerator.java | 1 - .../java/org/jfree/chart/labels/HighLowItemLabelGenerator.java | 1 + .../jfree/chart/labels/IntervalCategoryItemLabelGenerator.java | 1 + .../jfree/chart/labels/IntervalCategoryToolTipGenerator.java | 1 + .../org/jfree/chart/labels/IntervalXYItemLabelGenerator.java | 1 + .../java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java | 1 + .../org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java | 1 + .../jfree/chart/labels/StandardCategoryItemLabelGenerator.java | 1 + .../chart/labels/StandardCategorySeriesLabelGenerator.java | 1 + .../jfree/chart/labels/StandardCategoryToolTipGenerator.java | 1 + .../org/jfree/chart/labels/StandardXYItemLabelGenerator.java | 1 + .../org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java | 1 + .../java/org/jfree/chart/labels/StandardXYToolTipGenerator.java | 1 + .../org/jfree/chart/labels/StandardXYZToolTipGenerator.java | 1 + .../org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java | 1 + src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java | 1 + .../java/org/jfree/chart/labels/XYSeriesLabelGenerator.java | 1 - src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java | 2 +- src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java | 1 + .../java/org/jfree/chart/plot/AbstractPieLabelDistributor.java | 1 + src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java | 1 + src/main/java/org/jfree/chart/plot/CategoryPlot.java | 1 + src/main/java/org/jfree/chart/plot/CompassPlot.java | 2 -- src/main/java/org/jfree/chart/plot/CrosshairState.java | 1 + src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java | 2 -- src/main/java/org/jfree/chart/plot/FastScatterPlot.java | 2 -- src/main/java/org/jfree/chart/plot/PiePlot.java | 1 + src/main/java/org/jfree/chart/plot/Plot.java | 1 - src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java | 1 + src/main/java/org/jfree/chart/plot/PolarPlot.java | 1 + src/main/java/org/jfree/chart/plot/RingPlot.java | 1 + src/main/java/org/jfree/chart/plot/SpiderWebPlot.java | 1 - src/main/java/org/jfree/chart/plot/ThermometerPlot.java | 2 -- src/main/java/org/jfree/chart/plot/XYPlot.java | 1 + src/main/java/org/jfree/chart/plot/dial/DialPlot.java | 1 + src/main/java/org/jfree/chart/plot/dial/DialPointer.java | 1 + src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java | 1 + src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java | 1 + src/main/java/org/jfree/chart/renderer/AbstractRenderer.java | 1 - .../java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/OutlierList.java | 1 + src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java | 1 - src/main/java/org/jfree/chart/renderer/RendererUtils.java | 1 - src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java | 1 + .../chart/renderer/category/AbstractCategoryItemRenderer.java | 1 - .../java/org/jfree/chart/renderer/category/AreaRenderer.java | 1 - src/main/java/org/jfree/chart/renderer/category/BarPainter.java | 1 + .../java/org/jfree/chart/renderer/category/BarRenderer.java | 1 + .../jfree/chart/renderer/category/BoxAndWhiskerRenderer.java | 1 - .../org/jfree/chart/renderer/category/CategoryItemRenderer.java | 1 - .../chart/renderer/category/CategoryItemRendererState.java | 1 + .../org/jfree/chart/renderer/category/CategoryStepRenderer.java | 1 - .../java/org/jfree/chart/renderer/category/GanttRenderer.java | 1 + .../org/jfree/chart/renderer/category/GradientBarPainter.java | 1 + .../chart/renderer/category/GroupedStackedBarRenderer.java | 1 + .../org/jfree/chart/renderer/category/IntervalBarRenderer.java | 1 + .../org/jfree/chart/renderer/category/LayeredBarRenderer.java | 1 - .../java/org/jfree/chart/renderer/category/LevelRenderer.java | 1 - .../org/jfree/chart/renderer/category/LineAndShapeRenderer.java | 1 - .../jfree/chart/renderer/category/MinMaxCategoryRenderer.java | 1 + .../java/org/jfree/chart/renderer/category/ScatterRenderer.java | 1 - .../org/jfree/chart/renderer/category/StackedAreaRenderer.java | 1 + .../org/jfree/chart/renderer/category/StackedBarRenderer.java | 1 + .../org/jfree/chart/renderer/category/StandardBarPainter.java | 1 + .../jfree/chart/renderer/category/StatisticalBarRenderer.java | 1 + .../renderer/category/StatisticalLineAndShapeRenderer.java | 1 + .../org/jfree/chart/renderer/category/WaterfallBarRenderer.java | 1 + .../org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/CandlestickRenderer.java | 1 + .../org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/DeviationRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java | 1 + src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java | 1 + .../org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java | 1 + .../org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java | 1 + .../java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java | 1 + .../org/jfree/chart/renderer/xy/StandardXYItemRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java | 1 + .../org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java | 1 - src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/XYItemRendererState.java | 1 + .../org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java | 1 + src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java | 1 + .../java/org/jfree/chart/renderer/xy/YIntervalRenderer.java | 1 + src/main/java/org/jfree/chart/text/G2TextMeasurer.java | 1 + src/main/java/org/jfree/chart/text/TextBlock.java | 1 - src/main/java/org/jfree/chart/text/TextMeasurer.java | 1 + src/main/java/org/jfree/chart/text/TextUtils.java | 1 + .../java/org/jfree/chart/title/LegendItemBlockContainer.java | 1 - src/main/java/org/jfree/chart/ui/LCBLayout.java | 1 + src/main/java/org/jfree/chart/ui/NumberCellRenderer.java | 1 + src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java | 1 - .../java/org/jfree/chart/urls/CustomCategoryURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java | 1 + src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/PieURLGenerator.java | 1 + .../java/org/jfree/chart/urls/StandardCategoryURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java | 1 - src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java | 1 + src/main/java/org/jfree/chart/urls/XYURLGenerator.java | 1 + src/main/java/org/jfree/chart/urls/XYZURLGenerator.java | 1 - src/main/java/org/jfree/chart/util/AbstractObjectList.java | 2 -- src/main/java/org/jfree/chart/util/AttrStringUtils.java | 1 + src/main/java/org/jfree/chart/util/BooleanList.java | 1 + src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java | 1 + src/main/java/org/jfree/chart/util/ObjectList.java | 1 + src/main/java/org/jfree/chart/util/PaintList.java | 1 - src/main/java/org/jfree/chart/util/ShapeList.java | 1 + src/main/java/org/jfree/chart/util/StrokeList.java | 1 - src/main/java/org/jfree/data/ComparableObjectSeries.java | 1 + src/main/java/org/jfree/data/DataUtils.java | 1 + src/main/java/org/jfree/data/DefaultKeyedValues.java | 1 + src/main/java/org/jfree/data/DefaultKeyedValues2D.java | 1 + src/main/java/org/jfree/data/KeyToGroupMap.java | 1 + src/main/java/org/jfree/data/KeyedObjects.java | 1 + src/main/java/org/jfree/data/KeyedObjects2D.java | 1 + src/main/java/org/jfree/data/KeyedValues.java | 1 + src/main/java/org/jfree/data/KeyedValues2D.java | 1 + src/main/java/org/jfree/data/Values.java | 1 + src/main/java/org/jfree/data/Values2D.java | 1 + src/main/java/org/jfree/data/category/CategoryToPieDataset.java | 1 + .../java/org/jfree/data/category/DefaultCategoryDataset.java | 1 + .../org/jfree/data/category/DefaultIntervalCategoryDataset.java | 1 + .../java/org/jfree/data/category/IntervalCategoryDataset.java | 1 - .../java/org/jfree/data/category/SlidingCategoryDataset.java | 1 + src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java | 1 + .../java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java | 1 + src/main/java/org/jfree/data/gantt/Task.java | 1 + src/main/java/org/jfree/data/gantt/TaskSeries.java | 1 + src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java | 1 + src/main/java/org/jfree/data/gantt/XYTaskDataset.java | 1 + src/main/java/org/jfree/data/general/AbstractSeriesDataset.java | 1 + src/main/java/org/jfree/data/general/DatasetUtils.java | 1 + src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java | 1 + src/main/java/org/jfree/data/general/DefaultPieDataset.java | 1 + src/main/java/org/jfree/data/general/HeatMapDataset.java | 1 + src/main/java/org/jfree/data/general/HeatMapUtils.java | 1 + src/main/java/org/jfree/data/general/Series.java | 1 + src/main/java/org/jfree/data/general/SeriesDataset.java | 1 + src/main/java/org/jfree/data/general/WaferMapDataset.java | 1 + src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java | 1 + src/main/java/org/jfree/data/json/impl/JSONObject.java | 1 - src/main/java/org/jfree/data/json/impl/JSONStreamAware.java | 1 - .../org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java | 1 + .../java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java | 1 + .../data/statistics/DefaultBoxAndWhiskerCategoryDataset.java | 1 + .../jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java | 1 + .../jfree/data/statistics/DefaultMultiValueCategoryDataset.java | 1 + .../data/statistics/DefaultStatisticalCategoryDataset.java | 1 + src/main/java/org/jfree/data/statistics/HistogramBin.java | 1 + src/main/java/org/jfree/data/statistics/HistogramDataset.java | 1 + .../org/jfree/data/statistics/MultiValueCategoryDataset.java | 1 + src/main/java/org/jfree/data/statistics/Regression.java | 1 + src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java | 1 + .../java/org/jfree/data/statistics/SimpleHistogramDataset.java | 1 + .../org/jfree/data/statistics/StatisticalCategoryDataset.java | 1 + src/main/java/org/jfree/data/statistics/Statistics.java | 1 + src/main/java/org/jfree/data/time/Day.java | 1 + .../java/org/jfree/data/time/DynamicTimeSeriesCollection.java | 1 + src/main/java/org/jfree/data/time/Hour.java | 1 + src/main/java/org/jfree/data/time/Millisecond.java | 1 + src/main/java/org/jfree/data/time/Minute.java | 1 + src/main/java/org/jfree/data/time/Month.java | 1 + src/main/java/org/jfree/data/time/MovingAverage.java | 1 + src/main/java/org/jfree/data/time/Quarter.java | 1 - src/main/java/org/jfree/data/time/RegularTimePeriod.java | 1 + src/main/java/org/jfree/data/time/Second.java | 1 + src/main/java/org/jfree/data/time/SimpleTimePeriod.java | 1 + src/main/java/org/jfree/data/time/TimePeriod.java | 1 + src/main/java/org/jfree/data/time/TimePeriodValue.java | 1 + src/main/java/org/jfree/data/time/TimePeriodValues.java | 1 + .../java/org/jfree/data/time/TimePeriodValuesCollection.java | 1 + src/main/java/org/jfree/data/time/TimeSeries.java | 1 + src/main/java/org/jfree/data/time/TimeSeriesCollection.java | 1 + src/main/java/org/jfree/data/time/TimeSeriesTableModel.java | 1 + src/main/java/org/jfree/data/time/TimeTableXYDataset.java | 1 + src/main/java/org/jfree/data/time/Week.java | 1 + src/main/java/org/jfree/data/time/Year.java | 1 + src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java | 1 + .../java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java | 1 + src/main/java/org/jfree/data/xml/KeyHandler.java | 1 + src/main/java/org/jfree/data/xml/RootHandler.java | 1 + src/main/java/org/jfree/data/xml/ValueHandler.java | 1 + src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java | 1 + src/main/java/org/jfree/data/xy/AbstractXYDataset.java | 1 + src/main/java/org/jfree/data/xy/AbstractXYZDataset.java | 1 + src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java | 1 + src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java | 1 + src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java | 1 + src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java | 1 + src/main/java/org/jfree/data/xy/DefaultWindDataset.java | 1 + src/main/java/org/jfree/data/xy/DefaultXYDataset.java | 1 + src/main/java/org/jfree/data/xy/DefaultXYZDataset.java | 1 + src/main/java/org/jfree/data/xy/IntervalXYDataset.java | 1 + src/main/java/org/jfree/data/xy/IntervalXYDelegate.java | 1 + src/main/java/org/jfree/data/xy/IntervalXYZDataset.java | 1 + src/main/java/org/jfree/data/xy/MatrixSeries.java | 1 + src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java | 1 + src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java | 1 + src/main/java/org/jfree/data/xy/OHLCDataset.java | 1 + src/main/java/org/jfree/data/xy/TableXYDataset.java | 1 + src/main/java/org/jfree/data/xy/VectorSeries.java | 1 + src/main/java/org/jfree/data/xy/VectorSeriesCollection.java | 1 + src/main/java/org/jfree/data/xy/VectorXYDataset.java | 1 - src/main/java/org/jfree/data/xy/WindDataset.java | 1 + src/main/java/org/jfree/data/xy/XIntervalSeries.java | 1 + src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java | 1 + src/main/java/org/jfree/data/xy/XYBarDataset.java | 1 + src/main/java/org/jfree/data/xy/XYDataset.java | 1 + src/main/java/org/jfree/data/xy/XYDatasetTableModel.java | 1 + src/main/java/org/jfree/data/xy/XYIntervalSeries.java | 1 + src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java | 1 + src/main/java/org/jfree/data/xy/XYItemKey.java | 1 + src/main/java/org/jfree/data/xy/XYSeries.java | 1 + src/main/java/org/jfree/data/xy/XYSeriesCollection.java | 1 + src/main/java/org/jfree/data/xy/XYZDataset.java | 1 + src/main/java/org/jfree/data/xy/XisSymbolic.java | 1 + src/main/java/org/jfree/data/xy/YIntervalSeries.java | 1 + src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java | 1 + src/main/java/org/jfree/data/xy/YisSymbolic.java | 1 - .../data/statistics/DefaultStatisticalCategoryDatasetTest.java | 1 + 283 files changed, 232 insertions(+), 59 deletions(-) diff --git a/src/main/java/org/jfree/chart/ChartColor.java b/src/main/java/org/jfree/chart/ChartColor.java index cc9bb1c31..7b903d106 100644 --- a/src/main/java/org/jfree/chart/ChartColor.java +++ b/src/main/java/org/jfree/chart/ChartColor.java @@ -44,6 +44,7 @@ */ package org.jfree.chart; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/chart/JFreeChart.java b/src/main/java/org/jfree/chart/JFreeChart.java index adc36ef86..1b39d0877 100644 --- a/src/main/java/org/jfree/chart/JFreeChart.java +++ b/src/main/java/org/jfree/chart/JFreeChart.java @@ -154,6 +154,7 @@ */ package org.jfree.chart; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.AlphaComposite; diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index b41d6ac75..fbbe37e3d 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -64,7 +64,6 @@ package org.jfree.chart; - import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/LegendItemCollection.java b/src/main/java/org/jfree/chart/LegendItemCollection.java index 55ee05c32..44215c266 100644 --- a/src/main/java/org/jfree/chart/LegendItemCollection.java +++ b/src/main/java/org/jfree/chart/LegendItemCollection.java @@ -44,6 +44,7 @@ */ package org.jfree.chart; + import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/PolarChartPanel.java b/src/main/java/org/jfree/chart/PolarChartPanel.java index c4e384500..ee331d6dd 100644 --- a/src/main/java/org/jfree/chart/PolarChartPanel.java +++ b/src/main/java/org/jfree/chart/PolarChartPanel.java @@ -43,6 +43,7 @@ */ package org.jfree.chart; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java b/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java index b6e56a3b1..d7027f99b 100644 --- a/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/AbstractXYAnnotation.java @@ -42,6 +42,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/annotations/XYAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYAnnotation.java index f22891845..ac023d4a8 100644 --- a/src/main/java/org/jfree/chart/annotations/XYAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYAnnotation.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java index db1e26bc7..4d5d1eb3a 100644 --- a/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYBoxAnnotation.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java index 2af2dbe9d..ea55064c3 100644 --- a/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYDataImageAnnotation.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java index 8df7069bc..171978355 100644 --- a/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYDrawableAnnotation.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java index 3f787b623..93274ce8a 100644 --- a/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYImageAnnotation.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java index 1adbb2ae5..a3b949ede 100644 --- a/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYLineAnnotation.java @@ -50,6 +50,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java index 8f19614d1..d80b57f31 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPointerAnnotation.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java index 552f46799..2d9274d7f 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java index c4b27dc86..6ee39edf9 100644 --- a/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYShapeAnnotation.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java index b4dd030b5..55d1da00c 100644 --- a/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYTextAnnotation.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java index a19d0413e..aee8687b1 100644 --- a/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYTitleAnnotation.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.annotations; + import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/axis/CompassFormat.java b/src/main/java/org/jfree/chart/axis/CompassFormat.java index c0990a3aa..71b0146bb 100644 --- a/src/main/java/org/jfree/chart/axis/CompassFormat.java +++ b/src/main/java/org/jfree/chart/axis/CompassFormat.java @@ -42,7 +42,6 @@ package org.jfree.chart.axis; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; diff --git a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java index 3461d69e1..b04bac18d 100644 --- a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java +++ b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java @@ -50,7 +50,6 @@ package org.jfree.chart.axis; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/axis/DateTickUnit.java b/src/main/java/org/jfree/chart/axis/DateTickUnit.java index ee1960a7e..f4c254890 100644 --- a/src/main/java/org/jfree/chart/axis/DateTickUnit.java +++ b/src/main/java/org/jfree/chart/axis/DateTickUnit.java @@ -55,6 +55,7 @@ */ package org.jfree.chart.axis; + import org.checkerframework.checker.index.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/axis/DateTickUnitType.java b/src/main/java/org/jfree/chart/axis/DateTickUnitType.java index f4f422350..000b3e5b2 100644 --- a/src/main/java/org/jfree/chart/axis/DateTickUnitType.java +++ b/src/main/java/org/jfree/chart/axis/DateTickUnitType.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.axis; + import org.checkerframework.checker.index.qual.*; import java.io.ObjectStreamException; diff --git a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java index fe466184f..747d994e3 100644 --- a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java @@ -41,7 +41,6 @@ package org.jfree.chart.axis; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; diff --git a/src/main/java/org/jfree/chart/axis/PeriodAxis.java b/src/main/java/org/jfree/chart/axis/PeriodAxis.java index 265c552bd..1cc6ad8fb 100644 --- a/src/main/java/org/jfree/chart/axis/PeriodAxis.java +++ b/src/main/java/org/jfree/chart/axis/PeriodAxis.java @@ -65,7 +65,6 @@ package org.jfree.chart.axis; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntVal; diff --git a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java index 3282d66f6..e1720ef37 100644 --- a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java @@ -46,7 +46,6 @@ package org.jfree.chart.axis; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; diff --git a/src/main/java/org/jfree/chart/axis/TickUnits.java b/src/main/java/org/jfree/chart/axis/TickUnits.java index 69a970539..e04475dcb 100644 --- a/src/main/java/org/jfree/chart/axis/TickUnits.java +++ b/src/main/java/org/jfree/chart/axis/TickUnits.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.axis; + import org.checkerframework.checker.index.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/axis/ValueAxis.java b/src/main/java/org/jfree/chart/axis/ValueAxis.java index 5ab8fd62f..500c7851f 100644 --- a/src/main/java/org/jfree/chart/axis/ValueAxis.java +++ b/src/main/java/org/jfree/chart/axis/ValueAxis.java @@ -113,6 +113,7 @@ */ package org.jfree.chart.axis; + import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.common.value.qual.ArrayLen; diff --git a/src/main/java/org/jfree/chart/block/ColumnArrangement.java b/src/main/java/org/jfree/chart/block/ColumnArrangement.java index 3e899ff8e..cc3d6b40d 100644 --- a/src/main/java/org/jfree/chart/block/ColumnArrangement.java +++ b/src/main/java/org/jfree/chart/block/ColumnArrangement.java @@ -41,10 +41,8 @@ package org.jfree.chart.block; - import org.checkerframework.checker.index.qual.SameLen; - import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/block/FlowArrangement.java b/src/main/java/org/jfree/chart/block/FlowArrangement.java index c07f3dd91..de5a10355 100644 --- a/src/main/java/org/jfree/chart/block/FlowArrangement.java +++ b/src/main/java/org/jfree/chart/block/FlowArrangement.java @@ -42,10 +42,8 @@ package org.jfree.chart.block; - import org.checkerframework.checker.index.qual.SameLen; - import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/block/GridArrangement.java b/src/main/java/org/jfree/chart/block/GridArrangement.java index 6e357eaf9..50757800d 100644 --- a/src/main/java/org/jfree/chart/block/GridArrangement.java +++ b/src/main/java/org/jfree/chart/block/GridArrangement.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.block; + import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index 8412fd27f..c4f0d2808 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -28,7 +28,6 @@ package org.jfree.chart.date; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; import org.checkerframework.common.value.qual.IntVal; diff --git a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java index 46a436f03..f315e8cd8 100644 --- a/src/main/java/org/jfree/chart/date/SpreadsheetDate.java +++ b/src/main/java/org/jfree/chart/date/SpreadsheetDate.java @@ -28,7 +28,6 @@ package org.jfree.chart.date; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/entity/EntityCollection.java b/src/main/java/org/jfree/chart/entity/EntityCollection.java index 1febb4e11..45188fff3 100644 --- a/src/main/java/org/jfree/chart/entity/EntityCollection.java +++ b/src/main/java/org/jfree/chart/entity/EntityCollection.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.entity; + import org.checkerframework.checker.index.qual.NonNegative; import java.util.Collection; diff --git a/src/main/java/org/jfree/chart/entity/PieSectionEntity.java b/src/main/java/org/jfree/chart/entity/PieSectionEntity.java index ed8ac9202..f18263a8c 100644 --- a/src/main/java/org/jfree/chart/entity/PieSectionEntity.java +++ b/src/main/java/org/jfree/chart/entity/PieSectionEntity.java @@ -53,6 +53,7 @@ */ package org.jfree.chart.entity; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java b/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java index bd47a7367..6ce642866 100644 --- a/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java +++ b/src/main/java/org/jfree/chart/entity/StandardEntityCollection.java @@ -49,6 +49,7 @@ */ package org.jfree.chart.entity; + import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java b/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java index 05902c0cd..b05ef3233 100644 --- a/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYAnnotationEntity.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.entity; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/entity/XYItemEntity.java b/src/main/java/org/jfree/chart/entity/XYItemEntity.java index d007174f4..84cc62ead 100644 --- a/src/main/java/org/jfree/chart/entity/XYItemEntity.java +++ b/src/main/java/org/jfree/chart/entity/XYItemEntity.java @@ -50,7 +50,6 @@ package org.jfree.chart.entity; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java index b76caf80e..f6024f622 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractCategoryItemLabelGenerator.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java index 707ba2960..6a31fc5eb 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java @@ -44,6 +44,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java index 9c7294c38..39c0d9ac6 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.MinLen; diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java index bc0c94a02..722cb99c4 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.MinLen; diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 623875566..87c9d549e 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index c9f90e03e..eabaed500 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -44,6 +44,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java index b6e989b3f..dbbc8d49c 100644 --- a/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategoryItemLabelGenerator.java @@ -58,6 +58,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.CategoryDataset; diff --git a/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java index c4ac4b9ca..15b3429ee 100644 --- a/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategorySeriesLabelGenerator.java @@ -42,7 +42,6 @@ package org.jfree.chart.labels; - import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.CategoryDataset; diff --git a/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java index ed551fd0c..7ab4cf2c9 100644 --- a/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CategoryToolTipGenerator.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.CategoryDataset; diff --git a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java index 89d614996..1b64b8ee6 100644 --- a/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/CustomXYToolTipGenerator.java @@ -46,7 +46,6 @@ package org.jfree.chart.labels; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index da8f88e89..8d9bc1ad2 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -51,6 +51,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java index 96f7b98c1..4a67b0ab3 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryItemLabelGenerator.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java index ed30132a1..d89edcd29 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalCategoryToolTipGenerator.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index 7a51a14cd..678a9e0c1 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index 2644dbaed..9be339b48 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.MinLen; diff --git a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java index 4b47a7aef..b99ed519b 100644 --- a/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/MultipleXYSeriesLabelGenerator.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java index 1b3d601d8..c8f1ae9cf 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategoryItemLabelGenerator.java @@ -42,6 +42,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java index d70fd29a0..2db497224 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategorySeriesLabelGenerator.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java index d028a323b..41c36c1ca 100644 --- a/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardCategoryToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java index 22297190d..d4d8f529d 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYItemLabelGenerator.java @@ -59,6 +59,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java index 297098685..044160369 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYSeriesLabelGenerator.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java index 3478214ff..daa230526 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index af3a03252..9cf0653a9 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.MinLen; diff --git a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java index 5a2622a62..8304f70c3 100644 --- a/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/SymbolicXYItemLabelGenerator.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java index a94cfb4b8..8a93d252f 100644 --- a/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYItemLabelGenerator.java @@ -47,6 +47,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java b/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java index 2aaf0ebab..f32d8c8e7 100644 --- a/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYSeriesLabelGenerator.java @@ -42,7 +42,6 @@ package org.jfree.chart.labels; - import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.xy.XYDataset; diff --git a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java index 3c449ad0b..32816139d 100644 --- a/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYToolTipGenerator.java @@ -41,8 +41,8 @@ */ package org.jfree.chart.labels; -import org.checkerframework.checker.index.qual.*; +import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java index 1fd357018..8a13907d9 100644 --- a/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/XYZToolTipGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.labels; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java b/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java index 4d93ef475..67744ccd5 100644 --- a/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java +++ b/src/main/java/org/jfree/chart/plot/AbstractPieLabelDistributor.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java b/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java index 04ec08d6e..51576b3ba 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CategoryCrosshairState.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.*; import java.awt.geom.Point2D; diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index b53b48d4e..80eb3e740 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -186,6 +186,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/chart/plot/CompassPlot.java b/src/main/java/org/jfree/chart/plot/CompassPlot.java index 714f1ed93..6e5a22c95 100644 --- a/src/main/java/org/jfree/chart/plot/CompassPlot.java +++ b/src/main/java/org/jfree/chart/plot/CompassPlot.java @@ -67,14 +67,12 @@ package org.jfree.chart.plot; - import org.checkerframework.common.value.qual.MinLen; import org.checkerframework.checker.index.qual.SameLen; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.index.qual.LTLengthOf; import org.checkerframework.checker.index.qual.IndexFor; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/plot/CrosshairState.java b/src/main/java/org/jfree/chart/plot/CrosshairState.java index e5c6da030..71e84ca49 100644 --- a/src/main/java/org/jfree/chart/plot/CrosshairState.java +++ b/src/main/java/org/jfree/chart/plot/CrosshairState.java @@ -52,6 +52,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.geom.Point2D; diff --git a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java index 28e6920d5..c5ca29c1c 100644 --- a/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java +++ b/src/main/java/org/jfree/chart/plot/DefaultDrawingSupplier.java @@ -48,11 +48,9 @@ package org.jfree.chart.plot; - import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.index.qual.IndexFor; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java index 43d340154..e3e365c97 100644 --- a/src/main/java/org/jfree/chart/plot/FastScatterPlot.java +++ b/src/main/java/org/jfree/chart/plot/FastScatterPlot.java @@ -68,12 +68,10 @@ package org.jfree.chart.plot; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.checker.index.qual.SameLen; import org.checkerframework.checker.index.qual.PolySameLen; - import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/plot/PiePlot.java b/src/main/java/org/jfree/chart/plot/PiePlot.java index d2040928b..f0a2a44d2 100644 --- a/src/main/java/org/jfree/chart/plot/PiePlot.java +++ b/src/main/java/org/jfree/chart/plot/PiePlot.java @@ -174,6 +174,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.AlphaComposite; diff --git a/src/main/java/org/jfree/chart/plot/Plot.java b/src/main/java/org/jfree/chart/plot/Plot.java index 0687eca7f..e7587d3d4 100644 --- a/src/main/java/org/jfree/chart/plot/Plot.java +++ b/src/main/java/org/jfree/chart/plot/Plot.java @@ -135,7 +135,6 @@ package org.jfree.chart.plot; - import org.checkerframework.dataflow.qual.Pure; diff --git a/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java b/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java index 07d35c8a0..e6af0dfdd 100644 --- a/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java +++ b/src/main/java/org/jfree/chart/plot/PlotRenderingInfo.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index 834c72a6b..546ce2ef2 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -61,6 +61,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/plot/RingPlot.java b/src/main/java/org/jfree/chart/plot/RingPlot.java index 366fa6ee3..28d655f09 100644 --- a/src/main/java/org/jfree/chart/plot/RingPlot.java +++ b/src/main/java/org/jfree/chart/plot/RingPlot.java @@ -52,6 +52,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.*; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java index 2bc136aea..f3664fdf4 100644 --- a/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java +++ b/src/main/java/org/jfree/chart/plot/SpiderWebPlot.java @@ -71,7 +71,6 @@ package org.jfree.chart.plot; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.AlphaComposite; diff --git a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java index 282d23738..818c691b8 100644 --- a/src/main/java/org/jfree/chart/plot/ThermometerPlot.java +++ b/src/main/java/org/jfree/chart/plot/ThermometerPlot.java @@ -93,12 +93,10 @@ package org.jfree.chart.plot; - import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntVal; import org.checkerframework.checker.index.qual.IndexFor; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index c45ffa403..d428dd80b 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -234,6 +234,7 @@ */ package org.jfree.chart.plot; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java index 5e072db6c..f1a106b4f 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPlot.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPlot.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.plot.dial; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java index 3536beecd..306958c3f 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialPointer.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialPointer.java @@ -45,6 +45,7 @@ */ package org.jfree.chart.plot.dial; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java index 26a3cb3d9..eeb059e99 100644 --- a/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java +++ b/src/main/java/org/jfree/chart/plot/dial/DialValueIndicator.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.plot.dial; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java b/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java index 9bb64b4cc..766610dfd 100644 --- a/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java +++ b/src/main/java/org/jfree/chart/plot/dial/StandardDialRange.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.plot.dial; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java index e4ae310ee..1d6736bb9 100644 --- a/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/AbstractRenderer.java @@ -99,7 +99,6 @@ package org.jfree.chart.renderer; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java index 8209bf980..b35e367e1 100644 --- a/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/DefaultPolarItemRenderer.java @@ -62,6 +62,7 @@ */ package org.jfree.chart.renderer; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/OutlierList.java b/src/main/java/org/jfree/chart/renderer/OutlierList.java index 2402ced8f..78b1a7d27 100644 --- a/src/main/java/org/jfree/chart/renderer/OutlierList.java +++ b/src/main/java/org/jfree/chart/renderer/OutlierList.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.renderer; + import org.checkerframework.checker.index.qual.*; import java.awt.geom.Point2D; diff --git a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java index 72a8b14f2..f45cc788d 100644 --- a/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/PolarItemRenderer.java @@ -41,7 +41,6 @@ package org.jfree.chart.renderer; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/RendererUtils.java b/src/main/java/org/jfree/chart/renderer/RendererUtils.java index 747f748b5..c9eb43fa7 100644 --- a/src/main/java/org/jfree/chart/renderer/RendererUtils.java +++ b/src/main/java/org/jfree/chart/renderer/RendererUtils.java @@ -44,7 +44,6 @@ package org.jfree.chart.renderer; - import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java index b57db0c2d..997e863f9 100644 --- a/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/WaferMapRenderer.java @@ -43,6 +43,7 @@ */ package org.jfree.chart.renderer; + import org.checkerframework.checker.index.qual.*; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java index b79a83106..b309b345c 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AbstractCategoryItemRenderer.java @@ -111,7 +111,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.*; import java.awt.AlphaComposite; diff --git a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java index 6ad008f0b..14c5098c8 100644 --- a/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/AreaRenderer.java @@ -74,7 +74,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/BarPainter.java b/src/main/java/org/jfree/chart/renderer/category/BarPainter.java index 869126a0d..e42ec405f 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarPainter.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java index 27b178c82..ed4ebe04a 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java @@ -95,6 +95,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java index 2eee704de..c45c1ffef 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BoxAndWhiskerRenderer.java @@ -91,7 +91,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java index a5afd5d12..2f67593a8 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRenderer.java @@ -97,7 +97,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Font; diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java index 21f3a545d..24d13ee97 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java @@ -44,6 +44,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.*; import org.jfree.chart.plot.CategoryCrosshairState; diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java index 5487cfbb0..87af4469a 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryStepRenderer.java @@ -51,7 +51,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java index ee13e52be..914f86776 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GanttRenderer.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java b/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java index 98403c9af..ea486f36f 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/GradientBarPainter.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java index 49ef6d775..5199b74a0 100644 --- a/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/GroupedStackedBarRenderer.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java index 74d0336c5..4e2b52768 100644 --- a/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/IntervalBarRenderer.java @@ -68,6 +68,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java index fe9e21043..ff887c358 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LayeredBarRenderer.java @@ -54,7 +54,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.GradientPaint; diff --git a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java index ee588108b..b9c90e06d 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LevelRenderer.java @@ -51,7 +51,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java index 934dcc448..69da120de 100644 --- a/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/LineAndShapeRenderer.java @@ -94,7 +94,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java b/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java index 27ff88cd9..8fe8ab1f9 100644 --- a/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/MinMaxCategoryRenderer.java @@ -59,6 +59,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java index d5e421f68..7f490e359 100644 --- a/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/ScatterRenderer.java @@ -45,7 +45,6 @@ package org.jfree.chart.renderer.category; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java index 299d7c97d..07845967d 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedAreaRenderer.java @@ -67,6 +67,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java index 6abbb6c58..89676ba8c 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StackedBarRenderer.java @@ -93,6 +93,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java b/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java index 29b138235..d8e101286 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/category/StandardBarPainter.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java index 96b350460..1ffb342ba 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StatisticalBarRenderer.java @@ -63,6 +63,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java index 1ac098990..1510d3693 100644 --- a/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/StatisticalLineAndShapeRenderer.java @@ -57,6 +57,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java index 2136fc1e6..76f45d1d2 100644 --- a/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/WaterfallBarRenderer.java @@ -59,6 +59,7 @@ */ package org.jfree.chart.renderer.category; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java index 56b2c0a07..fa43fd1d6 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java @@ -128,6 +128,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java index cdc4f47e1..77f71ed4f 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java @@ -87,6 +87,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java index 87e633108..69fb25e27 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java @@ -65,6 +65,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.*; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 4ba5a7a11..cc33c97a6 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java index cf9a2f2a0..19b48488b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java @@ -44,6 +44,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java index 0ddecbb71..f5b68af0e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/GradientXYBarPainter.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java index 267aef799..aa1e2e6bb 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java @@ -67,6 +67,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java index 8895dc0b8..d7b47cce9 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/SamplingXYLineRenderer.java @@ -44,6 +44,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java index 7936281e8..582a4c8d7 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer.java @@ -70,6 +70,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java index 9fdf19141..660f4a4cd 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYAreaRenderer2.java @@ -56,6 +56,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java index 5e2de3a56..e41625502 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java index b27f108ae..18296bdbe 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYBarPainter.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Color; diff --git a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java index d885fc1cd..dda88e450 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StandardXYItemRenderer.java @@ -110,6 +110,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java index 4a2a305e9..9528f85aa 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java index 8e332b6c5..7b1ddbaef 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java @@ -56,6 +56,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java index bf1f99ff5..cd59ec3d7 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer.java @@ -87,6 +87,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java index 4a1960aa7..8c01863a3 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYAreaRenderer2.java @@ -85,6 +85,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java index 2ce0d0611..b9add7bb0 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarPainter.java @@ -39,6 +39,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index 71373dd6d..43e7f5cb6 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -105,6 +105,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 6e0cfb2df..b2fdc5639 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index caabca426..e014f217d 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -77,6 +77,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index cd7de0807..3ec519cef 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -63,6 +63,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index 67f578fbc..2b17f28ce 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -83,7 +83,6 @@ package org.jfree.chart.renderer.xy; - import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java index 44dcce634..ebc46afb7 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDotRenderer.java @@ -54,6 +54,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java index 709697d7c..7a065c27a 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java @@ -42,6 +42,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java index 994998dc0..e45920dc5 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRenderer.java @@ -85,6 +85,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java index 45931f603..04c2b5f48 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYItemRendererState.java @@ -47,6 +47,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java index 43bd0bbf4..c2b793435 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYLineAndShapeRenderer.java @@ -72,6 +72,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 26ffbdce0..5b6f89011 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java index 3f28c73e5..cf0f42b4d 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYSplineRenderer.java @@ -48,6 +48,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java index f20c4910c..a81fbde2e 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepAreaRenderer.java @@ -57,6 +57,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java index e26118d65..352e1567a 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYStepRenderer.java @@ -72,6 +72,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index d463398a9..96961d7b8 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -49,6 +49,7 @@ */ package org.jfree.chart.renderer.xy; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/text/G2TextMeasurer.java b/src/main/java/org/jfree/chart/text/G2TextMeasurer.java index 8c48f81a6..29392330e 100644 --- a/src/main/java/org/jfree/chart/text/G2TextMeasurer.java +++ b/src/main/java/org/jfree/chart/text/G2TextMeasurer.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.text; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/text/TextBlock.java b/src/main/java/org/jfree/chart/text/TextBlock.java index de58e93fe..ecfbb7b99 100644 --- a/src/main/java/org/jfree/chart/text/TextBlock.java +++ b/src/main/java/org/jfree/chart/text/TextBlock.java @@ -28,7 +28,6 @@ package org.jfree.chart.text; - import org.checkerframework.common.value.qual.ArrayLen; diff --git a/src/main/java/org/jfree/chart/text/TextMeasurer.java b/src/main/java/org/jfree/chart/text/TextMeasurer.java index 3554a00f0..109370bc3 100644 --- a/src/main/java/org/jfree/chart/text/TextMeasurer.java +++ b/src/main/java/org/jfree/chart/text/TextMeasurer.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.text; + import org.checkerframework.checker.index.qual.*; /** diff --git a/src/main/java/org/jfree/chart/text/TextUtils.java b/src/main/java/org/jfree/chart/text/TextUtils.java index 626d6306f..8135aa5d1 100644 --- a/src/main/java/org/jfree/chart/text/TextUtils.java +++ b/src/main/java/org/jfree/chart/text/TextUtils.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.text; + import org.checkerframework.common.value.qual.*; import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java index e349516a8..b188956c4 100644 --- a/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java +++ b/src/main/java/org/jfree/chart/title/LegendItemBlockContainer.java @@ -42,7 +42,6 @@ package org.jfree.chart.title; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/ui/LCBLayout.java b/src/main/java/org/jfree/chart/ui/LCBLayout.java index 5dc9b887c..bd1febfa2 100644 --- a/src/main/java/org/jfree/chart/ui/LCBLayout.java +++ b/src/main/java/org/jfree/chart/ui/LCBLayout.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.ui; + import org.checkerframework.common.value.qual.*; import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java index 9e58c16f6..192615250 100644 --- a/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java +++ b/src/main/java/org/jfree/chart/ui/NumberCellRenderer.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.ui; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Component; diff --git a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java index 1aac4b362..c798da87a 100644 --- a/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CategoryURLGenerator.java @@ -52,7 +52,6 @@ package org.jfree.chart.urls; - import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.CategoryDataset; diff --git a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java index 9b386509e..7f062d844 100644 --- a/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomCategoryURLGenerator.java @@ -41,7 +41,6 @@ */ package org.jfree.chart.urls; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java index 0f11cf0f0..829cdd560 100644 --- a/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomPieURLGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.urls; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java index 2f0b98762..02670e88f 100644 --- a/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/CustomXYURLGenerator.java @@ -47,7 +47,6 @@ package org.jfree.chart.urls; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/urls/PieURLGenerator.java b/src/main/java/org/jfree/chart/urls/PieURLGenerator.java index e55b86bb1..bfdb077ff 100644 --- a/src/main/java/org/jfree/chart/urls/PieURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/PieURLGenerator.java @@ -46,6 +46,7 @@ */ package org.jfree.chart.urls; + import org.checkerframework.checker.index.qual.*; import org.jfree.data.general.PieDataset; diff --git a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java index 2b132e4e2..d1d626d66 100644 --- a/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardCategoryURLGenerator.java @@ -55,7 +55,6 @@ package org.jfree.chart.urls; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java index e5fea59be..7f0b705e5 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYURLGenerator.java @@ -49,7 +49,6 @@ package org.jfree.chart.urls; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java index 126193ee2..de3271c40 100644 --- a/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/StandardXYZURLGenerator.java @@ -40,7 +40,6 @@ package org.jfree.chart.urls; - import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.xy.XYZDataset; diff --git a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java index b1acd7827..ba3cbf83c 100644 --- a/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/TimeSeriesURLGenerator.java @@ -50,6 +50,7 @@ */ package org.jfree.chart.urls; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java index ba1137873..5a8ab59da 100644 --- a/src/main/java/org/jfree/chart/urls/XYURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYURLGenerator.java @@ -44,6 +44,7 @@ */ package org.jfree.chart.urls; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java index 028870bc8..1cc2edd8e 100644 --- a/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java +++ b/src/main/java/org/jfree/chart/urls/XYZURLGenerator.java @@ -41,7 +41,6 @@ package org.jfree.chart.urls; - import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.xy.XYZDataset; diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index f90056179..b46572b90 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -28,7 +28,6 @@ package org.jfree.chart.util; - import org.checkerframework.common.value.qual.IntVal; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.index.qual.GTENegativeOne; @@ -36,7 +35,6 @@ import org.checkerframework.checker.index.qual.LTLengthOf; import org.checkerframework.checker.index.qual.IndexFor; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; diff --git a/src/main/java/org/jfree/chart/util/AttrStringUtils.java b/src/main/java/org/jfree/chart/util/AttrStringUtils.java index b9adc90a9..9ee555693 100644 --- a/src/main/java/org/jfree/chart/util/AttrStringUtils.java +++ b/src/main/java/org/jfree/chart/util/AttrStringUtils.java @@ -40,6 +40,7 @@ */ package org.jfree.chart.util; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/util/BooleanList.java b/src/main/java/org/jfree/chart/util/BooleanList.java index 1d53eeb20..4c4d1cc00 100644 --- a/src/main/java/org/jfree/chart/util/BooleanList.java +++ b/src/main/java/org/jfree/chart/util/BooleanList.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.util; + import org.checkerframework.checker.index.qual.NonNegative; /** diff --git a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java index cad1920bf..0c7759d0c 100644 --- a/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java +++ b/src/main/java/org/jfree/chart/util/DefaultShadowGenerator.java @@ -41,6 +41,7 @@ */ package org.jfree.chart.util; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/chart/util/ObjectList.java b/src/main/java/org/jfree/chart/util/ObjectList.java index 266128987..38813b47a 100644 --- a/src/main/java/org/jfree/chart/util/ObjectList.java +++ b/src/main/java/org/jfree/chart/util/ObjectList.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.util; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/chart/util/PaintList.java b/src/main/java/org/jfree/chart/util/PaintList.java index 736f932d4..51a710244 100644 --- a/src/main/java/org/jfree/chart/util/PaintList.java +++ b/src/main/java/org/jfree/chart/util/PaintList.java @@ -28,7 +28,6 @@ package org.jfree.chart.util; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/util/ShapeList.java b/src/main/java/org/jfree/chart/util/ShapeList.java index 21d0e31a0..6939d5017 100644 --- a/src/main/java/org/jfree/chart/util/ShapeList.java +++ b/src/main/java/org/jfree/chart/util/ShapeList.java @@ -27,6 +27,7 @@ */ package org.jfree.chart.util; + import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Shape; diff --git a/src/main/java/org/jfree/chart/util/StrokeList.java b/src/main/java/org/jfree/chart/util/StrokeList.java index b8c152a20..9ea014f98 100644 --- a/src/main/java/org/jfree/chart/util/StrokeList.java +++ b/src/main/java/org/jfree/chart/util/StrokeList.java @@ -28,7 +28,6 @@ package org.jfree.chart.util; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.Stroke; diff --git a/src/main/java/org/jfree/data/ComparableObjectSeries.java b/src/main/java/org/jfree/data/ComparableObjectSeries.java index 11ddd3c3a..c45eb0a15 100644 --- a/src/main/java/org/jfree/data/ComparableObjectSeries.java +++ b/src/main/java/org/jfree/data/ComparableObjectSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/DataUtils.java b/src/main/java/org/jfree/data/DataUtils.java index 501de58b7..6008139d5 100644 --- a/src/main/java/org/jfree/data/DataUtils.java +++ b/src/main/java/org/jfree/data/DataUtils.java @@ -47,6 +47,7 @@ */ package org.jfree.data; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues.java b/src/main/java/org/jfree/data/DefaultKeyedValues.java index 59508fbfb..1e72d36dd 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues.java @@ -59,6 +59,7 @@ */ package org.jfree.data; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java index 1f877ad40..afa822720 100644 --- a/src/main/java/org/jfree/data/DefaultKeyedValues2D.java +++ b/src/main/java/org/jfree/data/DefaultKeyedValues2D.java @@ -57,6 +57,7 @@ */ package org.jfree.data; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/KeyToGroupMap.java b/src/main/java/org/jfree/data/KeyToGroupMap.java index a6583681f..964dc8ae6 100644 --- a/src/main/java/org/jfree/data/KeyToGroupMap.java +++ b/src/main/java/org/jfree/data/KeyToGroupMap.java @@ -44,6 +44,7 @@ */ package org.jfree.data; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/KeyedObjects.java b/src/main/java/org/jfree/data/KeyedObjects.java index 33d9bf4d8..eb702dd2f 100644 --- a/src/main/java/org/jfree/data/KeyedObjects.java +++ b/src/main/java/org/jfree/data/KeyedObjects.java @@ -43,6 +43,7 @@ */ package org.jfree.data; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/KeyedObjects2D.java b/src/main/java/org/jfree/data/KeyedObjects2D.java index 6062cd994..d2943eb16 100644 --- a/src/main/java/org/jfree/data/KeyedObjects2D.java +++ b/src/main/java/org/jfree/data/KeyedObjects2D.java @@ -44,6 +44,7 @@ */ package org.jfree.data; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/KeyedValues.java b/src/main/java/org/jfree/data/KeyedValues.java index aa965e731..53462e9c0 100644 --- a/src/main/java/org/jfree/data/KeyedValues.java +++ b/src/main/java/org/jfree/data/KeyedValues.java @@ -43,6 +43,7 @@ */ package org.jfree.data; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/KeyedValues2D.java b/src/main/java/org/jfree/data/KeyedValues2D.java index 63aa43b5f..ba0a7efe2 100644 --- a/src/main/java/org/jfree/data/KeyedValues2D.java +++ b/src/main/java/org/jfree/data/KeyedValues2D.java @@ -40,6 +40,7 @@ */ package org.jfree.data; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/Values.java b/src/main/java/org/jfree/data/Values.java index 095c4121e..02a69d421 100644 --- a/src/main/java/org/jfree/data/Values.java +++ b/src/main/java/org/jfree/data/Values.java @@ -42,6 +42,7 @@ */ package org.jfree.data; + import org.checkerframework.checker.index.qual.NonNegative; /** diff --git a/src/main/java/org/jfree/data/Values2D.java b/src/main/java/org/jfree/data/Values2D.java index 80fbf724b..bbf04f959 100644 --- a/src/main/java/org/jfree/data/Values2D.java +++ b/src/main/java/org/jfree/data/Values2D.java @@ -39,6 +39,7 @@ */ package org.jfree.data; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java index 4d3e96341..b4baf4e9c 100644 --- a/src/main/java/org/jfree/data/category/CategoryToPieDataset.java +++ b/src/main/java/org/jfree/data/category/CategoryToPieDataset.java @@ -48,6 +48,7 @@ */ package org.jfree.data.category; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java index 21cad0b39..b5b363c71 100644 --- a/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultCategoryDataset.java @@ -47,6 +47,7 @@ */ package org.jfree.data.category; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java index ffe957acc..5cd3672ed 100644 --- a/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/DefaultIntervalCategoryDataset.java @@ -47,6 +47,7 @@ */ package org.jfree.data.category; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java index 3e1de2440..2d313e603 100644 --- a/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/IntervalCategoryDataset.java @@ -46,7 +46,6 @@ package org.jfree.data.category; - import org.checkerframework.checker.index.qual.NonNegative; /** diff --git a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java index d189361a1..4eea10c53 100644 --- a/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java +++ b/src/main/java/org/jfree/data/category/SlidingCategoryDataset.java @@ -40,6 +40,7 @@ */ package org.jfree.data.category; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java index c2f089647..610c21213 100644 --- a/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/GanttCategoryDataset.java @@ -41,6 +41,7 @@ */ package org.jfree.data.gantt; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.IntervalCategoryDataset; diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index a271a351b..f7f5974c9 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -39,6 +39,7 @@ */ package org.jfree.data.gantt; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/gantt/Task.java b/src/main/java/org/jfree/data/gantt/Task.java index 59c31680a..0d3145ce8 100644 --- a/src/main/java/org/jfree/data/gantt/Task.java +++ b/src/main/java/org/jfree/data/gantt/Task.java @@ -43,6 +43,7 @@ */ package org.jfree.data.gantt; + import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/gantt/TaskSeries.java b/src/main/java/org/jfree/data/gantt/TaskSeries.java index 3a758413d..5e30da466 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeries.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeries.java @@ -45,6 +45,7 @@ */ package org.jfree.data.gantt; + import org.checkerframework.checker.index.qual.NonNegative; import java.util.Collections; diff --git a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java index 81dd2a866..7379e846d 100644 --- a/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java +++ b/src/main/java/org/jfree/data/gantt/TaskSeriesCollection.java @@ -50,6 +50,7 @@ */ package org.jfree.data.gantt; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java index 578992661..8ca740b08 100644 --- a/src/main/java/org/jfree/data/gantt/XYTaskDataset.java +++ b/src/main/java/org/jfree/data/gantt/XYTaskDataset.java @@ -40,6 +40,7 @@ */ package org.jfree.data.gantt; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java index 56e8fa48d..b3cb30355 100644 --- a/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java +++ b/src/main/java/org/jfree/data/general/AbstractSeriesDataset.java @@ -43,6 +43,7 @@ */ package org.jfree.data.general; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 8845904de..a51060b93 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -128,6 +128,7 @@ */ package org.jfree.data.general; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java index a339a1669..77977c870 100644 --- a/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultHeatMapDataset.java @@ -39,6 +39,7 @@ */ package org.jfree.data.general; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/general/DefaultPieDataset.java b/src/main/java/org/jfree/data/general/DefaultPieDataset.java index 14d961cdd..5bda8893e 100644 --- a/src/main/java/org/jfree/data/general/DefaultPieDataset.java +++ b/src/main/java/org/jfree/data/general/DefaultPieDataset.java @@ -56,6 +56,7 @@ */ package org.jfree.data.general; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/general/HeatMapDataset.java b/src/main/java/org/jfree/data/general/HeatMapDataset.java index 27610f14f..4f4458789 100644 --- a/src/main/java/org/jfree/data/general/HeatMapDataset.java +++ b/src/main/java/org/jfree/data/general/HeatMapDataset.java @@ -39,6 +39,7 @@ */ package org.jfree.data.general; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/general/HeatMapUtils.java b/src/main/java/org/jfree/data/general/HeatMapUtils.java index 33d87e9fc..4e0c072ec 100644 --- a/src/main/java/org/jfree/data/general/HeatMapUtils.java +++ b/src/main/java/org/jfree/data/general/HeatMapUtils.java @@ -40,6 +40,7 @@ */ package org.jfree.data.general; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/general/Series.java b/src/main/java/org/jfree/data/general/Series.java index aa93ab658..914050727 100644 --- a/src/main/java/org/jfree/data/general/Series.java +++ b/src/main/java/org/jfree/data/general/Series.java @@ -55,6 +55,7 @@ */ package org.jfree.data.general; + import org.checkerframework.checker.index.qual.*; import java.beans.PropertyChangeListener; diff --git a/src/main/java/org/jfree/data/general/SeriesDataset.java b/src/main/java/org/jfree/data/general/SeriesDataset.java index 8f8586a5e..acc52a69b 100644 --- a/src/main/java/org/jfree/data/general/SeriesDataset.java +++ b/src/main/java/org/jfree/data/general/SeriesDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.general; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/general/WaferMapDataset.java b/src/main/java/org/jfree/data/general/WaferMapDataset.java index 2dacba934..2df257fdb 100644 --- a/src/main/java/org/jfree/data/general/WaferMapDataset.java +++ b/src/main/java/org/jfree/data/general/WaferMapDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.general; + import org.checkerframework.checker.index.qual.*; import java.util.Set; diff --git a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java index 5b1244ae5..059e3b95e 100644 --- a/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java +++ b/src/main/java/org/jfree/data/jdbc/JDBCXYDataset.java @@ -71,6 +71,7 @@ */ package org.jfree.data.jdbc; + import org.checkerframework.checker.index.qual.*; import java.sql.Connection; diff --git a/src/main/java/org/jfree/data/json/impl/JSONObject.java b/src/main/java/org/jfree/data/json/impl/JSONObject.java index 58eae99a1..0209fed3b 100644 --- a/src/main/java/org/jfree/data/json/impl/JSONObject.java +++ b/src/main/java/org/jfree/data/json/impl/JSONObject.java @@ -23,7 +23,6 @@ package org.jfree.data.json.impl; - import java.io.IOException; import java.io.Writer; import java.util.HashMap; diff --git a/src/main/java/org/jfree/data/json/impl/JSONStreamAware.java b/src/main/java/org/jfree/data/json/impl/JSONStreamAware.java index e036f832e..1135c0100 100644 --- a/src/main/java/org/jfree/data/json/impl/JSONStreamAware.java +++ b/src/main/java/org/jfree/data/json/impl/JSONStreamAware.java @@ -23,7 +23,6 @@ package org.jfree.data.json.impl; - import java.io.IOException; import java.io.Writer; diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java index f8893ba93..17d22704b 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerCategoryDataset.java @@ -44,6 +44,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.checker.index.qual.NonNegative; import java.util.List; diff --git a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java index 52427ad97..e61c818c6 100644 --- a/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/BoxAndWhiskerXYDataset.java @@ -51,6 +51,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java index 671bf90b0..0dcd7864a 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerCategoryDataset.java @@ -55,6 +55,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index f60701696..cc578bb18 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -59,6 +59,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java index 00cba5815..799319008 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultMultiValueCategoryDataset.java @@ -41,6 +41,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java index 0dc7aa31b..966586871 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultStatisticalCategoryDataset.java @@ -56,6 +56,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/statistics/HistogramBin.java b/src/main/java/org/jfree/data/statistics/HistogramBin.java index 779820da4..29f659ff1 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramBin.java +++ b/src/main/java/org/jfree/data/statistics/HistogramBin.java @@ -43,6 +43,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.checker.index.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index 841a961ae..c9a9970de 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -61,6 +61,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java b/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java index 82565cb88..5e82b0b1a 100644 --- a/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/MultiValueCategoryDataset.java @@ -39,6 +39,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.checker.index.qual.NonNegative; import java.util.List; diff --git a/src/main/java/org/jfree/data/statistics/Regression.java b/src/main/java/org/jfree/data/statistics/Regression.java index f207fd7dc..8ac936860 100644 --- a/src/main/java/org/jfree/data/statistics/Regression.java +++ b/src/main/java/org/jfree/data/statistics/Regression.java @@ -45,6 +45,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java index c1a320ca5..ac347ff14 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramBin.java @@ -39,6 +39,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.checker.index.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index f87dd9fe4..6a8e6921f 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java b/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java index 3f2cc7fb3..c61fa4f5c 100644 --- a/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java +++ b/src/main/java/org/jfree/data/statistics/StatisticalCategoryDataset.java @@ -44,6 +44,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.category.CategoryDataset; diff --git a/src/main/java/org/jfree/data/statistics/Statistics.java b/src/main/java/org/jfree/data/statistics/Statistics.java index 9ed834b31..5a6fdf517 100644 --- a/src/main/java/org/jfree/data/statistics/Statistics.java +++ b/src/main/java/org/jfree/data/statistics/Statistics.java @@ -48,6 +48,7 @@ */ package org.jfree.data.statistics; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/time/Day.java b/src/main/java/org/jfree/data/time/Day.java index 6084f8d40..252697d6f 100644 --- a/src/main/java/org/jfree/data/time/Day.java +++ b/src/main/java/org/jfree/data/time/Day.java @@ -64,6 +64,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index f06aae2d2..39583aba7 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -61,6 +61,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/time/Hour.java b/src/main/java/org/jfree/data/time/Hour.java index 377679873..53df9796f 100644 --- a/src/main/java/org/jfree/data/time/Hour.java +++ b/src/main/java/org/jfree/data/time/Hour.java @@ -65,6 +65,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/Millisecond.java b/src/main/java/org/jfree/data/time/Millisecond.java index a145fea83..beeba0933 100644 --- a/src/main/java/org/jfree/data/time/Millisecond.java +++ b/src/main/java/org/jfree/data/time/Millisecond.java @@ -59,6 +59,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/Minute.java b/src/main/java/org/jfree/data/time/Minute.java index 03c2f1d76..0801251e6 100644 --- a/src/main/java/org/jfree/data/time/Minute.java +++ b/src/main/java/org/jfree/data/time/Minute.java @@ -66,6 +66,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/Month.java b/src/main/java/org/jfree/data/time/Month.java index 8f239af90..76e1ffeaa 100644 --- a/src/main/java/org/jfree/data/time/Month.java +++ b/src/main/java/org/jfree/data/time/Month.java @@ -65,6 +65,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/MovingAverage.java b/src/main/java/org/jfree/data/time/MovingAverage.java index e8f559246..075bb74c4 100644 --- a/src/main/java/org/jfree/data/time/MovingAverage.java +++ b/src/main/java/org/jfree/data/time/MovingAverage.java @@ -49,6 +49,7 @@ */ package org.jfree.data.time; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/time/Quarter.java b/src/main/java/org/jfree/data/time/Quarter.java index da1985ac0..5f867d4b9 100644 --- a/src/main/java/org/jfree/data/time/Quarter.java +++ b/src/main/java/org/jfree/data/time/Quarter.java @@ -61,7 +61,6 @@ package org.jfree.data.time; - import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/time/RegularTimePeriod.java b/src/main/java/org/jfree/data/time/RegularTimePeriod.java index 83be06ca9..2f7f473ff 100644 --- a/src/main/java/org/jfree/data/time/RegularTimePeriod.java +++ b/src/main/java/org/jfree/data/time/RegularTimePeriod.java @@ -53,6 +53,7 @@ */ package org.jfree.data.time; + import org.checkerframework.dataflow.qual.Pure; import java.lang.reflect.Constructor; diff --git a/src/main/java/org/jfree/data/time/Second.java b/src/main/java/org/jfree/data/time/Second.java index 11f131e37..14f2e29b0 100644 --- a/src/main/java/org/jfree/data/time/Second.java +++ b/src/main/java/org/jfree/data/time/Second.java @@ -61,6 +61,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/SimpleTimePeriod.java b/src/main/java/org/jfree/data/time/SimpleTimePeriod.java index ce21ff06d..d4e3769da 100644 --- a/src/main/java/org/jfree/data/time/SimpleTimePeriod.java +++ b/src/main/java/org/jfree/data/time/SimpleTimePeriod.java @@ -45,6 +45,7 @@ */ package org.jfree.data.time; + import org.checkerframework.dataflow.qual.Pure; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/TimePeriod.java b/src/main/java/org/jfree/data/time/TimePeriod.java index d7134cabd..3bbdc37e9 100644 --- a/src/main/java/org/jfree/data/time/TimePeriod.java +++ b/src/main/java/org/jfree/data/time/TimePeriod.java @@ -41,6 +41,7 @@ */ package org.jfree.data.time; + import org.checkerframework.dataflow.qual.Pure; import java.util.Date; diff --git a/src/main/java/org/jfree/data/time/TimePeriodValue.java b/src/main/java/org/jfree/data/time/TimePeriodValue.java index fb6ee5faa..9615d9b2b 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValue.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValue.java @@ -42,6 +42,7 @@ */ package org.jfree.data.time; + import org.checkerframework.dataflow.qual.Pure; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/TimePeriodValues.java b/src/main/java/org/jfree/data/time/TimePeriodValues.java index 2de0eb52f..daa6d1fd5 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValues.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValues.java @@ -47,6 +47,7 @@ */ package org.jfree.data.time; + import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.checker.index.qual.GTENegativeOne; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index 5a27e5591..711cdebc3 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -49,6 +49,7 @@ */ package org.jfree.data.time; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index 7f31f3ebb..53dcaa202 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -90,6 +90,7 @@ */ package org.jfree.data.time; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java index 1c2159fa9..dca8b64df 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesCollection.java @@ -88,6 +88,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import org.checkerframework.checker.index.qual.*; diff --git a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java index 42e461d55..dd302a4b9 100644 --- a/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java +++ b/src/main/java/org/jfree/data/time/TimeSeriesTableModel.java @@ -42,6 +42,7 @@ */ package org.jfree.data.time; + import org.checkerframework.checker.index.qual.NonNegative; import javax.swing.table.AbstractTableModel; diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index b12057320..b11b74875 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -56,6 +56,7 @@ */ package org.jfree.data.time; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/time/Week.java b/src/main/java/org/jfree/data/time/Week.java index f5de244c9..82536cd1a 100644 --- a/src/main/java/org/jfree/data/time/Week.java +++ b/src/main/java/org/jfree/data/time/Week.java @@ -73,6 +73,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/Year.java b/src/main/java/org/jfree/data/time/Year.java index 0322b174c..30ad3d573 100644 --- a/src/main/java/org/jfree/data/time/Year.java +++ b/src/main/java/org/jfree/data/time/Year.java @@ -61,6 +61,7 @@ */ package org.jfree.data.time; + import org.checkerframework.common.value.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java index 8bf13aee2..a8acd1906 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data.time.ohlc; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.chart.util.Args; diff --git a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java index 0d3b92c04..c28eab112 100644 --- a/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/ohlc/OHLCSeriesCollection.java @@ -43,6 +43,7 @@ */ package org.jfree.data.time.ohlc; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xml/KeyHandler.java b/src/main/java/org/jfree/data/xml/KeyHandler.java index 3cc1df2a0..ca79d04c3 100644 --- a/src/main/java/org/jfree/data/xml/KeyHandler.java +++ b/src/main/java/org/jfree/data/xml/KeyHandler.java @@ -39,6 +39,7 @@ */ package org.jfree.data.xml; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/xml/RootHandler.java b/src/main/java/org/jfree/data/xml/RootHandler.java index a66fd4748..1350a42e5 100644 --- a/src/main/java/org/jfree/data/xml/RootHandler.java +++ b/src/main/java/org/jfree/data/xml/RootHandler.java @@ -39,6 +39,7 @@ */ package org.jfree.data.xml; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/xml/ValueHandler.java b/src/main/java/org/jfree/data/xml/ValueHandler.java index b5c00b9f9..b228b6ad0 100644 --- a/src/main/java/org/jfree/data/xml/ValueHandler.java +++ b/src/main/java/org/jfree/data/xml/ValueHandler.java @@ -40,6 +40,7 @@ */ package org.jfree.data.xml; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java index 464c5cb44..18667261e 100644 --- a/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractIntervalXYDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java index 3b4e69fbc..4c4325743 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java index c4e2796c5..a72ab04d4 100644 --- a/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/AbstractXYZDataset.java @@ -40,6 +40,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java index 80b578918..d7db4aceb 100644 --- a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java @@ -48,6 +48,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java index 560cd5880..f01d78df1 100644 --- a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java @@ -44,6 +44,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index bace41a5e..d189651ed 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -44,6 +44,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index f1e66f621..9b150d85f 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -62,6 +62,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index f008083f2..f5c921e54 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -46,6 +46,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index 363ef4256..5e6f77f40 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.ArrayLen; diff --git a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java index 654ddd0ef..a4adce92d 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYZDataset.java @@ -43,6 +43,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java index 45f8ffeaf..922c30333 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java index f4156a998..f86afa4cc 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYDelegate.java @@ -52,6 +52,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java index 0c53b43be..f5d01c3cf 100644 --- a/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java +++ b/src/main/java/org/jfree/data/xy/IntervalXYZDataset.java @@ -39,6 +39,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index 3f54468e5..6487e5cfb 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -46,6 +46,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java index 9e499a534..760ba1e46 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeriesCollection.java @@ -44,6 +44,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java b/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java index 22585bc41..2b95c84ce 100644 --- a/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/NormalizedMatrixSeries.java @@ -40,6 +40,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; /** diff --git a/src/main/java/org/jfree/data/xy/OHLCDataset.java b/src/main/java/org/jfree/data/xy/OHLCDataset.java index 3e75973a7..3cdbfc132 100644 --- a/src/main/java/org/jfree/data/xy/OHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/OHLCDataset.java @@ -47,6 +47,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/TableXYDataset.java b/src/main/java/org/jfree/data/xy/TableXYDataset.java index 4d8cffb98..0e6e95615 100644 --- a/src/main/java/org/jfree/data/xy/TableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/TableXYDataset.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; /** diff --git a/src/main/java/org/jfree/data/xy/VectorSeries.java b/src/main/java/org/jfree/data/xy/VectorSeries.java index f49d028e2..f53583406 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeries.java +++ b/src/main/java/org/jfree/data/xy/VectorSeries.java @@ -45,6 +45,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.ComparableObjectItem; diff --git a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java index f2b539277..ba9dde846 100644 --- a/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/VectorSeriesCollection.java @@ -44,6 +44,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/VectorXYDataset.java b/src/main/java/org/jfree/data/xy/VectorXYDataset.java index a32cb4391..7c2682efe 100644 --- a/src/main/java/org/jfree/data/xy/VectorXYDataset.java +++ b/src/main/java/org/jfree/data/xy/VectorXYDataset.java @@ -44,7 +44,6 @@ package org.jfree.data.xy; - import org.checkerframework.checker.index.qual.*; /** diff --git a/src/main/java/org/jfree/data/xy/WindDataset.java b/src/main/java/org/jfree/data/xy/WindDataset.java index 7f7cd2462..33c9b3d6f 100644 --- a/src/main/java/org/jfree/data/xy/WindDataset.java +++ b/src/main/java/org/jfree/data/xy/WindDataset.java @@ -40,6 +40,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeries.java b/src/main/java/org/jfree/data/xy/XIntervalSeries.java index 2002bc477..75123ffdf 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.ComparableObjectItem; diff --git a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java index cca2eb1df..c9aa62921 100644 --- a/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XIntervalSeriesCollection.java @@ -43,6 +43,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index 0de7266ac..3273fe47e 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -48,6 +48,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/XYDataset.java b/src/main/java/org/jfree/data/xy/XYDataset.java index 2d5b1118d..f8ff68bbb 100644 --- a/src/main/java/org/jfree/data/xy/XYDataset.java +++ b/src/main/java/org/jfree/data/xy/XYDataset.java @@ -46,6 +46,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java index beca270bb..4ddf89850 100644 --- a/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java +++ b/src/main/java/org/jfree/data/xy/XYDatasetTableModel.java @@ -43,6 +43,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.NonNegative; import javax.swing.table.AbstractTableModel; diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeries.java b/src/main/java/org/jfree/data/xy/XYIntervalSeries.java index d57876e68..1bacad1f1 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.ComparableObjectItem; diff --git a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java index 4f627ece4..f361b542b 100644 --- a/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYIntervalSeriesCollection.java @@ -45,6 +45,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/XYItemKey.java b/src/main/java/org/jfree/data/xy/XYItemKey.java index bad67b308..39252bd5a 100644 --- a/src/main/java/org/jfree/data/xy/XYItemKey.java +++ b/src/main/java/org/jfree/data/xy/XYItemKey.java @@ -39,6 +39,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index a194cd094..0ecfaa457 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -79,6 +79,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java index d0d4ccfb2..01f9ac5f2 100644 --- a/src/main/java/org/jfree/data/xy/XYSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/XYSeriesCollection.java @@ -64,6 +64,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/XYZDataset.java b/src/main/java/org/jfree/data/xy/XYZDataset.java index f73851d56..ef6bdf2bd 100644 --- a/src/main/java/org/jfree/data/xy/XYZDataset.java +++ b/src/main/java/org/jfree/data/xy/XYZDataset.java @@ -42,6 +42,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/XisSymbolic.java b/src/main/java/org/jfree/data/xy/XisSymbolic.java index f7a648c9b..3c3a2aad8 100644 --- a/src/main/java/org/jfree/data/xy/XisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/XisSymbolic.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeries.java b/src/main/java/org/jfree/data/xy/YIntervalSeries.java index 85d3c7158..8ee9fefc2 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeries.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeries.java @@ -41,6 +41,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.NonNegative; import org.jfree.data.ComparableObjectItem; diff --git a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java index bfcf72d0d..1d9591985 100644 --- a/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java +++ b/src/main/java/org/jfree/data/xy/YIntervalSeriesCollection.java @@ -45,6 +45,7 @@ */ package org.jfree.data.xy; + import org.checkerframework.checker.index.qual.*; import org.checkerframework.checker.index.qual.NonNegative; diff --git a/src/main/java/org/jfree/data/xy/YisSymbolic.java b/src/main/java/org/jfree/data/xy/YisSymbolic.java index 7b61ce059..99c7796de 100644 --- a/src/main/java/org/jfree/data/xy/YisSymbolic.java +++ b/src/main/java/org/jfree/data/xy/YisSymbolic.java @@ -43,7 +43,6 @@ package org.jfree.data.xy; - import org.checkerframework.checker.index.qual.*; /** diff --git a/src/test/java/org/jfree/data/statistics/DefaultStatisticalCategoryDatasetTest.java b/src/test/java/org/jfree/data/statistics/DefaultStatisticalCategoryDatasetTest.java index 6d6553972..221f92c93 100644 --- a/src/test/java/org/jfree/data/statistics/DefaultStatisticalCategoryDatasetTest.java +++ b/src/test/java/org/jfree/data/statistics/DefaultStatisticalCategoryDatasetTest.java @@ -43,6 +43,7 @@ */ package org.jfree.data.statistics; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; From 3d284b283822a34057ac820c386cd064b5248082 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Fri, 4 May 2018 12:53:14 -0700 Subject: [PATCH 68/79] minor changes to travis ci config --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d3d2e7556..52e28c7f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ language: java sudo: false -script: travis_wait mvn clean compile \ No newline at end of file +script: + - mvn clean + - travis_wait mvn compile \ No newline at end of file From fc51946cc9f65888e06ddbafea5b833f681e30f8 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Fri, 4 May 2018 12:59:21 -0700 Subject: [PATCH 69/79] more whitespace fixes --- src/main/java/org/jfree/chart/LegendItem.java | 1 - src/main/java/org/jfree/chart/axis/CompassFormat.java | 1 - src/main/java/org/jfree/chart/axis/MonthDateFormat.java | 1 - src/main/java/org/jfree/chart/axis/PeriodAxis.java | 1 - src/main/java/org/jfree/chart/axis/QuarterDateFormat.java | 1 - .../org/jfree/chart/labels/AbstractPieItemLabelGenerator.java | 1 - .../org/jfree/chart/labels/AbstractXYItemLabelGenerator.java | 1 - .../org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java | 1 - .../java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java | 1 - .../java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java | 1 - src/main/java/org/jfree/chart/renderer/category/BarRenderer.java | 1 - .../java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java | 1 - .../java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java | 1 - src/main/java/org/jfree/chart/text/TextBlock.java | 1 - .../java/org/jfree/data/time/TimePeriodValuesCollection.java | 1 - src/main/java/org/jfree/data/time/TimeTableXYDataset.java | 1 - src/main/java/org/jfree/data/xy/DefaultWindDataset.java | 1 - src/main/java/org/jfree/data/xy/DefaultXYDataset.java | 1 - 18 files changed, 18 deletions(-) diff --git a/src/main/java/org/jfree/chart/LegendItem.java b/src/main/java/org/jfree/chart/LegendItem.java index fbbe37e3d..fb47b21c5 100644 --- a/src/main/java/org/jfree/chart/LegendItem.java +++ b/src/main/java/org/jfree/chart/LegendItem.java @@ -80,7 +80,6 @@ import java.io.Serializable; import java.text.AttributedString; import java.text.CharacterIterator; - import org.jfree.chart.text.AttributedStringUtils; import org.jfree.chart.ui.GradientPaintTransformer; import org.jfree.chart.ui.StandardGradientPaintTransformer; diff --git a/src/main/java/org/jfree/chart/axis/CompassFormat.java b/src/main/java/org/jfree/chart/axis/CompassFormat.java index 71b0146bb..916be77f9 100644 --- a/src/main/java/org/jfree/chart/axis/CompassFormat.java +++ b/src/main/java/org/jfree/chart/axis/CompassFormat.java @@ -45,7 +45,6 @@ import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; - import java.text.FieldPosition; import java.text.NumberFormat; import java.text.ParsePosition; diff --git a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java index 747d994e3..f66ab0713 100644 --- a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java @@ -44,7 +44,6 @@ import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; - import java.text.DateFormat; import java.text.DateFormatSymbols; import java.text.FieldPosition; diff --git a/src/main/java/org/jfree/chart/axis/PeriodAxis.java b/src/main/java/org/jfree/chart/axis/PeriodAxis.java index 1cc6ad8fb..2d26d858c 100644 --- a/src/main/java/org/jfree/chart/axis/PeriodAxis.java +++ b/src/main/java/org/jfree/chart/axis/PeriodAxis.java @@ -68,7 +68,6 @@ import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntVal; - import java.awt.BasicStroke; import java.awt.Color; import java.awt.FontMetrics; diff --git a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java index e1720ef37..280c3e078 100644 --- a/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/QuarterDateFormat.java @@ -49,7 +49,6 @@ import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.IntRange; - import java.io.Serializable; import java.text.DateFormat; import java.text.FieldPosition; diff --git a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java index 6a31fc5eb..71c482483 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractPieItemLabelGenerator.java @@ -50,7 +50,6 @@ import org.checkerframework.common.value.qual.MinLen; - import java.io.Serializable; import java.text.MessageFormat; import java.text.NumberFormat; diff --git a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java index 39c0d9ac6..566359bcd 100644 --- a/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/AbstractXYItemLabelGenerator.java @@ -58,7 +58,6 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.MinLen; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java index 722cb99c4..ec764ea98 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerToolTipGenerator.java @@ -43,7 +43,6 @@ import org.checkerframework.common.value.qual.MinLen; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index 9be339b48..15f11f58c 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -43,7 +43,6 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.MinLen; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index 9cf0653a9..ed8cd7d28 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -45,7 +45,6 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.MinLen; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java index ed4ebe04a..9c854ab9e 100644 --- a/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/category/BarRenderer.java @@ -98,7 +98,6 @@ import org.checkerframework.common.value.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.BasicStroke; diff --git a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java index fa43fd1d6..d78986bcc 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/AbstractXYItemRenderer.java @@ -132,7 +132,6 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; import java.awt.AlphaComposite; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java index 2b17f28ce..dc22dfbf2 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYDifferenceRenderer.java @@ -86,7 +86,6 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; - import java.awt.Color; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/chart/text/TextBlock.java b/src/main/java/org/jfree/chart/text/TextBlock.java index ecfbb7b99..a8138820b 100644 --- a/src/main/java/org/jfree/chart/text/TextBlock.java +++ b/src/main/java/org/jfree/chart/text/TextBlock.java @@ -30,7 +30,6 @@ import org.checkerframework.common.value.qual.ArrayLen; - import java.awt.Font; import java.awt.Graphics2D; import java.awt.Paint; diff --git a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java index 711cdebc3..8e0b5632a 100644 --- a/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java +++ b/src/main/java/org/jfree/data/time/TimePeriodValuesCollection.java @@ -53,7 +53,6 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; import java.io.Serializable; diff --git a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java index b11b74875..4acf4d87a 100644 --- a/src/main/java/org/jfree/data/time/TimeTableXYDataset.java +++ b/src/main/java/org/jfree/data/time/TimeTableXYDataset.java @@ -60,7 +60,6 @@ import org.checkerframework.checker.index.qual.*; import org.checkerframework.common.value.qual.*; - import org.checkerframework.checker.index.qual.NonNegative; import java.util.Calendar; diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index f5c921e54..3c3f14deb 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -52,7 +52,6 @@ import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.common.value.qual.ArrayLen; - import java.io.Serializable; import java.util.Arrays; import java.util.Collections; diff --git a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java index 5e6f77f40..46fec7d4c 100644 --- a/src/main/java/org/jfree/data/xy/DefaultXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultXYDataset.java @@ -47,7 +47,6 @@ import org.checkerframework.common.value.qual.ArrayLen; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; From 9febaa0c1dd1b7b5301db02e1a49af56c1bce32a Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Tue, 8 May 2018 15:52:24 -0700 Subject: [PATCH 70/79] address a number of Mike's comments --- .gitignore | 4 +- .travis.yml | 3 +- pom.xml | 38 +++++++++---------- .../annotations/XYPolygonAnnotation.java | 11 +++--- .../jfree/chart/axis/CyclicNumberAxis.java | 36 ++++++++---------- .../java/org/jfree/chart/axis/ValueAxis.java | 1 - src/main/java/org/jfree/chart/plot/Plot.java | 2 +- .../java/org/jfree/chart/plot/XYPlot.java | 1 - .../java/org/jfree/chart/GanttChartTest.java | 2 +- .../category/BoxAndWhiskerRendererTest.java | 4 +- .../general/TestIntervalCategoryDataset.java | 24 ++++++------ 11 files changed, 55 insertions(+), 71 deletions(-) diff --git a/.gitignore b/.gitignore index 28761933d..b773e534c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,12 +2,10 @@ /target/ /javadoc/ -build/ - # Eclipse files # /.classpath /.project /.settings # Intellij Idea -.idea +.idea \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 52e28c7f2..7de0b7241 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ language: java sudo: false script: - - mvn clean - - travis_wait mvn compile \ No newline at end of file + - travis_wait mvn compile diff --git a/pom.xml b/pom.xml index e74f716d5..9635345cc 100644 --- a/pom.xml +++ b/pom.xml @@ -63,17 +63,12 @@ <dependency> <groupId>org.checkerframework</groupId> <artifactId>checker-qual</artifactId> - <version>2.5.0</version> + <version>2.5.1</version> </dependency> - <!--dependency> - <groupId>org.checkerframework</groupId> - <artifactId>compiler</artifactId> - <version>2.4.0</version> - </dependency--> <dependency> <groupId>org.checkerframework</groupId> <artifactId>jdk8</artifactId> - <version>2.5.0</version> + <version>2.5.1</version> </dependency> </dependencies> @@ -84,16 +79,6 @@ </snapshotRepository> </distributionManagement> - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <project.source.level>1.8</project.source.level> - <project.target.level>1.8</project.target.level> - <!-- These properties will be set by the Maven Dependency plugin --> - <annotatedJdk>${org.checkerframework:jdk8:jar}</annotatedJdk> - <!-- Uncomment to use the Type Annotations compiler. --> - <!--typeAnnotationsJavac>${org.checkerframework:compiler:jar}</typeAnnotationsJavac--> - </properties> - <build> <testSourceDirectory>src/test/java</testSourceDirectory> @@ -101,7 +86,7 @@ <plugin> <artifactId>maven-compiler-plugin</artifactId> - <version>3.6.1</version> + <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> @@ -113,17 +98,19 @@ <path> <groupId>org.checkerframework</groupId> <artifactId>checker</artifactId> - <version>2.5.0</version> + <version>2.5.1</version> </path> </annotationProcessorPaths> <annotationProcessors> <!-- Add all the checkers you want to enable here --> - <annotationProcessor>org.checkerframework.checker.index.IndexChecker</annotationProcessor> + <annotationProcessor>${checkerframework.checkers}</annotationProcessor> </annotationProcessors> <compilerArgs> <arg>-AprintErrorStack</arg> <!-- location of the annotated JDK, which comes from a Maven dependency --> <arg>-Xbootclasspath/p:${annotatedJdk}</arg> + <arg>-AskipDefs=Test</arg> + <arg>${checkerframework.extraargs}</arg> <!-- Uncomment the following line to turn type-checking warnings into errors. --> <!-- <arg>-Awarns</arg> --> </compilerArgs> @@ -213,6 +200,17 @@ </plugins> </reporting> + <properties> + <project.source.level>1.8</project.source.level> + <project.target.level>1.8</project.target.level> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <!-- These properties will be set by the Maven Dependency plugin --> + <annotatedJdk>${org.checkerframework:jdk8:jar}</annotatedJdk> + <!-- These properties are here for convenience when modifying the build from the command line --> + <checkerframework.checkers>org.checkerframework.checker.index.IndexChecker</checkerframework.checkers> + <checkerframework.extraargs></checkerframework.extraargs> + </properties> + <profiles> <profile> <id>release</id> diff --git a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java index 2d9274d7f..8782ff40e 100644 --- a/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java +++ b/src/main/java/org/jfree/chart/annotations/XYPolygonAnnotation.java @@ -221,20 +221,19 @@ public void draw(Graphics2D g2, XYPlot plot, Rectangle2D dataArea, RectangleEdge rangeEdge = Plot.resolveRangeAxisLocation( plot.getRangeAxisLocation(), orientation); - GeneralPath area = new GeneralPath(); - - @SuppressWarnings("index") // Length is checked above, and all functions called in-between are pure double x = domainAxis.valueToJava2D(this.polygon[0], dataArea, domainEdge); - @SuppressWarnings("index") // Length is checked above, and all functions called in-between are pure double y = rangeAxis.valueToJava2D(this.polygon[1], dataArea, rangeEdge); + + GeneralPath area = new GeneralPath(); + if (orientation == PlotOrientation.HORIZONTAL) { area.moveTo((float) y, (float) x); for (int i = 2; i < this.polygon.length; i += 2) { x = domainAxis.valueToJava2D(this.polygon[i], dataArea, domainEdge); - @SuppressWarnings("index") // polygon always has an even number of elements, and i is an odd index + @SuppressWarnings("index") // polygon always has an even number of elements, and i is even and less than the length of polygon, so i + 1 must be an index double y1 = this.polygon[i + 1]; y = rangeAxis.valueToJava2D(y1, dataArea, rangeEdge); @@ -247,7 +246,7 @@ else if (orientation == PlotOrientation.VERTICAL) { for (int i = 2; i < this.polygon.length; i += 2) { x = domainAxis.valueToJava2D(this.polygon[i], dataArea, domainEdge); - @SuppressWarnings("index") // polygon always has an even number of elements, and i is an odd index + @SuppressWarnings("index") // polygon always has an even number of elements, and i is even and less than the length of polygon, so i + 1 must be an index double y1 = this.polygon[i + 1]; y = rangeAxis.valueToJava2D(y1, dataArea, rangeEdge); diff --git a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java index b04bac18d..8602a4a5f 100644 --- a/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java +++ b/src/main/java/org/jfree/chart/axis/CyclicNumberAxis.java @@ -479,9 +479,7 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.TOP_RIGHT : TextAnchor.BOTTOM_RIGHT; - @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - @NonNegative int lastTickIndex = result.size() - 1; - result.remove(lastTickIndex); + removeLast(result); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -500,9 +498,7 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.BOTTOM_RIGHT; - @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - @NonNegative int lastTickIndex = result.size() - 1; - result.remove(lastTickIndex); + removeLast(result); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -520,9 +516,7 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.TOP_LEFT : TextAnchor.TOP_RIGHT; - @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - @NonNegative int lastTickIndex = result.size() - 1; - result.remove(lastTickIndex); + removeLast(result); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -563,6 +557,14 @@ protected List refreshTicksHorizontal(Graphics2D g2, Rectangle2D dataArea, } + /** + * Removes the last element of a list. The list must have at least one element. + */ + @SuppressWarnings("index") // Because the list must have at least one element, result.size() - 1 must be non-negative + private void removeLast(List result) { + result.remove(result.size() - 1); + } + /** * Builds a list of ticks for the axis. This method is called when the * axis is at the left or right of the chart (so the axis is "vertical"). @@ -633,9 +635,7 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.BOTTOM_RIGHT; - @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - @NonNegative int lastTickIndex = result.size() - 1; - result.remove(lastTickIndex); + removeLast(result); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -654,9 +654,7 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_RIGHT : TextAnchor.BOTTOM_LEFT; - @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - @NonNegative int lastTickIndex = result.size() - 1; - result.remove(lastTickIndex); + removeLast(result); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -677,9 +675,7 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_RIGHT : TextAnchor.TOP_RIGHT; - @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - @NonNegative int lastTickIndex = result.size() - 1; - result.remove(lastTickIndex); + removeLast(result); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, @@ -697,9 +693,7 @@ protected List refreshVerticalTicks(Graphics2D g2, Rectangle2D dataArea, && (currentTickValue != cycleBound)) { anchor = isInverted() ? TextAnchor.BOTTOM_LEFT : TextAnchor.TOP_LEFT; - @SuppressWarnings("index") // If cycled, there must be at least one tick in the results list already - @NonNegative int lastTickIndex = result.size() - 1; - result.remove(lastTickIndex); + removeLast(result); result.add(new CycleBoundTick( this.boundMappedToLastCycle, lastTick.getNumber(), lastTick.getText(), anchor, anchor, diff --git a/src/main/java/org/jfree/chart/axis/ValueAxis.java b/src/main/java/org/jfree/chart/axis/ValueAxis.java index 500c7851f..f94715d7a 100644 --- a/src/main/java/org/jfree/chart/axis/ValueAxis.java +++ b/src/main/java/org/jfree/chart/axis/ValueAxis.java @@ -119,7 +119,6 @@ import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.dataflow.qual.Pure; - import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; diff --git a/src/main/java/org/jfree/chart/plot/Plot.java b/src/main/java/org/jfree/chart/plot/Plot.java index e7587d3d4..9d6968315 100644 --- a/src/main/java/org/jfree/chart/plot/Plot.java +++ b/src/main/java/org/jfree/chart/plot/Plot.java @@ -137,7 +137,6 @@ import org.checkerframework.dataflow.qual.Pure; - import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; @@ -1545,6 +1544,7 @@ else if (orientation == PlotOrientation.VERTICAL) { * * @return The edge (never {@code null}). */ + @Pure public static RectangleEdge resolveRangeAxisLocation( AxisLocation location, PlotOrientation orientation) { diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index d428dd80b..db3c4be5d 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -240,7 +240,6 @@ import org.checkerframework.common.value.qual.*; import org.checkerframework.dataflow.qual.Pure; - import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; diff --git a/src/test/java/org/jfree/chart/GanttChartTest.java b/src/test/java/org/jfree/chart/GanttChartTest.java index 2cf92760b..e9366f2be 100644 --- a/src/test/java/org/jfree/chart/GanttChartTest.java +++ b/src/test/java/org/jfree/chart/GanttChartTest.java @@ -271,7 +271,7 @@ public static IntervalCategoryDataset createDataset() { * * @return a date. */ - private static Date date(@IntRange(from = 1, to = 31) int day, @IntRange(from = 1, to = 12) int month, @IntRange(from = 1900, to = 9999) int year) { + private static Date date(int day, int month, int year) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month, day); diff --git a/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java b/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java index e0baa39c6..88640cf83 100644 --- a/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java +++ b/src/test/java/org/jfree/chart/renderer/category/BoxAndWhiskerRendererTest.java @@ -203,7 +203,7 @@ public void testBug1572478Vertical() { = new DefaultBoxAndWhiskerCategoryDataset() { @Override - public Number getQ1Value(@NonNegative int row, @NonNegative int column) { + public Number getQ1Value(int row, int column) { return null; } @@ -248,7 +248,7 @@ public void testBug1572478Horizontal() { = new DefaultBoxAndWhiskerCategoryDataset() { @Override - public Number getQ1Value(@NonNegative int row, @NonNegative int column) { + public Number getQ1Value(int row, int column) { return null; } diff --git a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java index f771e7a7a..9782119e6 100644 --- a/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java +++ b/src/test/java/org/jfree/data/general/TestIntervalCategoryDataset.java @@ -74,7 +74,7 @@ public TestIntervalCategoryDataset() { * @see #getColumnCount() */ @Override - public @NonNegative int getRowCount() { + public int getRowCount() { return this.data.getRowCount(); } @@ -85,9 +85,8 @@ public TestIntervalCategoryDataset() { * * @see #getRowCount() */ - @Pure @Override - public @NonNegative int getColumnCount() { + public int getColumnCount() { return this.data.getColumnCount(); } @@ -103,8 +102,7 @@ public TestIntervalCategoryDataset() { * @see #removeValue(Comparable, Comparable) */ @Override - @Pure - public Number getValue(@NonNegative int row, @NonNegative int column) { + public Number getValue(int row, int column) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(row, column); if (item == null) { @@ -125,7 +123,7 @@ public Number getValue(@NonNegative int row, @NonNegative int column) { * @see #getColumnKey(int) */ @Override - public Comparable getRowKey(@NonNegative int row) { + public Comparable getRowKey(int row) { return this.data.getRowKey(row); } @@ -139,7 +137,7 @@ public Comparable getRowKey(@NonNegative int row) { * @see #getRowKey(int) */ @Override - public @GTENegativeOne int getRowIndex(Comparable key) { + public int getRowIndex(Comparable key) { // defer null argument check return this.data.getRowIndex(key); } @@ -166,7 +164,7 @@ public List getRowKeys() { * @see #getColumnIndex(Comparable) */ @Override - public Comparable getColumnKey(@NonNegative int column) { + public Comparable getColumnKey(int column) { return this.data.getColumnKey(column); } @@ -180,7 +178,7 @@ public Comparable getColumnKey(@NonNegative int column) { * @see #getColumnKey(int) */ @Override - public @GTENegativeOne int getColumnIndex(Comparable key) { + public int getColumnIndex(Comparable key) { // defer null argument check return this.data.getColumnIndex(key); } @@ -306,7 +304,7 @@ public void removeItem(Comparable rowKey, Comparable columnKey) { * * @see #removeColumn(int) */ - public void removeRow(@NonNegative int rowIndex) { + public void removeRow(int rowIndex) { this.data.removeRow(rowIndex); fireDatasetChanged(); } @@ -332,7 +330,7 @@ public void removeRow(Comparable rowKey) { * * @see #removeRow(int) */ - public void removeColumn(@NonNegative int columnIndex) { + public void removeColumn(int columnIndex) { this.data.removeColumn(columnIndex); fireDatasetChanged(); } @@ -430,7 +428,7 @@ public Object clone() throws CloneNotSupportedException { } @Override - public Number getStartValue(@NonNegative int series, @NonNegative int category) { + public Number getStartValue(int series, int category) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(series, category); if (item == null) { @@ -450,7 +448,7 @@ public Number getStartValue(Comparable series, Comparable category) { } @Override - public Number getEndValue(@NonNegative int series, @NonNegative int category) { + public Number getEndValue(int series, int category) { IntervalDataItem item = (IntervalDataItem) this.data.getObject(series, category); if (item == null) { From 6fbf1c14bc63957f37bc6fcafb681683e5189739 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Tue, 8 May 2018 16:17:04 -0700 Subject: [PATCH 71/79] address more of Mike's commments --- .../java/org/jfree/chart/axis/TickUnits.java | 4 ++-- .../jfree/chart/block/ColumnArrangement.java | 2 +- .../jfree/chart/block/FlowArrangement.java | 2 +- .../BoxAndWhiskerXYToolTipGenerator.java | 2 +- .../labels/BubbleXYItemLabelGenerator.java | 2 +- .../labels/HighLowItemLabelGenerator.java | 2 +- .../labels/IntervalXYItemLabelGenerator.java | 2 +- .../labels/IntervalXYToolTipGenerator.java | 2 +- .../labels/StandardXYZToolTipGenerator.java | 2 +- .../renderer/xy/CandlestickRenderer.java | 4 ++-- .../renderer/xy/ClusteredXYBarRenderer.java | 2 +- .../renderer/xy/CyclicXYItemRenderer.java | 8 ++++---- .../chart/renderer/xy/DeviationRenderer.java | 2 +- .../chart/renderer/xy/HighLowRenderer.java | 2 +- .../renderer/xy/StackedXYBarRenderer.java | 2 +- .../chart/renderer/xy/VectorRenderer.java | 2 +- .../chart/renderer/xy/WindItemRenderer.java | 2 +- .../chart/renderer/xy/XYBarRenderer.java | 2 +- .../chart/renderer/xy/XYBlockRenderer.java | 2 +- .../renderer/xy/XYBoxAndWhiskerRenderer.java | 4 ++-- .../chart/renderer/xy/XYBubbleRenderer.java | 2 +- .../chart/renderer/xy/XYErrorRenderer.java | 2 +- .../chart/renderer/xy/XYShapeRenderer.java | 2 +- .../chart/renderer/xy/YIntervalRenderer.java | 2 +- .../jfree/chart/util/AbstractObjectList.java | 6 +++--- .../org/jfree/chart/util/StringUtils.java | 8 +++----- .../jfree/data/ComparableObjectSeries.java | 2 +- .../org/jfree/data/general/DatasetUtils.java | 12 +++++------ src/main/java/org/jfree/data/io/CSV.java | 2 +- .../time/DynamicTimeSeriesCollection.java | 4 ++-- .../java/org/jfree/data/time/TimeSeries.java | 4 ++-- .../jfree/data/xy/CategoryTableXYDataset.java | 4 ++-- .../org/jfree/data/xy/DefaultOHLCDataset.java | 2 +- .../jfree/data/xy/DefaultTableXYDataset.java | 4 ++-- .../java/org/jfree/data/xy/MatrixSeries.java | 2 +- .../java/org/jfree/data/xy/XYBarDataset.java | 20 +++++++++---------- src/main/java/org/jfree/data/xy/XYSeries.java | 4 ++-- 37 files changed, 66 insertions(+), 68 deletions(-) diff --git a/src/main/java/org/jfree/chart/axis/TickUnits.java b/src/main/java/org/jfree/chart/axis/TickUnits.java index e04475dcb..470af2693 100644 --- a/src/main/java/org/jfree/chart/axis/TickUnits.java +++ b/src/main/java/org/jfree/chart/axis/TickUnits.java @@ -128,7 +128,7 @@ public TickUnit get(@NonNegative int pos) { * @return A tick unit that is larger than the supplied unit. */ @Override - @SuppressWarnings("index") // binary search on list + @SuppressWarnings("index") // binary search on list, which SearchIndex does not handle because lists are not fixed-size data structure public TickUnit getLargerTickUnit(TickUnit unit) { int index = Collections.binarySearch(this.tickUnits, unit); if (index >= 0) { @@ -151,7 +151,7 @@ public TickUnit getLargerTickUnit(TickUnit unit) { * @return A unit from the collection. */ @Override - @SuppressWarnings("index") // binary search on list + @SuppressWarnings("index") // binary search on list, which SearchIndex does not handle because lists are not fixed-size data structure public TickUnit getCeilingTickUnit(TickUnit unit) { int index = Collections.binarySearch(this.tickUnits, unit); if (index >= 0) { diff --git a/src/main/java/org/jfree/chart/block/ColumnArrangement.java b/src/main/java/org/jfree/chart/block/ColumnArrangement.java index cc3d6b40d..40a594730 100644 --- a/src/main/java/org/jfree/chart/block/ColumnArrangement.java +++ b/src/main/java/org/jfree/chart/block/ColumnArrangement.java @@ -310,7 +310,7 @@ protected Size2D arrangeRF(BlockContainer container, Graphics2D g2, * * @return The size after the arrangement. */ - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/152 + @SuppressWarnings("index") // @LengthIs https://github.com/kelloggm/checker-framework/issues/152 protected Size2D arrangeNN(BlockContainer container, Graphics2D g2) { double y = 0.0; double height = 0.0; diff --git a/src/main/java/org/jfree/chart/block/FlowArrangement.java b/src/main/java/org/jfree/chart/block/FlowArrangement.java index de5a10355..122f2f981 100644 --- a/src/main/java/org/jfree/chart/block/FlowArrangement.java +++ b/src/main/java/org/jfree/chart/block/FlowArrangement.java @@ -355,7 +355,7 @@ protected Size2D arrangeRN(BlockContainer container, Graphics2D g2, * * @return The size after the arrangement. */ - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/152 + @SuppressWarnings("index") // @LengthIs https://github.com/kelloggm/checker-framework/issues/152 protected Size2D arrangeNN(BlockContainer container, Graphics2D g2) { double x = 0.0; double width = 0.0; diff --git a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java index 87c9d549e..b5d231413 100644 --- a/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BoxAndWhiskerXYToolTipGenerator.java @@ -144,7 +144,7 @@ public BoxAndWhiskerXYToolTipGenerator(String toolTipFormat, if (dataset instanceof BoxAndWhiskerXYDataset) { BoxAndWhiskerXYDataset d = (BoxAndWhiskerXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("d.getSeries(series)") int itemD = item; result[2] = formatter.format(d.getMeanValue(series, itemD)); result[3] = formatter.format(d.getMedianValue(series, itemD)); diff --git a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java index eabaed500..b2ca4b8bb 100644 --- a/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/BubbleXYItemLabelGenerator.java @@ -186,7 +186,7 @@ public String generateLabelString(XYDataset dataset, @NonNegative int series, @I Object[] items; if (dataset instanceof XYZDataset) { XYZDataset xyzDataset = (XYZDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("xyzDataset.getSeries(series)") int item1 = item; items = createItemArray(xyzDataset, series, item1); } diff --git a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java index 8d9bc1ad2..82eb7de10 100644 --- a/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/HighLowItemLabelGenerator.java @@ -128,7 +128,7 @@ public String generateToolTip(XYDataset dataset, @NonNegative int series, @Index } StringBuilder sb = new StringBuilder(); OHLCDataset d = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("d.getSeries(series)") int itemD = item; Number high = d.getHigh(series, itemD); Number low = d.getLow(series, itemD); diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java index 678a9e0c1..f47ff5cc1 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYItemLabelGenerator.java @@ -159,7 +159,7 @@ public IntervalXYItemLabelGenerator(String formatString, @IndexFor("#1.getSeries(#2)") int item) { IntervalXYDataset intervalDataset = null; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("intervalDataset.getSeries(series)") int itemIntervalDataset = item; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; diff --git a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java index 15f11f58c..01be4eef4 100644 --- a/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/IntervalXYToolTipGenerator.java @@ -154,7 +154,7 @@ public IntervalXYToolTipGenerator(String formatString, protected Object@MinLen(7) [] createItemArray(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { IntervalXYDataset intervalDataset = null; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("intervalDataset.getSeries(series)") int itemIntervalDataset = item; if (dataset instanceof IntervalXYDataset) { intervalDataset = (IntervalXYDataset) dataset; diff --git a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java index ed8cd7d28..15c43287f 100644 --- a/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java +++ b/src/main/java/org/jfree/chart/labels/StandardXYZToolTipGenerator.java @@ -178,7 +178,7 @@ public String generateToolTip(XYZDataset dataset, @NonNegative int series, @Inde @Override public String generateLabelString(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { String result; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 Object[] items = createItemArray((XYZDataset) dataset, series, item); result = MessageFormat.format(getFormatString(), items); return result; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java index 77f71ed4f..5cd2b593b 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CandlestickRenderer.java @@ -671,7 +671,7 @@ else if (orientation == PlotOrientation.VERTICAL) { } OHLCDataset highLowData = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("highLowData.getSeries(series)") int highLowItem = item; double x = highLowData.getXValue(series, highLowItem); @@ -732,7 +732,7 @@ else if (orientation == PlotOrientation.VERTICAL) { case WIDTHMETHOD_INTERVALDATA: IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @NonNegative @UpperBoundBottom int intervalXYItem = item; double startPos = domainAxis.valueToJava2D( intervalDataset.getStartXValue(series, intervalXYItem), diff --git a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java index 69fb25e27..3891dfcdc 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/ClusteredXYBarRenderer.java @@ -230,7 +230,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("intervalDataset.getSeries(series)") int intervalXYItem = item; double y0; diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index cc33c97a6..9851bf6ad 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -361,7 +361,7 @@ protected static class OverwriteDataSet implements XYDataset { * @param y the y values. * @param delegateSet the dataset. */ - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 + @SuppressWarnings("index") // SameLen on custom collections requires a suppressed warning to establish representation invariant https://github.com/kelloggm/checker-framework/issues/213 public OverwriteDataSet(double @SameLen("#2") [] x, double @SameLen("#1") [] y, XYDataset delegateSet) { this.delegateSet = delegateSet; @@ -390,7 +390,7 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 + @SuppressWarnings("index") // SameLen to a method with any argument https://github.com/kelloggm/checker-framework/issues/209 public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.x.length; } @@ -404,7 +404,7 @@ public DomainOrder getDomainOrder() { * @return The x-value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 + @SuppressWarnings("index") // SameLen to a method with any argument https://github.com/kelloggm/checker-framework/issues/209 public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.x[item]; } @@ -437,7 +437,7 @@ public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") * @return The y-value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 + @SuppressWarnings("index") // SameLen to a method with any argument https://github.com/kelloggm/checker-framework/issues/209 public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.y[item]; } diff --git a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java index 19b48488b..cb9d837f3 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/DeviationRenderer.java @@ -286,7 +286,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (pass == 0) { IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("intervalDataset.getSeries(series)") int intervalXYItem = item; State drState = (State) state; diff --git a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java index aa1e2e6bb..7856c0752 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/HighLowRenderer.java @@ -351,7 +351,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (dataset instanceof OHLCDataset) { OHLCDataset hld = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209 + @SuppressWarnings("index") // SameLen to a method with any argument https://github.com/kelloggm/checker-framework/issues/209 @IndexFor("hld.getSeries(series)") int hldItem = item; double yHigh = hld.getHighValue(series, hldItem); diff --git a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java index e41625502..850cc8790 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/StackedXYBarRenderer.java @@ -267,7 +267,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("intervalDataset.getSeries(series)") int intervalXYItem = item; double value = intervalDataset.getYValue(series, intervalXYItem); if (Double.isNaN(value)) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java index 9528f85aa..a72c41360 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/VectorRenderer.java @@ -234,7 +234,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double dy = 0.0; if (dataset instanceof VectorXYDataset) { VectorXYDataset vectorXYDataset = (VectorXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("vectorXYDataset.getSeries(series)") int vectorXYItem = item; dx = vectorXYDataset.getVectorXValue(series, vectorXYItem); dy = vectorXYDataset.getVectorYValue(series, vectorXYItem); diff --git a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java index 7b1ddbaef..6c77824d5 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/WindItemRenderer.java @@ -125,7 +125,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, @NonNegative int series, @IndexFor("#8.getSeries(#9)") int item, CrosshairState crosshairState, int pass) { WindDataset windData = (WindDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("windData.getSeries(series)") int windItem = item; Paint seriesPaint = getItemPaint(series, item); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java index 43e7f5cb6..762a8c043 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBarRenderer.java @@ -815,7 +815,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("intervalDataset.getSeries(series)") int intervalItem = item; double value0; diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java index 03b818d5c..c48c6900c 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBlockRenderer.java @@ -410,7 +410,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, double z = 0.0; if (dataset instanceof XYZDataset) { XYZDataset xyzDataset = ((XYZDataset) dataset); - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("xyzDataset.getSeries(series)") int xyzItem = item; z = xyzDataset.getZValue(series, xyzItem); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java index e014f217d..ea4ab6377 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBoxAndWhiskerRenderer.java @@ -390,7 +390,7 @@ public void drawHorizontalItem(Graphics2D g2, Rectangle2D dataArea, BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("boxAndWhiskerData.getSeries(series)") int boxAndWhiskerItem = item; Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); @@ -533,7 +533,7 @@ public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("boxAndWhiskerData.getSeries(series)") int boxAndWhiskerItem = item; Number x = boxAndWhiskerData.getX(series, boxAndWhiskerItem); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java index 3ec519cef..a34581c37 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYBubbleRenderer.java @@ -196,7 +196,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, if (dataset instanceof XYZDataset) { XYZDataset xyzData = (XYZDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("xyzData.getSeries(series)") int xyzItem = item; z = xyzData.getZValue(series, xyzItem); } diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java index 7a065c27a..2b603deba 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYErrorRenderer.java @@ -314,7 +314,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, && getItemVisible(series, item)) { IntervalXYDataset ixyd = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("ixyd.getSeries(series)") int ixydItem = item; PlotOrientation orientation = plot.getOrientation(); diff --git a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java index 5b6f89011..c3d423bb4 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/XYShapeRenderer.java @@ -518,7 +518,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, protected Paint getPaint(XYDataset dataset, @NonNegative int series, @IndexFor("#1.getSeries(#2)") int item) { Paint p; if (dataset instanceof XYZDataset) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 double z = ((XYZDataset) dataset).getZValue(series, item); p = this.paintScale.getPaint(z); } else { diff --git a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java index 96961d7b8..cd584e738 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/YIntervalRenderer.java @@ -196,7 +196,7 @@ public void drawItem(Graphics2D g2, XYItemRendererState state, } IntervalXYDataset intervalDataset = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 @IndexFor("intervalDataset.getSeries(series)") int intervalItem = item; double x = intervalDataset.getXValue(series, intervalItem); diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index b46572b90..991ebd5ce 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -116,9 +116,9 @@ protected void set(@NonNegative int index, Object object) { } if (index >= this.objects.length) { Object[] enlarged = new Object[index + this.increment]; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/176 - @LTLengthOf(value={"this.objects", "enlarged"}, offset={"0 - 1", "0 - 1"}) int tmp = this.objects.length; - System.arraycopy(this.objects, 0, enlarged, 0, tmp); + //@SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/176 + //@LTLengthOf(value={"this.objects", "enlarged"}, offset={"0 - 1", "0 - 1"}) int tmp = this.objects.length; + System.arraycopy(this.objects, 0, enlarged, 0, this.objects.length); this.objects = enlarged; } @SuppressWarnings("index") // if index wasn't large enough before, this.objects was enlarged by the code above diff --git a/src/main/java/org/jfree/chart/util/StringUtils.java b/src/main/java/org/jfree/chart/util/StringUtils.java index 4b17399ef..2f37a13c2 100644 --- a/src/main/java/org/jfree/chart/util/StringUtils.java +++ b/src/main/java/org/jfree/chart/util/StringUtils.java @@ -65,13 +65,11 @@ public static boolean startsWithIgnoreCase(String base, String start) { * @return true, if the string ends with the given ending text. */ public static boolean endsWithIgnoreCase(String base, String end) { - if (base.length() < end.length()) { + int baseLen = base.length(); + if (baseLen < end.length()) { return false; } - - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/154 - @NonNegative int toffset = base.length() - end.length(); - return base.regionMatches(true, toffset, end, 0, end.length()); + return base.regionMatches(true, baseLen - end.length(), end, 0, end.length()); } /** diff --git a/src/main/java/org/jfree/data/ComparableObjectSeries.java b/src/main/java/org/jfree/data/ComparableObjectSeries.java index c45eb0a15..d70daedad 100644 --- a/src/main/java/org/jfree/data/ComparableObjectSeries.java +++ b/src/main/java/org/jfree/data/ComparableObjectSeries.java @@ -221,7 +221,7 @@ protected void add(ComparableObjectItem item, boolean notify) { if (this.autoSort) { int index = Collections.binarySearch(this.data, item); if (index < 0) { - @SuppressWarnings("index") // binary search on list + @SuppressWarnings("index") // binary search on list, which SearchIndex does not handle because lists are not fixed-size data structure @NonNegative int reverseIndex = -index - 1; this.data.add(reverseIndex, item); } diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index a51060b93..16e8d8a83 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -1639,7 +1639,7 @@ public static Number findMinimumDomainValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = intervalXYData.getStartXValue(series, item); value = valueTmp; } @@ -1696,7 +1696,7 @@ public static Number findMaximumDomainValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = intervalXYData.getEndXValue(series, item); value = valueTmp; } @@ -1805,13 +1805,13 @@ public static Number findMinimumRangeValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = intervalXYData.getStartYValue(series, item); value = valueTmp; } else if (dataset instanceof OHLCDataset) { OHLCDataset highLowData = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = highLowData.getLowValue(series, item); value = valueTmp; } @@ -1922,13 +1922,13 @@ public static Number findMaximumRangeValue(XYDataset dataset) { if (dataset instanceof IntervalXYDataset) { IntervalXYDataset intervalXYData = (IntervalXYDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = intervalXYData.getEndYValue(series, item); value = valueTmp; } else if (dataset instanceof OHLCDataset) { OHLCDataset highLowData = (OHLCDataset) dataset; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 double valueTmp = highLowData.getHighValue(series, item); value = valueTmp; } diff --git a/src/main/java/org/jfree/data/io/CSV.java b/src/main/java/org/jfree/data/io/CSV.java index 2937b4ccc..4f7c86b8b 100644 --- a/src/main/java/org/jfree/data/io/CSV.java +++ b/src/main/java/org/jfree/data/io/CSV.java @@ -130,7 +130,7 @@ private List extractColumnKeys(String line) { if (line.charAt(i) == this.fieldDelimiter) { if (fieldIndex > 0) { // first field is ignored, since // column 0 is for row keys - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/138 + @SuppressWarnings("index") // MinLen type refinement in for loop https://github.com/kelloggm/checker-framework/issues/138 String key = line.substring(start, i); keys.add(removeStringDelimiters(key)); } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 39583aba7..5ad6c72bc 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -148,7 +148,7 @@ public ValueSequence() { * @param length the length. */ public ValueSequence(@NonNegative int length) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 + @SuppressWarnings("index") // SameLen on custom collections requires a suppressed warning to establish representation invariant https://github.com/kelloggm/checker-framework/issues/213 float @SameLen("this") [] dataPointsTmp = new float[length]; this.dataPoints = dataPointsTmp; for (int i = 0; i < length; i++) { @@ -502,7 +502,7 @@ public void addValue(@NonNegative int seriesNumber, @IndexFor("this.getSeries(#1 * @return The item count. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209: I'd like to write SameLen on this.pointsInTime + @SuppressWarnings("index") // SameLen to a method with any argument https://github.com/kelloggm/checker-framework/issues/209: I'd like to write SameLen on this.pointsInTime public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { // all arrays equal length, // so ignore argument: return this.historyCount; diff --git a/src/main/java/org/jfree/data/time/TimeSeries.java b/src/main/java/org/jfree/data/time/TimeSeries.java index 53dcaa202..216ac82f3 100644 --- a/src/main/java/org/jfree/data/time/TimeSeries.java +++ b/src/main/java/org/jfree/data/time/TimeSeries.java @@ -696,7 +696,7 @@ else if (!this.timePeriodClass.equals(c)) { else { int index = Collections.binarySearch(this.data, item); if (index < 0) { - @SuppressWarnings("index") // binary search on list + @SuppressWarnings("index") // binary search on list, which SearchIndex does not handle because lists are not fixed-size data structure @NonNegative int index1 = -index - 1; this.data.add(index1, item); added = true; @@ -947,7 +947,7 @@ else if (item.getValue() != null) { } else { item = (TimeSeriesDataItem) item.clone(); - @SuppressWarnings("index") // binary search on list + @SuppressWarnings("index") // binary search on list, which SearchIndex does not handle because lists are not fixed-size data structure @NonNegative int index1 = -index - 1; this.data.add(index1, item); updateBoundsForAddedItem(item); diff --git a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java index d7db4aceb..69dc5d955 100644 --- a/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/CategoryTableXYDataset.java @@ -227,7 +227,7 @@ public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int * @return The starting X value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getStartX(series, item); } @@ -241,7 +241,7 @@ public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") * @return The ending X value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getEndX(series, item); } diff --git a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java index d189651ed..d1a87d579 100644 --- a/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultOHLCDataset.java @@ -319,7 +319,7 @@ public double getVolumeValue(@NonNegative int series, @IndexFor("this.getSeries( * @return The item count. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/209: this.data is the same length as the conceptual getSeries called with any argument, but no SameLen annotation can express that due to the argument needed for getSeries + @SuppressWarnings("index") // SameLen to a method with any argument https://github.com/kelloggm/checker-framework/issues/209: this.data is the same length as the conceptual getSeries called with any argument, but no SameLen annotation can express that due to the argument needed for getSeries public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.data.length; } diff --git a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java index 9b150d85f..531c577f6 100644 --- a/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultTableXYDataset.java @@ -300,7 +300,7 @@ public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int * @return The starting X value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getStartX(series, item); } @@ -314,7 +314,7 @@ public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") * @return The ending X value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212: interval delegate and this.getSeries have the same conceptual length public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.intervalDelegate.getEndX(series, item); } diff --git a/src/main/java/org/jfree/data/xy/MatrixSeries.java b/src/main/java/org/jfree/data/xy/MatrixSeries.java index 6487e5cfb..033203eac 100644 --- a/src/main/java/org/jfree/data/xy/MatrixSeries.java +++ b/src/main/java/org/jfree/data/xy/MatrixSeries.java @@ -75,7 +75,7 @@ public class MatrixSeries extends Series implements Serializable { * @param rows the number of rows. * @param columns the number of columns. */ - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/213 + @SuppressWarnings("index") // SameLen on custom collections requires a suppressed warning to establish representation invariant https://github.com/kelloggm/checker-framework/issues/213 public MatrixSeries(String name, @NonNegative int rows, @NonNegative int columns) { super(name); this.data = new double[rows][columns]; diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index 3273fe47e..d2878b4dd 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -126,7 +126,7 @@ public void setBarWidth(double barWidth) { * @return The series count. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public @NonNegative int getSeriesCount() { return this.underlying.getSeriesCount(); } @@ -152,7 +152,7 @@ public Comparable getSeriesKey(@NonNegative int series) { * @return The item count. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.underlying.getItemCount(series); } @@ -168,7 +168,7 @@ public Comparable getSeriesKey(@NonNegative int series) { * @see #getXValue(int, int) */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getX(series, item); } @@ -184,7 +184,7 @@ public Number getX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int * @see #getX(int, int) */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getXValue(series, item); } @@ -200,7 +200,7 @@ public double getXValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") * @see #getYValue(int, int) */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getY(series, item); } @@ -216,7 +216,7 @@ public Number getY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int * @see #getY(int, int) */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getYValue(series, item); } @@ -230,7 +230,7 @@ public double getYValue(@NonNegative int series, @IndexFor("this.getSeries(#1)") * @return The value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public Number getStartX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; Number xnum = this.underlying.getX(series, item); @@ -265,7 +265,7 @@ public double getStartXValue(@NonNegative int series, @IndexFor("this.getSeries( * @return The value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public Number getEndX(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { Number result = null; Number xnum = this.underlying.getX(series, item); @@ -300,7 +300,7 @@ public double getEndXValue(@NonNegative int series, @IndexFor("this.getSeries(#1 * @return The value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public Number getStartY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getY(series, item); } @@ -330,7 +330,7 @@ public double getStartYValue(@NonNegative int series, @IndexFor("this.getSeries( * @return The value. */ @Override - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/212 + @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public Number getEndY(@NonNegative int series, @IndexFor("this.getSeries(#1)") int item) { return this.underlying.getY(series, item); } diff --git a/src/main/java/org/jfree/data/xy/XYSeries.java b/src/main/java/org/jfree/data/xy/XYSeries.java index 0ecfaa457..044a61f8e 100644 --- a/src/main/java/org/jfree/data/xy/XYSeries.java +++ b/src/main/java/org/jfree/data/xy/XYSeries.java @@ -513,7 +513,7 @@ public void add(XYDataItem item, boolean notify) { if (this.autoSort) { int index = Collections.binarySearch(this.data, item); if (index < 0) { - @SuppressWarnings("index") // binary search on list + @SuppressWarnings("index") // binary search on list, which SearchIndex does not handle because lists are not fixed-size data structure @NonNegative int newIndex = -index - 1; this.data.add(newIndex, item); } @@ -827,7 +827,7 @@ else if (item.getY() != null) { // append the value to the list... item = (XYDataItem) item.clone(); if (this.autoSort) { - @SuppressWarnings("index") // binary search on list + @SuppressWarnings("index") // binary search on list, which SearchIndex does not handle because lists are not fixed-size data structure @NonNegative int addIndex = -index - 1; this.data.add(addIndex, item); } From b24c696ff32af804a4d8b410f06f0d96eef5291e Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Tue, 8 May 2018 17:16:01 -0700 Subject: [PATCH 72/79] more changes to address Mike's comments --- .../org/jfree/chart/axis/MonthDateFormat.java | 2 +- .../java/org/jfree/chart/date/SerialDate.java | 30 ++++++++----------- .../jfree/chart/util/AbstractObjectList.java | 6 ++-- .../gantt/SlidingGanttCategoryDataset.java | 7 ++--- src/main/java/org/jfree/data/time/Day.java | 2 +- .../time/DynamicTimeSeriesCollection.java | 14 ++++----- 6 files changed, 27 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java index f66ab0713..19647e95d 100644 --- a/src/main/java/org/jfree/chart/axis/MonthDateFormat.java +++ b/src/main/java/org/jfree/chart/axis/MonthDateFormat.java @@ -172,7 +172,7 @@ public MonthDateFormat(TimeZone zone, Locale locale, int chars, String[] monthsFromLocale = dfs.getMonths(); this.months = new String[12]; for (int i = 0; i < 12; i++) { - @SuppressWarnings({"index", "value"}) // https://github.com/typetools/checker-framework/issues/1669 + @SuppressWarnings({"index", "value"}) // loop index is bounded by loop https://github.com/typetools/checker-framework/issues/1669 @IntRange(from = 0, to = 11) int i1 = i; if (chars > 0) { this.months[i1] = monthsFromLocale[i1].substring(0, diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index c4f0d2808..46e5c90d0 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -223,7 +223,7 @@ public static int stringToWeekdayCode(String s) { final String[] shortWeekdayNames = DATE_FORMAT_SYMBOLS.getShortWeekdays(); - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/179 + @SuppressWarnings("index") // SameLen checker could use the Value Checker https://github.com/kelloggm/checker-framework/issues/179 final String @SameLen("shortWeekdayNames") [] weekDayNames = DATE_FORMAT_SYMBOLS.getWeekdays(); int result = -1; @@ -352,7 +352,7 @@ public static boolean isValidMonthCode(int code) { * * @return a string representing the supplied month. */ - public static String monthCodeToString(@IntRange(from=1, to=12) int month) { + public static String monthCodeToString(@IntRange(from = 1, to = 12) int month) { return monthCodeToString(month, false); } @@ -367,7 +367,7 @@ public static String monthCodeToString(@IntRange(from=1, to=12) int month) { * * @return a string representing the supplied month. */ - public static String monthCodeToString(@IntRange(from=1, to=12) int month, boolean shortened) { + public static String monthCodeToString(@IntRange(from = 1, to = 12) int month, boolean shortened) { // check arguments... if (!isValidMonthCode(month)) { @@ -378,12 +378,10 @@ public static String monthCodeToString(@IntRange(from=1, to=12) int month, boole final String @ArrayLen(13) [] months; if (shortened) { - final String[] monthsTmp = DATE_FORMAT_SYMBOLS.getShortMonths(); - months = monthsTmp; + months = DATE_FORMAT_SYMBOLS.getShortMonths(); } else { - final String[] monthsTmp = DATE_FORMAT_SYMBOLS.getMonths(); - months = monthsTmp; + months = DATE_FORMAT_SYMBOLS.getMonths(); } return months[month - 1]; @@ -405,8 +403,7 @@ public static String monthCodeToString(@IntRange(from=1, to=12) int month, boole public static @IntRange(from = -1, to = 12) int stringToMonthCode(String s) { final String[] shortMonthNames = DATE_FORMAT_SYMBOLS.getShortMonths(); - @SuppressWarnings("index") // Need annotations on Date Format Symbols - final String @SameLen("shortMonthNames") [] monthNames = DATE_FORMAT_SYMBOLS.getMonths(); + final String[] monthNames = DATE_FORMAT_SYMBOLS.getMonths(); int result = -1; s = s.trim(); @@ -492,8 +489,8 @@ else if ((yyyy % 100) == 0) { * * @return the number of leap years from 1900 to the specified year (if year is 9999, 1964 leap years). */ - @SuppressWarnings({"index", "value"}) // imprecision wrt ranges - public static @IntRange(from = 0, to = 1964) int leapYearCount(@IntRange(from = 1900, to = 9999)int yyyy) { + @SuppressWarnings({"index", "value"}) // The Value Checker loses some precision here, I believe due to imprecise estimation of division on ranges + public static @IntRange(from = 0, to = 1964) int leapYearCount(@IntRange(from = 1900, to = 9999) int yyyy) { int leap4 = (yyyy - 1896) / 4; int leap100 = (yyyy - 1800) / 100; int leap400 = (yyyy - 1600) / 400; @@ -510,7 +507,7 @@ else if ((yyyy % 100) == 0) { * @return the number of the last day of the month. */ @SuppressWarnings({"index", "value"}) // February has 28 days, so 1 is only added to 28, not 31. - public static @IntRange(from = 28, to = 31) int lastDayOfMonth(@IntRange(from=1, to=12) int month, int yyyy) { + public static @IntRange(from = 28, to = 31) int lastDayOfMonth(@IntRange(from = 1, to = 12) int month, int yyyy) { final int result = LAST_DAY_OF_MONTH[month]; if (month != FEBRUARY) { @@ -552,17 +549,15 @@ public static SerialDate addDays(int days, SerialDate base) { * * @return a new date. */ - @SuppressWarnings({"index", "value"}) // True positive, fixed upstream bug public static SerialDate addMonths(int months, SerialDate base) { int yy = (12 * base.getYYYY() + base.getMonth() + months - 1) / 12; if (yy < MINIMUM_YEAR_SUPPORTED || yy > MAXIMUM_YEAR_SUPPORTED) { throw new IllegalArgumentException("Call to addMonths resulted in unsupported year"); } int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1; - int lastDayOfMonth = SerialDate.lastDayOfMonth(mm, yy); - @SuppressWarnings({"index", "value"}) // https://github.com/typetools/checker-framework/issues/1687 + @SuppressWarnings({"index", "value"}) // Value Checker support for Math#min and Math#max https://github.com/typetools/checker-framework/issues/1687 @IntRange(from = 1, to = 31) int dd = Math.min(base.getDayOfMonth(), - lastDayOfMonth); + SerialDate.lastDayOfMonth(mm, yy)); return SerialDate.createInstance(dd, mm, yy); } @@ -575,7 +570,6 @@ public static SerialDate addMonths(int months, SerialDate base) { * * @return A new date. */ - @SuppressWarnings({"index", "value"}) // True positive, fixed upstream bug public static SerialDate addYears(int years, SerialDate base) { int baseY = base.getYYYY(); int baseM = base.getMonth(); @@ -840,7 +834,7 @@ public String toString() { * * @return the month of the year. */ - public abstract @IntRange(from=1, to=12) int getMonth(); + public abstract @IntRange(from = 1, to = 12) int getMonth(); /** * Returns the day of the month. diff --git a/src/main/java/org/jfree/chart/util/AbstractObjectList.java b/src/main/java/org/jfree/chart/util/AbstractObjectList.java index 991ebd5ce..8ce3fdc0d 100644 --- a/src/main/java/org/jfree/chart/util/AbstractObjectList.java +++ b/src/main/java/org/jfree/chart/util/AbstractObjectList.java @@ -116,9 +116,9 @@ protected void set(@NonNegative int index, Object object) { } if (index >= this.objects.length) { Object[] enlarged = new Object[index + this.increment]; - //@SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/176 - //@LTLengthOf(value={"this.objects", "enlarged"}, offset={"0 - 1", "0 - 1"}) int tmp = this.objects.length; - System.arraycopy(this.objects, 0, enlarged, 0, this.objects.length); + @SuppressWarnings("index") // this.objects.length <= index <= enlarged.length + @LTLengthOf(value={"this.objects", "enlarged"}, offset={"-1", "-1"}) int objectsLen = this.objects.length; + System.arraycopy(this.objects, 0, enlarged, 0, objectsLen); this.objects = enlarged; } @SuppressWarnings("index") // if index wasn't large enough before, this.objects was enlarged by the code above diff --git a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java index f7f5974c9..87471baef 100644 --- a/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java +++ b/src/main/java/org/jfree/data/gantt/SlidingGanttCategoryDataset.java @@ -176,10 +176,9 @@ public void setMaximumCategoryCount(@NonNegative int max) { @Override public @GTENegativeOne int getColumnIndex(Comparable key) { int index = this.underlying.getColumnIndex(key); - if (index >= this.firstCategoryIndex && index <= lastCategoryIndex()) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158 - @NonNegative int result = index - this.firstCategoryIndex; - return result; + int firstCategoryIndex = this.firstCategoryIndex; + if (index >= firstCategoryIndex && index <= lastCategoryIndex()) { + return index - firstCategoryIndex; } return -1; // we didn't find the key } diff --git a/src/main/java/org/jfree/data/time/Day.java b/src/main/java/org/jfree/data/time/Day.java index 252697d6f..77e1a5f42 100644 --- a/src/main/java/org/jfree/data/time/Day.java +++ b/src/main/java/org/jfree/data/time/Day.java @@ -207,7 +207,7 @@ public SerialDate getSerialDate() { * * @return The month. */ - public @IntRange(from=1, to=12) int getMonth() { + public @IntRange(from = 1, to = 12) int getMonth() { return this.serialDate.getMonth(); } diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 5ad6c72bc..860873055 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -428,7 +428,7 @@ public void addSeries(float[] values, @NonNegative int seriesNumber, } if (fillNeeded) { for (i = copyLength; i < this.historyCount; i++) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + @SuppressWarnings("index") // String array bug https://github.com/kelloggm/checker-framework/issues/205 @LTLengthOf("this.valueHistory[seriesNumber]") int i0 = i; this.valueHistory[seriesNumber].enterData(i0, 0.0f); } @@ -474,7 +474,7 @@ public void addValue(@NonNegative int seriesNumber, @IndexFor("this.getSeries(#1 // But if that series array already exists, just overwrite its contents //synchronized(this) //{ - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + @SuppressWarnings("index") // String array bug https://github.com/kelloggm/checker-framework/issues/205 @LTLengthOf("this.valueHistory[seriesNumber]") int index0 = index; this.valueHistory[seriesNumber].enterData(index0, value); //} @@ -594,7 +594,7 @@ public synchronized RegularTimePeriod advanceTime() { oldMax = this.maxValue.floatValue(); } for (int s = 0; s < getSeriesCount(); s++) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + @SuppressWarnings("index") // String array bug https://github.com/kelloggm/checker-framework/issues/205 @LTLengthOf("this.valueHistory[s]") int oldestAt = this.oldestAt; if (this.valueHistory[s].getData(oldestAt) == oldMax) { extremaChanged = true; @@ -609,7 +609,7 @@ public synchronized RegularTimePeriod advanceTime() { // wipe the next (about to be used) set of data slots float wiper = (float) 0.0; for (int s = 0; s < getSeriesCount(); s++) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + @SuppressWarnings("index") // String array bug https://github.com/kelloggm/checker-framework/issues/205 @LTLengthOf("this.valueHistory[s]") int newestAt = this.newestAt; this.valueHistory[s].enterData(newestAt, wiper); } @@ -654,7 +654,7 @@ protected double findMaxValue() { double max = 0.0f; for (int s = 0; s < getSeriesCount(); s++) { for (int i = 0; i < this.historyCount; i++) { - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + @SuppressWarnings("index") // String array bug https://github.com/kelloggm/checker-framework/issues/205 @LTLengthOf("this.getSeries(s)") int i0 = i; double tmp = getYValue(s, i0); if (tmp > max) { @@ -707,7 +707,7 @@ public void appendData(float[] newData) { @SameLen("this.pointsInTime") ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + @SuppressWarnings("index") // String array bug https://github.com/kelloggm/checker-framework/issues/205 @LTLengthOf("this.valueHistory[s]") int newestAt = this.newestAt; this.valueHistory[s].enterData(newestAt, newData[s]); } @@ -734,7 +734,7 @@ public void appendData(float[] newData, final @IndexFor("this.pointsInTime") int @SameLen("this.pointsInTime") ValueSequence valueSequence = new ValueSequence(this.historyCount); this.valueHistory[s] = valueSequence; } - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/205 + @SuppressWarnings("index") // String array bug https://github.com/kelloggm/checker-framework/issues/205 @LTLengthOf("this.valueHistory[s]") int insertionIndex0 = insertionIndex; this.valueHistory[s].enterData(insertionIndex0, newData[s]); } From 2514371311d2b06f1ce91e8a1d9a9662c6c709e2 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Wed, 9 May 2018 12:47:31 -0700 Subject: [PATCH 73/79] add a second extra argument because Maven is bad --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 9635345cc..10406cd8e 100644 --- a/pom.xml +++ b/pom.xml @@ -111,6 +111,7 @@ <arg>-Xbootclasspath/p:${annotatedJdk}</arg> <arg>-AskipDefs=Test</arg> <arg>${checkerframework.extraargs}</arg> + <arg>${checkerframework.extraargs2}</arg> <!-- Uncomment the following line to turn type-checking warnings into errors. --> <!-- <arg>-Awarns</arg> --> </compilerArgs> @@ -209,6 +210,7 @@ <!-- These properties are here for convenience when modifying the build from the command line --> <checkerframework.checkers>org.checkerframework.checker.index.IndexChecker</checkerframework.checkers> <checkerframework.extraargs></checkerframework.extraargs> + <checkerframework.extraargs2></checkerframework.extraargs2> </properties> <profiles> From 5632a20a22e2e8fb1bdc251681e2bdcb6d7d9899 Mon Sep 17 00:00:00 2001 From: Martin Kellogg <kelloggm@cs.washington.edu> Date: Wed, 9 May 2018 17:17:15 -0700 Subject: [PATCH 74/79] minor fixes --- src/main/java/org/jfree/chart/date/SerialDate.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jfree/chart/date/SerialDate.java b/src/main/java/org/jfree/chart/date/SerialDate.java index 46e5c90d0..61c4c7585 100644 --- a/src/main/java/org/jfree/chart/date/SerialDate.java +++ b/src/main/java/org/jfree/chart/date/SerialDate.java @@ -403,7 +403,8 @@ public static String monthCodeToString(@IntRange(from = 1, to = 12) int month, b public static @IntRange(from = -1, to = 12) int stringToMonthCode(String s) { final String[] shortMonthNames = DATE_FORMAT_SYMBOLS.getShortMonths(); - final String[] monthNames = DATE_FORMAT_SYMBOLS.getMonths(); + @SuppressWarnings("index") // DateFormatSymbols can't be annotated correctly because of https://github.com/kelloggm/checker-framework/issues/223 + final String @SameLen("shortMonthNames") [] monthNames = DATE_FORMAT_SYMBOLS.getMonths(); int result = -1; s = s.trim(); @@ -554,10 +555,10 @@ public static SerialDate addMonths(int months, SerialDate base) { if (yy < MINIMUM_YEAR_SUPPORTED || yy > MAXIMUM_YEAR_SUPPORTED) { throw new IllegalArgumentException("Call to addMonths resulted in unsupported year"); } - int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1; + @SuppressWarnings({"index", "value"}) // if months is negative, then yy would be out of range and the exception above is thrown. + @IntRange(from = 1, to = 12) int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1; @SuppressWarnings({"index", "value"}) // Value Checker support for Math#min and Math#max https://github.com/typetools/checker-framework/issues/1687 - @IntRange(from = 1, to = 31) int dd = Math.min(base.getDayOfMonth(), - SerialDate.lastDayOfMonth(mm, yy)); + @IntRange(from = 1, to = 31) int dd = Math.min(base.getDayOfMonth(), SerialDate.lastDayOfMonth(mm, yy)); return SerialDate.createInstance(dd, mm, yy); } @@ -579,7 +580,8 @@ public static SerialDate addYears(int years, SerialDate base) { if (targetY < MINIMUM_YEAR_SUPPORTED || targetY > MAXIMUM_YEAR_SUPPORTED) { throw new IllegalArgumentException("Call to addYears resulted in unsupported year"); } - int targetD = Math.min(baseD, SerialDate.lastDayOfMonth(baseM, targetY)); + @SuppressWarnings({"index", "value"}) // Value Checker support for Math#min and Math#max https://github.com/typetools/checker-framework/issues/1687 + @IntRange(from = 1, to = 31) int targetD = Math.min(baseD, SerialDate.lastDayOfMonth(baseM, targetY)); return SerialDate.createInstance(targetD, baseM, targetY); } From 4d42a42158dddeb6dce59a95a26cda3cd88b5e3f Mon Sep 17 00:00:00 2001 From: Suzanne Millstein <smillst@cs.washington.edu> Date: Tue, 22 May 2018 10:52:09 -0700 Subject: [PATCH 75/79] Work on Guaranteed index false positives. 1. Remove two warning suppressions that aren't required. (One required more annotations.) 2. Added "rewrite" to 14 of the false positives that could be fixed by using Map.Entry. --- .../java/org/jfree/chart/plot/CategoryPlot.java | 14 +++++++------- src/main/java/org/jfree/chart/plot/PolarPlot.java | 15 ++++++--------- src/main/java/org/jfree/chart/plot/XYPlot.java | 14 +++++++------- .../java/org/jfree/data/general/DatasetUtils.java | 1 - 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 80eb3e740..738193e42 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -2193,7 +2193,7 @@ public LegendItemCollection getLegendItems() { // get the legend items for the datasets... for (CategoryDataset dataset: this.datasets.values()) { if (dataset != null) { - @SuppressWarnings("index") // guaranteed index: indexOf cannot return -1 here because we're looking up the indexOf an element we already know is in the dataset + @SuppressWarnings("index") // rewrite guaranteed index: indexOf cannot return -1 here because we're looking up the indexOf an element we already know is in the dataset @NonNegative int datasetIndex = indexOf(dataset); CategoryItemRenderer renderer = getRenderer(datasetIndex); if (renderer != null) { @@ -3405,7 +3405,7 @@ protected AxisSpace calculateDomainAxisSpace(Graphics2D g2, // reserve space for any domain axes... for (CategoryAxis xAxis : this.domainAxes.values()) { if (xAxis != null) { - @SuppressWarnings("index") // guaranteed index: xAxis is guaranteed to be in the set, so IndexOf returns NN + @SuppressWarnings("index") // rewrite guaranteed index: xAxis is guaranteed to be in the set, so IndexOf returns NN @NonNegative int i = getDomainAxisIndex(xAxis); RectangleEdge edge = getDomainAxisEdge(i); space = xAxis.reserveSpace(g2, this, plotArea, edge, space); @@ -3450,7 +3450,7 @@ protected AxisSpace calculateRangeAxisSpace(Graphics2D g2, // reserve space for the range axes (if any)... for (ValueAxis yAxis : this.rangeAxes.values()) { if (yAxis != null) { - @SuppressWarnings("index") // guaranteed index: yAxis is guaranteed to be in the set, so indexOf returns NN + @SuppressWarnings("index") // rewrite guaranteed index: yAxis is guaranteed to be in the set, so indexOf returns NN @NonNegative int i = findRangeAxisIndex(yAxis); RectangleEdge edge = getRangeAxisEdge(i); space = yAxis.reserveSpace(g2, this, plotArea, edge, space); @@ -3619,12 +3619,12 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw the markers... for (CategoryItemRenderer renderer : this.renderers.values()) { - @SuppressWarnings("index") // guaranteed index: renderer is one of the renderers of this object, so getIndexOf must return nonnegative + @SuppressWarnings("index") // rewrite guaranteed index: renderer is one of the renderers of this object, so getIndexOf must return nonnegative @NonNegative int i = getIndexOf(renderer); drawDomainMarkers(g2, dataArea, i, Layer.BACKGROUND); } for (CategoryItemRenderer renderer : this.renderers.values()) { - @SuppressWarnings("index") // guaranteed index: renderer is one of the renderers of this object, so getIndexOf must return nonnegative + @SuppressWarnings("index") // rewrite guaranteed index: renderer is one of the renderers of this object, so getIndexOf must return nonnegative @NonNegative int i = getIndexOf(renderer); drawRangeMarkers(g2, dataArea, i, Layer.BACKGROUND); } @@ -3803,7 +3803,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add domain axes to lists... for (CategoryAxis xAxis : this.domainAxes.values()) { if (xAxis != null) { - @SuppressWarnings("index") // guaranteed index: xAxis is guaranteed to have an index, so getDomainAxisIndex return NN + @SuppressWarnings("index") // rewrite guaranteed index: xAxis is guaranteed to have an index, so getDomainAxisIndex return NN @NonNegative int index = getDomainAxisIndex(xAxis); axisCollection.add(xAxis, getDomainAxisEdge(index)); } @@ -3812,7 +3812,7 @@ protected Map drawAxes(Graphics2D g2, Rectangle2D plotArea, // add range axes to lists... for (ValueAxis yAxis : this.rangeAxes.values()) { if (yAxis != null) { - @SuppressWarnings("index") // guaranteed index: yAxis is guaranteed to have an index, so getRangeAxisIndex return NN + @SuppressWarnings("index") // rewrite guaranteed index: yAxis is guaranteed to have an index, so getRangeAxisIndex return NN @NonNegative int index = findRangeAxisIndex(yAxis); axisCollection.add(yAxis, getRangeAxisEdge(index)); } diff --git a/src/main/java/org/jfree/chart/plot/PolarPlot.java b/src/main/java/org/jfree/chart/plot/PolarPlot.java index 546ce2ef2..43940aefb 100644 --- a/src/main/java/org/jfree/chart/plot/PolarPlot.java +++ b/src/main/java/org/jfree/chart/plot/PolarPlot.java @@ -259,7 +259,7 @@ public class PolarPlot extends Plot implements ValueAxisPlot, Zoomable, * entry for a dataset, it is assumed to map to the primary domain axis * (index = 0). */ - private Map datasetToAxesMap; + private Map<@NonNegative Integer, List<@NonNegative Integer>> datasetToAxesMap; /** * Default constructor. @@ -288,7 +288,7 @@ public PolarPlot(XYDataset dataset, ValueAxis radiusAxis, this.angleTickUnit = new NumberTickUnit(DEFAULT_ANGLE_TICK_UNIT_SIZE); this.axes = new ObjectList(); - this.datasetToAxesMap = new TreeMap(); + this.datasetToAxesMap = new TreeMap<>(); this.axes.set(0, radiusAxis); if (radiusAxis != null) { radiusAxis.setPlot(this); @@ -1250,13 +1250,12 @@ public void mapDatasetToAxis(@NonNegative int index, int axisIndex) { * * @since 1.0.14 */ - public void mapDatasetToAxes(@NonNegative int index, List axisIndices) { + public void mapDatasetToAxes(@NonNegative int index, List<@NonNegative Integer> axisIndices) { if (index < 0) { throw new IllegalArgumentException("Requires 'index' >= 0."); } checkAxisIndices(axisIndices); - Integer key = new Integer(index); - this.datasetToAxesMap.put(key, new ArrayList(axisIndices)); + this.datasetToAxesMap.put(index, new ArrayList<>(axisIndices)); // fake a dataset change event to update axes... datasetChanged(new DatasetChangeEvent(this, getDataset(index))); } @@ -1303,12 +1302,10 @@ private void checkAxisIndices(List indices) { */ public ValueAxis getAxisForDataset(@NonNegative int index) { ValueAxis valueAxis; - List axisIndices = (List) this.datasetToAxesMap.get( - new Integer(index)); + List<@NonNegative Integer> axisIndices = this.datasetToAxesMap.get(index); if (axisIndices != null) { // the first axis in the list is used for data <--> Java2D - @SuppressWarnings("index") // guaranteed index: axesIndices[0] is always NN - @NonNegative int axisIndex = ((Integer) axisIndices.get(0)).intValue(); + @NonNegative int axisIndex = axisIndices.get(0); valueAxis = getAxis(axisIndex); } else { diff --git a/src/main/java/org/jfree/chart/plot/XYPlot.java b/src/main/java/org/jfree/chart/plot/XYPlot.java index db3c4be5d..33a53f60b 100644 --- a/src/main/java/org/jfree/chart/plot/XYPlot.java +++ b/src/main/java/org/jfree/chart/plot/XYPlot.java @@ -3058,7 +3058,7 @@ else if (this.orientation == PlotOrientation.VERTICAL) { // reserve space for the domain axes... for (ValueAxis axis: this.domainAxes.values()) { if (axis != null) { - @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a domain axis, so findDomainAxisIndex will return NN + @SuppressWarnings("index") // rewrite guaranteed index: axis is guaranteed to be a domain axis, so findDomainAxisIndex will return NN RectangleEdge edge = getDomainAxisEdge( findDomainAxisIndex(axis)); space = axis.reserveSpace(g2, this, plotArea, edge, space); @@ -3105,7 +3105,7 @@ else if (this.orientation == PlotOrientation.VERTICAL) { // reserve space for the range axes... for (ValueAxis axis: this.rangeAxes.values()) { if (axis != null) { - @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a range axis, so findRangeAxisIndex will return NN + @SuppressWarnings("index") // rewrite guaranteed index: axis is guaranteed to be a range axis, so findRangeAxisIndex will return NN RectangleEdge edge = getRangeAxisEdge( findRangeAxisIndex(axis)); space = axis.reserveSpace(g2, this, plotArea, edge, space); @@ -3275,12 +3275,12 @@ public void draw(Graphics2D g2, Rectangle2D area, Point2D anchor, // draw the markers that are associated with a specific dataset... for (XYDataset dataset: this.datasets.values()) { - @SuppressWarnings("index") // guaranteed index: dataset is definitely a valid dataset, so its index will be nonnegative + @SuppressWarnings("index") // rewrite guaranteed index: dataset is definitely a valid dataset, so its index will be nonnegative @NonNegative int datasetIndex = indexOf(dataset); drawDomainMarkers(g2, dataArea, datasetIndex, Layer.BACKGROUND); } for (XYDataset dataset: this.datasets.values()) { - @SuppressWarnings("index") // guaranteed index: dataset is definitely a valid dataset, so its index will be nonnegative + @SuppressWarnings("index") // rewrite guaranteed index: dataset is definitely a valid dataset, so its index will be nonnegative @NonNegative int datasetIndex = indexOf(dataset); drawRangeMarkers(g2, dataArea, datasetIndex, Layer.BACKGROUND); } @@ -3647,7 +3647,7 @@ protected Map<Axis, AxisState> drawAxes(Graphics2D g2, Rectangle2D plotArea, // add domain axes to lists... for (ValueAxis axis : this.domainAxes.values()) { if (axis != null) { - @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a domain axis, so axisIndex is NN + @SuppressWarnings("index") // rewrite guaranteed index: axis is guaranteed to be a domain axis, so axisIndex is NN @NonNegative int axisIndex = findDomainAxisIndex(axis); axisCollection.add(axis, getDomainAxisEdge(axisIndex)); } @@ -3656,7 +3656,7 @@ protected Map<Axis, AxisState> drawAxes(Graphics2D g2, Rectangle2D plotArea, // add range axes to lists... for (ValueAxis axis : this.rangeAxes.values()) { if (axis != null) { - @SuppressWarnings("index") // guaranteed index: axis is guaranteed to be a range axis, so axisIndex is NN + @SuppressWarnings("index") // rewrite guaranteed index: axis is guaranteed to be a range axis, so axisIndex is NN @NonNegative int axisIndex = findRangeAxisIndex(axis); axisCollection.add(axis, getRangeAxisEdge(axisIndex)); } @@ -5327,7 +5327,7 @@ public LegendItemCollection getLegendItems() { if (dataset == null) { continue; } - @SuppressWarnings("index") // guaranteed index: dataset is came from this object, so indexOf returns NN + @SuppressWarnings("index") // rewrite guaranteed index: dataset is came from this object, so indexOf returns NN @NonNegative int datasetIndex = indexOf(dataset); XYItemRenderer renderer = getRenderer(datasetIndex); if (renderer == null) { diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 16e8d8a83..3b5f5aaca 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -2287,7 +2287,6 @@ public static double findYValue(XYDataset dataset, @NonNegative int series, doub return Double.NaN; } - @SuppressWarnings("index") // guaranteed index: the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. @IndexFor("dataset.getSeries(series)") int indices0 = indices[0]; @SuppressWarnings("index") // guaranteed index: the check above is sufficient to establish that no entries in indices are negative, since the values are correlated. From 7db9d8f58c6e0bbd489ee38e3e34c52efa6f8716 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein <smillst@cs.washington.edu> Date: Wed, 23 May 2018 09:37:04 -0700 Subject: [PATCH 76/79] Remove warning suppressions that aren't needed. --- src/main/java/org/jfree/chart/renderer/RendererUtils.java | 5 ----- .../org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java | 1 - src/main/java/org/jfree/data/general/DatasetUtils.java | 2 -- src/main/java/org/jfree/data/io/CSV.java | 1 - .../jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java | 1 - .../java/org/jfree/data/statistics/HistogramDataset.java | 1 - .../org/jfree/data/statistics/SimpleHistogramDataset.java | 1 - .../java/org/jfree/data/xy/DefaultIntervalXYDataset.java | 2 -- src/main/java/org/jfree/data/xy/DefaultWindDataset.java | 1 - src/main/java/org/jfree/data/xy/XYBarDataset.java | 1 - 10 files changed, 16 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/RendererUtils.java b/src/main/java/org/jfree/chart/renderer/RendererUtils.java index c9eb43fa7..72f5203eb 100644 --- a/src/main/java/org/jfree/chart/renderer/RendererUtils.java +++ b/src/main/java/org/jfree/chart/renderer/RendererUtils.java @@ -88,7 +88,6 @@ public class RendererUtils { // for the index of the highest x-value that is less than xLow @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int low = 0; - @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue >= xLow) { @@ -117,7 +116,6 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // bound is found by calculating relative to the xHigh value @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int low = 0; - @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue <= xHigh) { @@ -186,7 +184,6 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { if (dataset.getDomainOrder() == DomainOrder.ASCENDING) { @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int low = 0; - @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > xHigh) { @@ -214,7 +211,6 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // comparing against xLow @SuppressWarnings("index") // 0 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int low = 0; - @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; int mid = (low + high) / 2; double lowValue = dataset.getXValue(series, low); @@ -242,7 +238,6 @@ else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { // but we can still skip any trailing values that fall outside the // range... int index = itemCount - 1; - @SuppressWarnings("index") // itemCount - 1 is an index, because the item count is checked above and the function returns if there isn't at least one item @IndexFor("dataset.getSeries(series)") int indexTmp = index; // skip any items that don't need including... double x = dataset.getXValue(series, indexTmp); while (index >= 0 && x > xHigh) { diff --git a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java index 9851bf6ad..db56b3887 100644 --- a/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java +++ b/src/main/java/org/jfree/chart/renderer/xy/CyclicXYItemRenderer.java @@ -361,7 +361,6 @@ protected static class OverwriteDataSet implements XYDataset { * @param y the y values. * @param delegateSet the dataset. */ - @SuppressWarnings("index") // SameLen on custom collections requires a suppressed warning to establish representation invariant https://github.com/kelloggm/checker-framework/issues/213 public OverwriteDataSet(double @SameLen("#2") [] x, double @SameLen("#1") [] y, XYDataset delegateSet) { this.delegateSet = delegateSet; diff --git a/src/main/java/org/jfree/data/general/DatasetUtils.java b/src/main/java/org/jfree/data/general/DatasetUtils.java index 3b5f5aaca..85b3d1fec 100644 --- a/src/main/java/org/jfree/data/general/DatasetUtils.java +++ b/src/main/java/org/jfree/data/general/DatasetUtils.java @@ -2343,7 +2343,6 @@ public static double findYValue(XYDataset dataset, @NonNegative int series, doub if (dataset.getDomainOrder() == DomainOrder.ASCENDING) { @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 @IndexFor("dataset.getSeries(series)") int low = 0; - @SuppressWarnings("index") // itemCount - 1 is an index, because itemCount > 1 @IndexFor("dataset.getSeries(series)") int high = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > x) { @@ -2378,7 +2377,6 @@ public static double findYValue(XYDataset dataset, @NonNegative int series, doub else if (dataset.getDomainOrder() == DomainOrder.DESCENDING) { @SuppressWarnings("index") // 0 is a valid index, because itemCount > 1 @IndexFor("dataset.getSeries(series)") int high = 0; - @SuppressWarnings("index") // itemCount - 1 is an index, because itemCount > 1 @IndexFor("dataset.getSeries(series)") int low = itemCount - 1; double lowValue = dataset.getXValue(series, low); if (lowValue > x) { diff --git a/src/main/java/org/jfree/data/io/CSV.java b/src/main/java/org/jfree/data/io/CSV.java index 4f7c86b8b..4f5a7eafc 100644 --- a/src/main/java/org/jfree/data/io/CSV.java +++ b/src/main/java/org/jfree/data/io/CSV.java @@ -172,7 +172,6 @@ private void extractRowKeyAndData(String line, (Comparable) columnKeys.get(fieldIndex - 1) ); } - @SuppressWarnings("index") // line is CSV formatted, so skipping is okay here @IndexOrHigh("line") int skipIndex = i + 1; start = skipIndex; fieldIndex++; diff --git a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java index cc578bb18..51732f5a9 100644 --- a/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java +++ b/src/main/java/org/jfree/data/statistics/DefaultBoxAndWhiskerXYDataset.java @@ -216,7 +216,6 @@ public void setFaroutCoefficient(double faroutCoefficient) { * @return The number of items in the specified series. */ @Override - @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.dates.size(); } diff --git a/src/main/java/org/jfree/data/statistics/HistogramDataset.java b/src/main/java/org/jfree/data/statistics/HistogramDataset.java index c9a9970de..47088a517 100644 --- a/src/main/java/org/jfree/data/statistics/HistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/HistogramDataset.java @@ -338,7 +338,6 @@ public Comparable getSeriesKey(@NonNegative int series) { * specified range. */ @Override - @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return getBins(series).size(); } diff --git a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java index 6a8e6921f..ccfed587b 100644 --- a/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java +++ b/src/main/java/org/jfree/data/statistics/SimpleHistogramDataset.java @@ -166,7 +166,6 @@ public DomainOrder getDomainOrder() { * @return The item count. */ @Override - @SuppressWarnings("index") // array-list interop: the underlying data structure here is a list, but this method's annotation expects an array public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { return this.bins.size(); } diff --git a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java index f01d78df1..6abcc0c56 100644 --- a/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultIntervalXYDataset.java @@ -483,7 +483,6 @@ public void addSeries(Comparable seriesKey, double @ArrayLen(6) [][] data) { * @return A boolean. */ @Override - @SuppressWarnings("index") // array-list interop: Equality test relies on well-formedness of other object, which can't be annotated perfectly because of array-list interop public boolean equals(Object obj) { if (obj == this) { return true; @@ -554,7 +553,6 @@ public int hashCode() { * a key that cannot be cloned. */ @Override - @SuppressWarnings("index") // clone assumes that the dataset is well-formed. public Object clone() throws CloneNotSupportedException { DefaultIntervalXYDataset clone = (DefaultIntervalXYDataset) super.clone(); diff --git a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java index 3c3f14deb..e392b1f15 100644 --- a/src/main/java/org/jfree/data/xy/DefaultWindDataset.java +++ b/src/main/java/org/jfree/data/xy/DefaultWindDataset.java @@ -189,7 +189,6 @@ public DefaultWindDataset(List seriesKeys, Object[][] @ArrayLen(3) [] data) { * @return The item count. */ @Override - @SuppressWarnings("index") // array-list interop: the annotation here expects this to be backed by a list of arrays, but its backed by a list of lists public @LengthOf("this.getSeries(#1)") int getItemCount(@NonNegative int series) { if (series < 0 || series >= getSeriesCount()) { throw new IllegalArgumentException("Invalid series index: " diff --git a/src/main/java/org/jfree/data/xy/XYBarDataset.java b/src/main/java/org/jfree/data/xy/XYBarDataset.java index d2878b4dd..730abd47d 100644 --- a/src/main/java/org/jfree/data/xy/XYBarDataset.java +++ b/src/main/java/org/jfree/data/xy/XYBarDataset.java @@ -126,7 +126,6 @@ public void setBarWidth(double barWidth) { * @return The series count. */ @Override - @SuppressWarnings("index") // retain information when casting https://github.com/kelloggm/checker-framework/issues/212 public @NonNegative int getSeriesCount() { return this.underlying.getSeriesCount(); } From 35c8d586eee29bf0d28c9c85d2324f2ac8d3a5ad Mon Sep 17 00:00:00 2001 From: Suzanne Millstein <smillst@cs.washington.edu> Date: Fri, 25 May 2018 11:24:33 -0700 Subject: [PATCH 77/79] Improve comment. --- src/main/java/org/jfree/chart/axis/CompassFormat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jfree/chart/axis/CompassFormat.java b/src/main/java/org/jfree/chart/axis/CompassFormat.java index 916be77f9..d45802424 100644 --- a/src/main/java/org/jfree/chart/axis/CompassFormat.java +++ b/src/main/java/org/jfree/chart/axis/CompassFormat.java @@ -113,7 +113,7 @@ public String getDirectionCode(double direction) { if (direction < 0.0) { direction = direction + 360.0; } - @SuppressWarnings({"index", "value"}) // Math.floor needs annotations? + @SuppressWarnings({"index", "value"}) // Needs @DoubleRange @IntRange(from = 0, to = 15) int index = ((int) Math.floor(direction / 11.25) + 1) / 2; return directions[index]; } From a88a6cfefdf76c80d093420d48d66b4c81871c82 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein <smillst@cs.washington.edu> Date: Fri, 25 May 2018 09:49:34 -0700 Subject: [PATCH 78/79] Convert 4 false positives into one. Plus remove one more. --- .../category/CategoryItemRendererState.java | 3 +-- .../time/DynamicTimeSeriesCollection.java | 20 ++++++++----------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java index 24d13ee97..1e57ab9d3 100644 --- a/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java +++ b/src/main/java/org/jfree/chart/renderer/category/CategoryItemRendererState.java @@ -206,12 +206,11 @@ public int getVisibleSeriesCount() { * * @since 1.0.13 */ - @SuppressWarnings("index") // this.visibleSeries only contains nonnegatives. The result array is a copy of this array public @NonNegative int[] getVisibleSeriesArray() { if (this.visibleSeries == null) { return null; } - int[] result = new int[this.visibleSeries.length]; + @NonNegative int[] result = new int[this.visibleSeries.length]; System.arraycopy(this.visibleSeries, 0, result, 0, this.visibleSeries.length); return result; diff --git a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java index 860873055..3d759cd05 100644 --- a/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java +++ b/src/main/java/org/jfree/data/time/DynamicTimeSeriesCollection.java @@ -389,9 +389,8 @@ public void setPosition(int position) { * Use this as-is during setup only, or add the synchronized keyword around * the copy loop. */ - public void addSeries(float[] values, @NonNegative int seriesNumber, + public void addSeries(float @LengthOf("this.historyCount")[] values, @NonNegative int seriesNumber, Comparable seriesKey) { - invalidateRangeInfo(); int i; if (values == null) { @@ -409,17 +408,16 @@ public void addSeries(float[] values, @NonNegative int seriesNumber, this.seriesCount++; } // But if that series array already exists, just overwrite its contents + @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: this.valueHistory[seriesNumber]'s length is <= this.historyCount + @IndexFor({"this.valueHistory[seriesNumber]","values"}) int historyCount = this.historyCount; // Avoid IndexOutOfBoundsException: int srcLength = values.length; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: this.valueHistory[seriesNumber]'s length is <= this.historyCount - @LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"}) int copyLength = this.historyCount; + int copyLength = historyCount; boolean fillNeeded = false; - if (srcLength < this.historyCount) { + if (srcLength < historyCount) { fillNeeded = true; - @SuppressWarnings("index") // https://github.com/kelloggm/checker-framework/issues/158: this.valueHistory[seriesNumber]'s length is <= this.historyCount - @LTEqLengthOf({"this.valueHistory[seriesNumber]", "values"}) int newCopyLength = srcLength; - copyLength = newCopyLength; + copyLength = srcLength; } //{ for (i = 0; i < copyLength; i++) { // deep copy from values[], caller @@ -427,10 +425,8 @@ public void addSeries(float[] values, @NonNegative int seriesNumber, this.valueHistory[seriesNumber].enterData(i, values[i]); } if (fillNeeded) { - for (i = copyLength; i < this.historyCount; i++) { - @SuppressWarnings("index") // String array bug https://github.com/kelloggm/checker-framework/issues/205 - @LTLengthOf("this.valueHistory[seriesNumber]") int i0 = i; - this.valueHistory[seriesNumber].enterData(i0, 0.0f); + for (i = copyLength; i < historyCount; i++) { + this.valueHistory[seriesNumber].enterData(i, 0.0f); } } //} From a4fb36d9788417d4b9fbade523935511beb8b191 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein <smillst@cs.washington.edu> Date: Tue, 29 May 2018 11:51:17 -0700 Subject: [PATCH 79/79] Add type argument to iterator and @NonNeg --- .../java/org/jfree/chart/plot/CategoryPlot.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jfree/chart/plot/CategoryPlot.java b/src/main/java/org/jfree/chart/plot/CategoryPlot.java index 738193e42..b84253c03 100644 --- a/src/main/java/org/jfree/chart/plot/CategoryPlot.java +++ b/src/main/java/org/jfree/chart/plot/CategoryPlot.java @@ -2425,10 +2425,9 @@ public void addDomainMarker(@NonNegative int index, CategoryMarker marker, Layer public void clearDomainMarkers() { if (this.backgroundDomainMarkers != null) { - Set<@NonNegative Integer> keys = this.backgroundDomainMarkers.keySet(); - Iterator iterator = keys.iterator(); + Set<@NonNegative Integer> keys = this.backgroundDomainMarkers.keySet(); + Iterator<@NonNegative Integer> iterator = keys.iterator(); while (iterator.hasNext()) { - @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? @NonNegative Integer key = (Integer) iterator.next(); clearDomainMarkers(key.intValue()); } @@ -2437,9 +2436,8 @@ public void clearDomainMarkers() { if (this.foregroundDomainMarkers != null) { Set<@NonNegative Integer> keys = this.foregroundDomainMarkers.keySet(); - Iterator iterator = keys.iterator(); + Iterator<@NonNegative Integer> iterator = keys.iterator(); while (iterator.hasNext()) { - @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? @NonNegative Integer key = (Integer) iterator.next(); clearDomainMarkers(key.intValue()); } @@ -2702,9 +2700,8 @@ public void clearRangeMarkers() { if (this.backgroundRangeMarkers != null) { Set<@NonNegative Integer> keys = this.backgroundRangeMarkers.keySet(); - Iterator iterator = keys.iterator(); + Iterator<@NonNegative Integer> iterator = keys.iterator(); while (iterator.hasNext()) { - @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? @NonNegative Integer key = (Integer) iterator.next(); clearRangeMarkers(key.intValue()); } @@ -2713,9 +2710,8 @@ public void clearRangeMarkers() { if (this.foregroundRangeMarkers != null) { Set<@NonNegative Integer> keys = this.foregroundRangeMarkers.keySet(); - Iterator iterator = keys.iterator(); + Iterator<@NonNegative Integer> iterator = keys.iterator(); while (iterator.hasNext()) { - @SuppressWarnings({"index", "value"}) // iterator over a set of nonnegative integers always returns a nonnegative integer? @NonNegative Integer key = (Integer) iterator.next(); clearRangeMarkers(key.intValue()); }