* Fix an NPE caused by the previous fix to Grid's frozen columns (#10653) If the user managed to get two frozen column count changes into a single server round-trip before the component had been attached, the previous fix #11346 lead to a null pointer exception since there was no diff state available. This fix adds a null check before removing the frozen column count value from the diff state so that this will not happen. Closes #10653tags/8.7.1
final String diffStateKey = "frozenColumnCount"; | final String diffStateKey = "frozenColumnCount"; | ||||
UI ui = getUI(); | UI ui = getUI(); | ||||
if (ui != null) { | if (ui != null) { | ||||
ui.getConnectorTracker().getDiffState(Grid.this) | |||||
.remove(diffStateKey); | |||||
JsonObject diffState = ui.getConnectorTracker() | |||||
.getDiffState(Grid.this); | |||||
// if diffState is not present, there's nothing for us to clean | |||||
if (diffState != null) { | |||||
diffState.remove(diffStateKey); | |||||
} | |||||
} | } | ||||
} | } | ||||
getState().frozenColumnCount = numberOfColumns; | getState().frozenColumnCount = numberOfColumns; |
package com.vaadin.tests.components.grid; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import com.vaadin.server.VaadinRequest; | |||||
import com.vaadin.tests.data.bean.Person; | |||||
import com.vaadin.ui.Button; | |||||
import com.vaadin.ui.Grid; | |||||
import com.vaadin.ui.renderers.NumberRenderer; | |||||
public class GridFrozenColumnNPE extends SimpleGridUI { | |||||
private Grid<Person> grid; | |||||
@Override | |||||
protected void setup(VaadinRequest request) { | |||||
grid = new Grid<Person>(); | |||||
grid.setSizeFull(); | |||||
init(); | |||||
getLayout().addComponent(grid); | |||||
grid.setFrozenColumnCount(1); | |||||
Button button = new Button("change frozen count"); | |||||
button.addClickListener(event -> { | |||||
reInit(); | |||||
}); | |||||
getLayout().addComponent(button); | |||||
} | |||||
@Override | |||||
protected List<Person> createPersons() { | |||||
List<Person> persons = new ArrayList<>(); | |||||
for (int i = 0; i < 10; ++i) { | |||||
Person person = new Person(); | |||||
person.setFirstName("First " + i); | |||||
person.setLastName("Last" + i); | |||||
person.setAge(i); | |||||
persons.add(person); | |||||
} | |||||
return persons; | |||||
} | |||||
protected void init() { | |||||
grid.addColumn(Person::getFirstName); | |||||
grid.addColumn(Person::getLastName); | |||||
grid.addColumn(Person::getAge, new NumberRenderer()); | |||||
grid.setItems(createPersons()); | |||||
grid.setFrozenColumnCount(1); | |||||
grid.setFrozenColumnCount(2); | |||||
} | |||||
protected void reInit() { | |||||
grid.removeAllColumns(); | |||||
init(); | |||||
} | |||||
} |
package com.vaadin.tests.components.grid; | |||||
import static org.junit.Assert.assertTrue; | |||||
import org.junit.Test; | |||||
import com.vaadin.testbench.elements.ButtonElement; | |||||
import com.vaadin.testbench.elements.GridElement; | |||||
import com.vaadin.tests.tb3.MultiBrowserTest; | |||||
public class GridFrozenColumnNPETest extends MultiBrowserTest { | |||||
@Test | |||||
public void testFrozenColumnNPE() { | |||||
openTestURL(); | |||||
GridElement grid = $(GridElement.class).first(); | |||||
assertTrue(grid.getCell(0, 0).isFrozen()); | |||||
ButtonElement button = $(ButtonElement.class).first(); | |||||
button.click(); | |||||
assertTrue(grid.getCell(0, 1).isFrozen()); | |||||
} | |||||
} |