Skip to content

Commit 00eed4b

Browse files
committed
CategoryAxis: simplification
This removes the circular dependency between DefaultCategoryChart and DefaultCategoryAxis.
1 parent b68da8e commit 00eed4b

5 files changed

Lines changed: 125 additions & 30 deletions

File tree

src/main/java/org/scijava/plot/CategoryAxis.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,14 @@ public interface CategoryAxis extends Labeled {
5252

5353
boolean hasManualCategories();
5454

55+
List<Object> getManualCategories();
56+
5557
/** Specify the order used to display the categories in a {@link CategoryChart}. */
56-
void setOrder(Comparator<?> comparator);
58+
<T> void setOrder(Comparator<T> comparator);
5759

5860
void clearOrder();
5961

60-
/** Returns the list of categories to be displayed in the {@link CategoryChart}. */
61-
List<Object> getCategories();
62+
boolean hasOrder();
6263

64+
Comparator<?> getOrder();
6365
}

src/main/java/org/scijava/plot/CategoryChart.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public interface CategoryChart extends Plot {
5252

5353
List<CategoryChartItem> getItems();
5454

55+
List<Object> getCategories();
56+
5557
void setTitle(String title);
5658

5759
String getTitle();

src/main/java/org/scijava/plot/defaultplot/DefaultCategoryAxis.java

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,11 @@
4545
class DefaultCategoryAxis extends AbstractLabeled implements CategoryAxis
4646
{
4747

48-
private final CategoryChart chart;
49-
5048
private List categories = null;
5149

5250
private Comparator comparator = null;
5351

54-
DefaultCategoryAxis(CategoryChart chart) {
55-
this.chart = chart;
56-
}
52+
DefaultCategoryAxis() { }
5753

5854
// -- CategoryAxis methods --
5955

@@ -73,36 +69,30 @@ public boolean hasManualCategories() {
7369
}
7470

7571
@Override
76-
public void setOrder(Comparator comparator) {
77-
this.comparator = Objects.requireNonNull(comparator);
72+
public List< Object > getManualCategories()
73+
{
74+
return Collections.unmodifiableList( categories );
7875
}
7976

8077
@Override
81-
public void clearOrder() {
82-
this.comparator = null;
78+
public <T> void setOrder(Comparator<T> comparator) {
79+
this.comparator = Objects.requireNonNull(comparator);
8380
}
8481

8582
@Override
86-
public List<Object> getCategories() {
87-
List<Object> result = getCategoriesDefaultOrder();
88-
if(comparator != null)
89-
result.sort(comparator);
90-
return result;
83+
public void clearOrder() {
84+
comparator = null;
9185
}
9286

93-
// -- private helper methods
94-
95-
private List<Object> getCategoriesDefaultOrder() {
96-
if(categories == null) {
97-
Set<Object> allCategories = newEmptySetOfCategories();
98-
for (CategoryChartItem item : chart.getItems())
99-
allCategories.addAll(item.getCategories());
100-
return new ArrayList<>(allCategories);
101-
} else
102-
return new ArrayList<>(categories); // Make copy to avoid the list passed to setManualCategories to be sorted.
87+
@Override
88+
public boolean hasOrder()
89+
{
90+
return comparator != null;
10391
}
10492

105-
private Set<Object> newEmptySetOfCategories() {
106-
return new HashSet<>();
93+
@Override
94+
public Comparator< ? > getOrder()
95+
{
96+
return comparator;
10797
}
10898
}

src/main/java/org/scijava/plot/defaultplot/DefaultCategoryChart.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,13 @@
3939
import org.scijava.plot.LineSeries;
4040
import org.scijava.plot.NumberAxis;
4141

42+
import java.util.ArrayList;
4243
import java.util.Collections;
44+
import java.util.Comparator;
45+
import java.util.HashSet;
4346
import java.util.LinkedList;
4447
import java.util.List;
48+
import java.util.Set;
4549

4650
/**
4751
* Default implementation of {@link CategoryChart}.
@@ -58,7 +62,7 @@ public class DefaultCategoryChart<C> extends AbstractPlot implements CategoryCha
5862

5963
public DefaultCategoryChart() {
6064
valueAxis = new DefaultNumberAxis();
61-
categoryAxis = new DefaultCategoryAxis(this);
65+
categoryAxis = new DefaultCategoryAxis();
6266
items = new LinkedList<>();
6367
}
6468

@@ -94,6 +98,40 @@ public List<CategoryChartItem> getItems() {
9498
return Collections.unmodifiableList(items);
9599
}
96100

101+
@Override
102+
public List<Object> getCategories()
103+
{
104+
List< Object > categories = unsortedCategories();
105+
return sortCategories( categories );
106+
107+
}
108+
109+
private List< Object > sortCategories( List< Object > categories )
110+
{
111+
if(categoryAxis.hasOrder())
112+
{
113+
if( ! ( categories instanceof ArrayList ) )
114+
categories = new ArrayList<>( categories );
115+
categories.sort( ( Comparator ) categoryAxis.getOrder() );
116+
}
117+
return categories;
118+
}
119+
120+
private List< Object > unsortedCategories()
121+
{
122+
if(categoryAxis.hasManualCategories())
123+
{
124+
return categoryAxis.getManualCategories();
125+
}
126+
else
127+
{
128+
Set< Object > set = new HashSet<>();
129+
for ( CategoryChartItem item : items )
130+
set.addAll( item.getCategories() );
131+
return new ArrayList<>( set );
132+
}
133+
}
134+
97135
// -- private helper methods --
98136

99137
private <T extends CategoryChartItem> T addItem(T value) {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.scijava.plot.defaultplot;
2+
3+
import org.junit.Test;
4+
import org.scijava.plot.BarSeries;
5+
import org.scijava.plot.CategoryChart;
6+
7+
import java.util.Arrays;
8+
import java.util.Comparator;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.TreeMap;
12+
13+
import static org.junit.Assert.assertEquals;
14+
15+
public class DefaultCategoryChartTest
16+
{
17+
@Test
18+
public void testIgnoreCategory() {
19+
CategoryChart chart = newChart();
20+
final List< String > categories = Arrays.asList( "a", "c", "b" );
21+
chart.categoryAxis().setManualCategories( categories );
22+
assertEquals( categories, chart.getCategories() );
23+
}
24+
25+
@Test
26+
public void testAddCategory() {
27+
CategoryChart chart = newChart();
28+
final List< String > categories = Arrays.asList( "a", "x", "c", "b" );
29+
chart.categoryAxis().setManualCategories( categories );
30+
assertEquals( categories, chart.getCategories() );
31+
}
32+
33+
@Test
34+
public void testSortManuallySpecifiedCategories() {
35+
CategoryChart chart = newChart();
36+
final List< String > categories = Arrays.asList( "a", "x", "c", "b" );
37+
chart.categoryAxis().setManualCategories( categories );
38+
chart.categoryAxis().setOrder( String::compareTo );
39+
assertEquals( Arrays.asList( "a", "b", "c", "x" ), chart.getCategories() );
40+
}
41+
42+
@Test
43+
public void testCategorySorting() {
44+
CategoryChart chart = newChart();
45+
chart.categoryAxis().<String>setOrder( Comparator.reverseOrder() );
46+
assertEquals( Arrays.asList( "d", "c", "b", "a" ), chart.getCategories() );
47+
}
48+
49+
private CategoryChart newChart() {
50+
CategoryChart chart = new DefaultCategoryChart<>();
51+
52+
Map<String, Double> data = new TreeMap<>();
53+
data.put("a", 1.0);
54+
data.put("b", 2.0);
55+
data.put("c", 3.0);
56+
data.put("d", 4.0);
57+
58+
BarSeries bars = chart.addBarSeries();
59+
bars.setValues(data);
60+
61+
return chart;
62+
}
63+
}

0 commit comments

Comments
 (0)