Browse Source

Merge "Merge branch '7.2'"

tags/7.2.0.beta1
Artur Signell 10 years ago
parent
commit
eda9edcbde

+ 0
- 54
server/src/com/vaadin/data/Container.java View File

@@ -582,60 +582,6 @@ public interface Container extends Serializable {
public Item addItemAt(int index, Object newItemId)
throws UnsupportedOperationException;

/**
* An <code>Event</code> object specifying information about the added
* items.
*/
public interface ItemAddEvent extends ItemSetChangeEvent {

/**
* Gets the item id of the first added item.
*
* @return item id of the first added item
*/
public Object getFirstItemId();

/**
* Gets the index of the first added item.
*
* @return index of the first added item
*/
public int getFirstIndex();

/**
* Gets the number of the added items.
*
* @return the number of added items.
*/
public int getAddedItemsCount();
}

/**
* An <code>Event</code> object specifying information about the removed
* items.
*/
public interface ItemRemoveEvent extends ItemSetChangeEvent {
/**
* Gets the item id of the first removed item.
*
* @return item id of the first removed item
*/
public Object getFirstItemId();

/**
* Gets the index of the first removed item.
*
* @return index of the first removed item
*/
public int getFirstIndex();

/**
* Gets the number of the removed items.
*
* @return the number of removed items
*/
public int getRemovedItemsCount();
}
}

/**

+ 4
- 16
server/src/com/vaadin/data/util/AbstractBeanContainer.java View File

@@ -222,7 +222,6 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends
@Override
public boolean removeAllItems() {
int origSize = size();
IDTYPE firstItem = getFirstVisibleItem();

internalRemoveAllItems();

@@ -235,7 +234,7 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends
// fire event only if the visible view changed, regardless of whether
// filtered out items were removed or not
if (origSize != 0) {
fireItemsRemoved(0, firstItem, origSize);
fireItemSetChange();
}

return true;
@@ -680,8 +679,6 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends
protected void addAll(Collection<? extends BEANTYPE> collection)
throws IllegalStateException, IllegalArgumentException {
boolean modified = false;
int origSize = size();

for (BEANTYPE bean : collection) {
// TODO skipping invalid beans - should not allow them in javadoc?
if (bean == null
@@ -702,22 +699,13 @@ public abstract class AbstractBeanContainer<IDTYPE, BEANTYPE> extends
if (modified) {
// Filter the contents when all items have been added
if (isFiltered()) {
doFilterContainer(!getFilters().isEmpty());
}
if (visibleNewItemsWasAdded(origSize)) {
// fire event about added items
int firstPosition = origSize;
IDTYPE firstItemId = getVisibleItemIds().get(firstPosition);
int affectedItems = size() - origSize;
fireItemsAdded(firstPosition, firstItemId, affectedItems);
filterAll();
} else {
fireItemSetChange();
}
}
}

private boolean visibleNewItemsWasAdded(int origSize) {
return size() > origSize;
}

/**
* Use the bean resolver to get the identifier for a bean.
*

+ 11
- 138
server/src/com/vaadin/data/util/AbstractInMemoryContainer.java View File

@@ -15,10 +15,8 @@
*/
package com.vaadin.data.util;

import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
@@ -148,83 +146,6 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE
}
}

private static abstract class BaseItemAddOrRemoveEvent extends EventObject
implements Serializable {
protected Object itemId;
protected int index;
protected int count;

public BaseItemAddOrRemoveEvent(Container source, Object itemId,
int index, int count) {
super(source);
this.itemId = itemId;
this.index = index;
this.count = count;
}

public Container getContainer() {
return (Container) getSource();
}

public Object getFirstItemId() {
return itemId;
}

public int getFirstIndex() {
return index;
}

public int getAffectedItemsCount() {
return count;
}
}

/**
* An <code>Event</code> object specifying information about the added
* items.
*
* <p>
* This class provides information about the first added item and the number
* of added items.
* </p>
*/
protected static class BaseItemAddEvent extends BaseItemAddOrRemoveEvent
implements Container.Indexed.ItemAddEvent {

public BaseItemAddEvent(Container source, Object itemId, int index,
int count) {
super(source, itemId, index, count);
}

@Override
public int getAddedItemsCount() {
return getAffectedItemsCount();
}
}

