1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
package com.vaadin.tests.components.table;
import java.util.HashSet;
import java.util.Set;
import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.Table.Align;
import com.vaadin.ui.Table.ColumnGenerator;
import com.vaadin.ui.VerticalLayout;
public class LargeSelectionCausesNPE extends TestBase {
@AutoGenerated
private Table table;
private static final String ID = "id";
private static final String NAME = "name";
private static final String CODE = "code";
@Override
protected void setup() {
addComponent(new SelectionExample());
}
@Override
protected String getDescription() {
return "Attempting to update table contents while selection reaches beyond cache limits causes a NPE.<br>"
+ " Select a large amount of rows, e.g. from name2 to name262, return to the top of the table,"
+ " then try to update the first item twice.<br>"
+ " Test is broken if the original values don't reappear on the second click of the button.";
}
@Override
protected Integer getTicketNumber() {
return 8519;
}
public class SelectionExample extends VerticalLayout {
Table table = new Table();
Button button = new Button("Update the first item");
Label nameLabel = new Label();
HashSet<Object> markedRows = new HashSet<Object>();
Label selected = new Label();
public SelectionExample() {
addComponent(table);
addComponent(button);
setMargin(new MarginInfo(true, false, false, false));
// Label to indicate current selection
selected.setValue("No selection");
addComponent(selected);
// set a style name, so we can style rows and cells
table.setStyleName("iso3166");
// size
table.setWidth("100%");
table.setPageLength(5);
// selectable
table.setSelectable(true);
table.setMultiSelect(true);
table.setImmediate(true);
// connect data source
table.setContainerDataSource(getContainer());
table.addGeneratedColumn(CODE, columnGenerator);
// turn on column reordering and collapsing
table.setColumnReorderingAllowed(true);
table.setColumnCollapsingAllowed(true);
// set column headers
table.setVisibleColumns(new String[] { CODE, NAME, ID });
table.setColumnHeaders(new String[] { "DummyCode", "DummyName",
"DummyId" });
// Column alignment
table.setColumnAlignment(ID, Align.CENTER);
// Column width
table.setColumnWidth(CODE, 70);
table.setColumnExpandRatio(NAME, 1);
table.setColumnWidth(ID, 70);
// listen for valueChange, a.k.a 'select' and update the label
table.addValueChangeListener(valueChangeListener);
button.setId(getTicketNumber() + "-button");
button.addClickListener(clickListener);
}
Table.ValueChangeListener valueChangeListener = new Table.ValueChangeListener() {
public void valueChange(ValueChangeEvent event) {
// in multiselect mode, a Set of itemIds is returned,
// in singleselect mode the itemId is returned directly
Set<?> value = (Set<?>) event.getProperty().getValue();
if (null == value || value.size() == 0) {
selected.setValue("No selection");
} else {
selected.setValue("Selected: " + table.getValue());
}
}
};
Button.ClickListener clickListener = new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
Property nameProperty = table.getContainerProperty(0, NAME);
if (("0").equals(nameLabel.getValue())) {
nameProperty.setValue(NAME + "0-version2");
nameLabel.setValue("0-version2");
} else {
nameProperty.setValue(NAME + 0);
nameLabel.setValue("0");
}
}
};
public IndexedContainer getContainer() {
IndexedContainer container = new IndexedContainer();
container.addContainerProperty(NAME, String.class, null);
container.addContainerProperty(ID, Integer.class, null);
for (int i = 0; i < 264; i++) {
String name = NAME + i;
int id = i;
Item item = container.addItem(id);
item.getItemProperty(NAME).setValue(name);
item.getItemProperty(ID).setValue(id);
}
container.sort(new Object[] { ID }, new boolean[] { true });
return container;
}
ColumnGenerator columnGenerator = new ColumnGenerator() {
public Object generateCell(Table source, Object itemId,
Object columnId) {
Label label = new Label();
label.setSizeUndefined();
label.setValue(itemId.toString());
label.setId(getTicketNumber() + "-" + itemId);
if (0 == (Integer) itemId) {
nameLabel = label;
}
return label;
}
};
}
}
|