Browse Source

Fix an NPE caused by the previous fix to Grid's frozen columns (#11444)

* 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 #10653
tags/8.8.0.beta1
mlindfors 5 years ago
parent
commit
4c1919c6ec

+ 6
- 2
server/src/main/java/com/vaadin/ui/Grid.java View File

@@ -3232,8 +3232,12 @@ public class Grid<T> extends AbstractListing<T> implements HasComponents,
final String diffStateKey = "frozenColumnCount";
UI ui = getUI();
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;

+ 60
- 0
uitest/src/main/java/com/vaadin/tests/components/grid/GridFrozenColumnNPE.java View File

@@ -0,0 +1,60 @@
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();
}

}

+ 26
- 0
uitest/src/test/java/com/vaadin/tests/components/grid/GridFrozenColumnNPETest.java View File

@@ -0,0 +1,26 @@
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());
}

}

Loading…
Cancel
Save