/**
* An <code>Event</code> object specifying information about the removed
* items.
*
* <p>
* This class provides information about the first removed item and the
* number of removed items.
* </p>
*/
protected static class BaseItemRemoveEvent extends BaseItemAddOrRemoveEvent
implements Container.Indexed.ItemRemoveEvent {

public BaseItemRemoveEvent(Container source, Object itemId, int index,
int count) {
super(source, itemId, index, count);
}

@Override
public int getRemovedItemsCount() {
return getAffectedItemsCount();
}
}

/**
* Get an item even if filtered out.
*
@@ -977,69 +898,36 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE
* Notify item set change listeners that an item has been added to the
* container.
*
* Unless subclasses specify otherwise, the default notification indicates a
* full refresh.
*
* @param postion
* position of the added item in the view
* position of the added item in the view (if visible)
* @param itemId
* id of the added item
* @param item
* the added item
*/
protected void fireItemAdded(int position, ITEMIDTYPE itemId, ITEMCLASS item) {
fireItemsAdded(position, itemId, 1);
}

/**
* Notify item set change listeners that items has been added to the
* container.
*
* @param firstPosition
* position of the first visible added item in the view
* @param firstItemId
* id of the first visible added item
* @param numberOfItems
* the number of visible added items
*/
protected void fireItemsAdded(int firstPosition, ITEMIDTYPE firstItemId,
int numberOfItems) {
BaseItemAddEvent addEvent = new BaseItemAddEvent(this, firstItemId,
firstPosition, numberOfItems);
fireItemSetChange(addEvent);
fireItemSetChange();
}

/**
* Notify item set change listeners that an item has been removed from the
* container.
*
* @param position
* position of the removed item in the view prior to removal
* Unless subclasses specify otherwise, the default notification indicates a
* full refresh.
*
* @param postion
* position of the removed item in the view prior to removal (if
* was visible)
* @param itemId
* id of the removed item, of type {@link Object} to satisfy
* {@link Container#removeItem(Object)} API
*/
protected void fireItemRemoved(int position, Object itemId) {
fireItemsRemoved(position, itemId, 1);
}

/**
* Notify item set change listeners that items has been removed from the
* container.
*
* @param firstPosition
* position of the first visible removed item in the view prior
* to removal
* @param firstItemId
* id of the first visible removed item, of type {@link Object}
* to satisfy {@link Container#removeItem(Object)} API
* @param numberOfItems
* the number of removed visible items
*
*/
protected void fireItemsRemoved(int firstPosition, Object firstItemId,
int numberOfItems) {
BaseItemRemoveEvent removeEvent = new BaseItemRemoveEvent(this,
firstItemId, firstPosition, numberOfItems);
fireItemSetChange(removeEvent);
fireItemSetChange();
}

// visible and filtered item identifier lists
@@ -1057,21 +945,6 @@ public abstract class AbstractInMemoryContainer<ITEMIDTYPE, PROPERTYIDCLASS, ITE
}
}

/**
* Returns the item id of the first visible item after filtering. 'Null' is
* returned if there is no visible items.
*
* For internal use only.
*
* @return item id of the first visible item
*/
protected ITEMIDTYPE getFirstVisibleItem() {
if (!getVisibleItemIds().isEmpty()) {
return getVisibleItemIds().get(0);
}
return null;
}

