* 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
@@ -3093,8 +3093,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; |
@@ -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(); | |||
} | |||
} |
@@ -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()); | |||
} | |||
} |