Browse Source

Fix AbstractRemoteDataSource cache clean up on remove (#19482)

Change-Id: Ib9fc54ef018afe7f571204aba41182333b77c47f
tags/7.7.0.alpha1
Teemu Suo-Anttila 8 years ago
parent
commit
0225d0949b

+ 7
- 3
client/src/com/vaadin/client/data/AbstractRemoteDataSource.java View File

@@ -324,8 +324,10 @@ public abstract class AbstractRemoteDataSource<T> implements DataSource<T> {
// Called after dropping from cache. Dropped row is passed as a
// parameter, but is no longer present in the DataSource
T removed = indexToRowMap.remove(Integer.valueOf(i));
onDropFromCache(i, removed);
keyToIndexMap.remove(getRowKey(removed));
if (removed != null) {
onDropFromCache(i, removed);
keyToIndexMap.remove(getRowKey(removed));
}
}
}

@@ -534,13 +536,15 @@ public abstract class AbstractRemoteDataSource<T> implements DataSource<T> {

size -= count;

Range removedRange = Range.withLength(firstRowIndex, count);
dropFromCache(removedRange);

// shift indices to fill the cache correctly
int firstMoved = Math.max(firstRowIndex + count, cached.getStart());
for (int i = firstMoved; i < cached.getEnd(); i++) {
moveRowFromIndexToIndex(i, i - count);
}

Range removedRange = Range.withLength(firstRowIndex, count);
if (cached.isSubsetOf(removedRange)) {
// Whole cache is part of the removal. Empty cache
cached = Range.withLength(0, 0);

+ 66
- 0
uitest/src/com/vaadin/tests/components/grid/GridDataSourceReset.java View File

@@ -0,0 +1,66 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.grid;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.tests.fieldgroup.ComplexPerson;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Grid;

public class GridDataSourceReset extends AbstractTestUI {

BeanItemContainer<ComplexPerson> container;
List<ComplexPerson> persons;
Grid grid;

@Override
protected void setup(VaadinRequest request) {
persons = createPersons(10, new Random(1));
container = new BeanItemContainer<ComplexPerson>(ComplexPerson.class,
persons);

grid = new Grid(container);
grid.select(container.firstItemId());
addComponent(new Button("Remove first", new ClickListener() {

@Override
public void buttonClick(ClickEvent event) {
container.removeAllItems();
persons.remove(0);

container.addAll(persons);
grid.select(container.firstItemId());
}
}));
addComponent(grid);
}

public static List<ComplexPerson> createPersons(int count, Random r) {
List<ComplexPerson> c = new ArrayList<ComplexPerson>();
for (int i = 0; i < count; ++i) {
c.add(ComplexPerson.create(r));
}
return c;
}
}

+ 50
- 0
uitest/src/com/vaadin/tests/components/grid/GridDataSourceResetTest.java View File

@@ -0,0 +1,50 @@
/*
* Copyright 2000-2014 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.grid;

import static org.junit.Assert.assertFalse;
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.SingleBrowserTest;

public class GridDataSourceResetTest extends SingleBrowserTest {

@Test
public void testRemoveWithSelectUpdatesRowsCorrectly() {
openTestURL();

GridElement grid = $(GridElement.class).first();

assertTrue("First row was not selected", grid.getRow(0).isSelected());
for (int i = 1; i < 10; ++i) {
assertFalse("Only first row should be selected", grid.getRow(i)
.isSelected());
}

$(ButtonElement.class).first().click();

assertTrue("First row was not selected after remove", grid.getRow(0)
.isSelected());
for (int i = 1; i < 9; ++i) {
assertFalse("Only first row should be selected after remove", grid
.getRow(i).isSelected());
}
}
}

Loading…
Cancel
Save