/**
* Returns true is the container has active filters.
*

+ 3
- 4
server/src/com/vaadin/data/util/IndexedContainer.java View File

@@ -226,7 +226,6 @@ public class IndexedContainer extends
@Override
public boolean removeAllItems() {
int origSize = size();
Object firstItem = getFirstVisibleItem();

internalRemoveAllItems();

@@ -236,7 +235,7 @@ public class IndexedContainer extends
// filtered out items were removed or not
if (origSize != 0) {
// Sends a change event
fireItemsRemoved(0, firstItem, origSize);
fireItemSetChange();
}

return true;
@@ -621,7 +620,8 @@ public class IndexedContainer extends
@Override
protected void fireItemAdded(int position, Object itemId, Item item) {
if (position >= 0) {
super.fireItemAdded(position, itemId, item);
fireItemSetChange(new IndexedContainer.ItemSetChangeEvent(this,
position));
}
}

@@ -1211,5 +1211,4 @@ public class IndexedContainer extends
public Collection<Filter> getContainerFilters() {
return super.getContainerFilters();
}

}

+ 0
- 185
server/tests/src/com/vaadin/data/util/BeanItemContainerTest.java View File

@@ -10,15 +10,8 @@ import java.util.Map;

import junit.framework.Assert;

import org.easymock.Capture;
import org.easymock.EasyMock;

import com.vaadin.data.Container;
import com.vaadin.data.Container.Indexed.ItemAddEvent;
import com.vaadin.data.Container.Indexed.ItemRemoveEvent;
import com.vaadin.data.Container.ItemSetChangeListener;
import com.vaadin.data.Item;
import com.vaadin.data.util.filter.Compare;

/**
* Test basic functionality of BeanItemContainer.
@@ -734,182 +727,4 @@ public class BeanItemContainerTest extends AbstractBeanContainerTest {
assertNull(container.getContainerProperty(john, "address.street")
.getValue());
}

public void testItemAddedEvent() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
Person bean = new Person("John");
ItemSetChangeListener addListener = createListenerMockFor(container);
addListener.containerItemSetChange(EasyMock.isA(ItemAddEvent.class));
EasyMock.replay(addListener);

container.addItem(bean);

EasyMock.verify(addListener);
}

public void testItemAddedEvent_AddedItem() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
Person bean = new Person("John");
ItemSetChangeListener addListener = createListenerMockFor(container);
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);

container.addItem(bean);

assertEquals(bean, capturedEvent.getValue().getFirstItemId());
}

public void testItemAddedEvent_addItemAt_IndexOfAddedItem() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
Person bean = new Person("John");
container.addItem(bean);
ItemSetChangeListener addListener = createListenerMockFor(container);
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);

container.addItemAt(1, new Person(""));

assertEquals(1, capturedEvent.getValue().getFirstIndex());
}

public void testItemAddedEvent_addItemAfter_IndexOfAddedItem() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
Person bean = new Person("John");
container.addItem(bean);
ItemSetChangeListener addListener = createListenerMockFor(container);
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);

container.addItemAfter(bean, new Person(""));

assertEquals(1, capturedEvent.getValue().getFirstIndex());
}

public void testItemAddedEvent_amountOfAddedItems() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
ItemSetChangeListener addListener = createListenerMockFor(container);
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);
List<Person> beans = Arrays.asList(new Person("Jack"), new Person(
"John"));

container.addAll(beans);

assertEquals(2, capturedEvent.getValue().getAddedItemsCount());
}

public void testItemAddedEvent_someItemsAreFiltered_amountOfAddedItemsIsReducedByAmountOfFilteredItems() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
ItemSetChangeListener addListener = createListenerMockFor(container);
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);
List<Person> beans = Arrays.asList(new Person("Jack"), new Person(
"John"));
container.addFilter(new Compare.Equal("name", "John"));

container.addAll(beans);

assertEquals(1, capturedEvent.getValue().getAddedItemsCount());
}

public void testItemAddedEvent_someItemsAreFiltered_addedItemIsTheFirstVisibleItem() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
Person bean = new Person("John");
ItemSetChangeListener addListener = createListenerMockFor(container);
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);
List<Person> beans = Arrays.asList(new Person("Jack"), bean);
container.addFilter(new Compare.Equal("name", "John"));

container.addAll(beans);

assertEquals(bean, capturedEvent.getValue().getFirstItemId());
}

public void testItemRemovedEvent() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
Person bean = new Person("John");
container.addItem(bean);
ItemSetChangeListener removeListener = createListenerMockFor(container);
removeListener.containerItemSetChange(EasyMock
.isA(ItemRemoveEvent.class));
EasyMock.replay(removeListener);

container.removeItem(bean);

EasyMock.verify(removeListener);
}

public void testItemRemovedEvent_RemovedItem() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
Person bean = new Person("John");
container.addItem(bean);
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
EasyMock.replay(removeListener);

container.removeItem(bean);

assertEquals(bean, capturedEvent.getValue().getFirstItemId());
}

public void testItemRemovedEvent_indexOfRemovedItem() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
container.addItem(new Person("Jack"));
Person secondBean = new Person("John");
container.addItem(secondBean);
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
EasyMock.replay(removeListener);

container.removeItem(secondBean);

assertEquals(1, capturedEvent.getValue().getFirstIndex());
}

public void testItemRemovedEvent_amountOfRemovedItems() {
BeanItemContainer<Person> container = new BeanItemContainer<Person>(
Person.class);
container.addItem(new Person("Jack"));
container.addItem(new Person("John"));
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
EasyMock.replay(removeListener);

container.removeAllItems();

assertEquals(2, capturedEvent.getValue().getRemovedItemsCount());
}

private Capture<ItemAddEvent> captureAddEvent(
ItemSetChangeListener addListener) {
Capture<ItemAddEvent> capturedEvent = new Capture<ItemAddEvent>();
addListener.containerItemSetChange(EasyMock.capture(capturedEvent));
return capturedEvent;
}

private Capture<ItemRemoveEvent> captureRemoveEvent(
ItemSetChangeListener removeListener) {
Capture<ItemRemoveEvent> capturedEvent = new Capture<ItemRemoveEvent>();
removeListener.containerItemSetChange(EasyMock.capture(capturedEvent));
return capturedEvent;
}

private ItemSetChangeListener createListenerMockFor(
BeanItemContainer<Person> container) {
ItemSetChangeListener listener = EasyMock
.createNiceMock(ItemSetChangeListener.class);
container.addItemSetChangeListener(listener);
return listener;
}
}

+ 0
- 113
server/tests/src/com/vaadin/data/util/TestIndexedContainer.java View File

@@ -4,12 +4,6 @@ import java.util.List;

import junit.framework.Assert;

import org.easymock.Capture;
import org.easymock.EasyMock;

import com.vaadin.data.Container.Indexed.ItemAddEvent;
import com.vaadin.data.Container.Indexed.ItemRemoveEvent;
import com.vaadin.data.Container.ItemSetChangeListener;
import com.vaadin.data.Item;

public class TestIndexedContainer extends AbstractInMemoryContainerTest {
@@ -277,113 +271,6 @@ public class TestIndexedContainer extends AbstractInMemoryContainerTest {
counter.assertNone();
}

public void testItemAddedEvent() {
IndexedContainer container = new IndexedContainer();
ItemSetChangeListener addListener = createListenerMockFor(container);
addListener.containerItemSetChange(EasyMock.isA(ItemAddEvent.class));
EasyMock.replay(addListener);

container.addItem();

EasyMock.verify(addListener);
}

public void testItemAddedEvent_AddedItem() {
IndexedContainer container = new IndexedContainer();
ItemSetChangeListener addListener = createListenerMockFor(container);
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);

Object itemId = container.addItem();

assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
}

public void testItemAddedEvent_IndexOfAddedItem() {
IndexedContainer container = new IndexedContainer();
ItemSetChangeListener addListener = createListenerMockFor(container);
container.addItem();
Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
EasyMock.replay(addListener);

container.addItemAt(1);

assertEquals(1, capturedEvent.getValue().getFirstIndex());
}

public void testItemRemovedEvent() {
IndexedContainer container = new IndexedContainer();
Object itemId = container.addItem();
ItemSetChangeListener removeListener = createListenerMockFor(container);
removeListener.containerItemSetChange(EasyMock
.isA(ItemRemoveEvent.class));
EasyMock.replay(removeListener);

container.removeItem(itemId);

EasyMock.verify(removeListener);
}

public void testItemRemovedEvent_RemovedItem() {
IndexedContainer container = new IndexedContainer();
Object itemId = container.addItem();
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
EasyMock.replay(removeListener);

container.removeItem(itemId);

assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
}

public void testItemRemovedEvent_indexOfRemovedItem() {
IndexedContainer container = new IndexedContainer();
container.addItem();
Object secondItemId = container.addItem();
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
EasyMock.replay(removeListener);

container.removeItem(secondItemId);

assertEquals(1, capturedEvent.getValue().getFirstIndex());
}

public void testItemRemovedEvent_amountOfRemovedItems() {
IndexedContainer container = new IndexedContainer();
container.addItem();
container.addItem();
ItemSetChangeListener removeListener = createListenerMockFor(container);
Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(removeListener);
EasyMock.replay(removeListener);

container.removeAllItems();

assertEquals(2, capturedEvent.getValue().getRemovedItemsCount());
}

private Capture<ItemAddEvent> captureAddEvent(
ItemSetChangeListener addListener) {
Capture<ItemAddEvent> capturedEvent = new Capture<ItemAddEvent>();
addListener.containerItemSetChange(EasyMock.capture(capturedEvent));
return capturedEvent;
}

private Capture<ItemRemoveEvent> captureRemoveEvent(
ItemSetChangeListener removeListener) {
Capture<ItemRemoveEvent> capturedEvent = new Capture<ItemRemoveEvent>();
removeListener.containerItemSetChange(EasyMock.capture(capturedEvent));
return capturedEvent;
}

private ItemSetChangeListener createListenerMockFor(
IndexedContainer container) {
ItemSetChangeListener listener = EasyMock
.createNiceMock(ItemSetChangeListener.class);
container.addItemSetChangeListener(listener);
return listener;
}

// Ticket 8028
public void testGetItemIdsRangeIndexOutOfBounds() {
IndexedContainer ic = new IndexedContainer();

Loading…
Cancel
Save