package com.vaadin.v7.data.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Assert; import com.vaadin.v7.data.Container; import com.vaadin.v7.data.Container.Filterable; import com.vaadin.v7.data.Container.ItemSetChangeEvent; import com.vaadin.v7.data.Container.ItemSetChangeListener; import com.vaadin.v7.data.Container.Ordered; import com.vaadin.v7.data.Container.Sortable; import com.vaadin.v7.data.Item; import com.vaadin.v7.data.util.filter.SimpleStringFilter; public abstract class AbstractContainerTestBase { /** * Helper class for testing e.g. listeners expecting events to be fired. */ protected abstract static class AbstractEventCounter { private int eventCount = 0; private int lastAssertedEventCount = 0; /** * Increment the event count. To be called by subclasses e.g. from a * listener method. */ protected void increment() { ++eventCount; } /** * Check that no one event has occurred since the previous assert call. */ public void assertNone() { Assert.assertEquals(lastAssertedEventCount, eventCount); } /** * Check that exactly one event has occurred since the previous assert * call. */ public void assertOnce() { Assert.assertEquals(++lastAssertedEventCount, eventCount); } /** * Reset the counter and the expected count. */ public void reset() { eventCount = 0; lastAssertedEventCount = 0; } } /** * Test class for counting item set change events and verifying they have * been received. */ protected static class ItemSetChangeCounter extends AbstractEventCounter implements ItemSetChangeListener { @Override public void containerItemSetChange(ItemSetChangeEvent event) { increment(); } } // #6043: for items that have been filtered out, Container interface does // not specify what to return from getItem() and getContainerProperty(), so // need checkGetItemNull parameter for the test to be usable for most // current containers protected void validateContainer(Container container, Object expectedFirstItemId, Object expectedLastItemId, Object itemIdInSet, Object itemIdNotInSet, boolean checkGetItemNull, int expectedSize) { Container.Indexed indexed = null; if (container instanceof Container.Indexed) { indexed = (Container.Indexed) container; } List<Object> itemIdList = new ArrayList<Object>(container.getItemIds()); // size() assertEquals(expectedSize, container.size()); assertEquals(expectedSize, itemIdList.size()); // first item, last item Object first = itemIdList.get(0); Object last = itemIdList.get(itemIdList.size() - 1); assertEquals(expectedFirstItemId, first); assertEquals(expectedLastItemId, last); // containsId assertFalse(container.containsId(itemIdNotInSet)); assertTrue(container.containsId(itemIdInSet)); // getItem if (checkGetItemNull) { assertNull(container.getItem(itemIdNotInSet)); } assertNotNull(container.getItem(itemIdInSet)); // getContainerProperty for (Object propId : container.getContainerPropertyIds()) { if (checkGetItemNull) { assertNull( container.getContainerProperty(itemIdNotInSet, propId)); } assertNotNull(container.getContainerProperty(itemIdInSet, propId)); } if (indexed != null) { // firstItemId assertEquals(first, indexed.firstItemId()); // lastItemId assertEquals(last, indexed.lastItemId()); // nextItemId assertEquals(itemIdList.get(1), indexed.nextItemId(first)); // prevItemId assertEquals(itemIdList.get(itemIdList.size() - 2), indexed.prevItemId(last)); // isFirstId assertTrue(indexed.isFirstId(first)); assertFalse(indexed.isFirstId(last)); // isLastId assertTrue(indexed.isLastId(last)); assertFalse(indexed.isLastId(first)); // indexOfId assertEquals(0, indexed.indexOfId(first)); assertEquals(expectedSize - 1, indexed.indexOfId(last)); // getIdByIndex assertEquals(indexed.getIdByIndex(0), first); assertEquals(indexed.getIdByIndex(expectedSize - 1), last); } // getItemProperty Assert.assertNull( container.getItem(itemIdInSet).getItemProperty("notinset")); } protected static final Object FULLY_QUALIFIED_NAME = "fullyQualifiedName"; protected static final Object SIMPLE_NAME = "simpleName"; protected static final Object REVERSE_FULLY_QUALIFIED_NAME = "reverseFullyQualifiedName"; protected static final Object ID_NUMBER = "idNumber"; protected void testBasicContainerOperations(Container container) { initializeContainer(container); // Basic container validateContainer(container, sampleData[0], sampleData[sampleData.length - 1], sampleData[10], "abc", true, sampleData.length); validateRemovingItems(container); validateAddItem(container); if (container instanceof Container.Indexed) { validateAddItemAt((Container.Indexed) container); } if (container instanceof Container.Ordered) { validateAddItemAfter((Container.Ordered) container); } } protected void validateRemovingItems(Container container) { int sizeBeforeRemoving = container.size(); List<Object> itemIdList = new ArrayList<Object>(container.getItemIds()); // There should be at least four items in the list Object first = itemIdList.get(0); Object middle = itemIdList.get(2); Object last = itemIdList.get(itemIdList.size() - 1); container.removeItem(first); container.removeItem(middle); // Middle now that first has been removed container.removeItem(last); assertEquals(sizeBeforeRemoving - 3, container.size()); container.removeAllItems(); assertEquals(0, container.size()); } protected void validateAddItem(Container container) { try { container.removeAllItems(); Object id = container.addItem(); Assert.assertTrue(container.containsId(id)); Assert.assertNotNull(container.getItem(id)); Item item = container.addItem("foo"); Assert.assertNotNull(item); Assert.assertTrue(container.containsId("foo")); Assert.assertEquals(item, container.getItem("foo")); // Add again Item item2 = container.addItem("foo"); Assert.assertNull(item2); // Null is not a valid itemId Assert.assertNull(container.addItem(null)); } catch (UnsupportedOperationException e) { // Ignore contains which do not support addItem* } } protected void validateAddItemAt(Container.Indexed container) { try { container.removeAllItems(); Object id = container.addItemAt(0); Assert.assertTrue(container.containsId(id)); Assert.assertEquals(id, container.getIdByIndex(0)); Assert.assertNotNull(container.getItem(id)); Item item = container.addItemAt(0, "foo"); Assert.assertNotNull(item); Assert.assertTrue(container.containsId("foo")); Assert.assertEquals(item, container.getItem("foo")); Assert.assertEquals("foo", container.getIdByIndex(0)); Item itemAtEnd = container.addItemAt(2, "atend"); Assert.assertNotNull(itemAtEnd); Assert.assertTrue(container.containsId("atend")); Assert.assertEquals(itemAtEnd, container.getItem("atend")); Assert.assertEquals("atend", container.getIdByIndex(2)); // Add again Item item2 = container.addItemAt(0, "foo"); Assert.assertNull(item2); } catch (UnsupportedOperationException e) { // Ignore contains which do not support addItem* } } protected void validateAddItemAfter(Container.Ordered container) { if (container instanceof AbstractBeanContainer) { // Doesn't work as bean container requires beans return; } try { container.removeAllItems(); Assert.assertNotNull(container.addItem(0)); Item item = container.addItemAfter(null, "foo"); Assert.assertNotNull(item); Assert.assertTrue(container.containsId("foo")); Assert.assertEquals(item, container.getItem("foo")); Assert.assertEquals("foo", container.getItemIds().iterator().next()); Item itemAtEnd = container.addItemAfter(0, "atend"); Assert.assertNotNull(itemAtEnd); Assert.assertTrue(container.containsId("atend")); Assert.assertEquals(itemAtEnd, container.getItem("atend")); Iterator<?> i = container.getItemIds().iterator(); i.next(); i.next(); Assert.assertEquals("atend", i.next()); // Add again Assert.assertNull(container.addItemAfter(null, "foo")); Assert.assertNull(container.addItemAfter("atend", "foo")); Assert.assertNull(container.addItemAfter("nonexistant", "123123")); } catch (UnsupportedOperationException e) { // Ignore contains which do not support addItem* } } protected void testContainerOrdered(Container.Ordered container) { // addItem with empty container Object id = container.addItem(); assertOrderedContents(container, id); Item item = container.getItem(id); assertNotNull(item); // addItemAfter with empty container container.removeAllItems(); assertOrderedContents(container); id = container.addItemAfter(null); assertOrderedContents(container, id); item = container.getItem(id); assertNotNull(item); // Add a new item before the first // addItemAfter Object newFirstId = container.addItemAfter(null); assertOrderedContents(container, newFirstId, id); // addItemAfter(Object) Object newSecondItemId = container.addItemAfter(newFirstId); // order is now: newFirstId, newSecondItemId, id assertOrderedContents(container, newFirstId, newSecondItemId, id); // addItemAfter(Object,Object) String fourthId = "id of the fourth item"; Item fourth = container.addItemAfter(newFirstId, fourthId); // order is now: newFirstId, fourthId, newSecondItemId, id assertNotNull(fourth); assertEquals(fourth, container.getItem(fourthId)); assertOrderedContents(container, newFirstId, fourthId, newSecondItemId, id); // addItemAfter(Object,Object) Object fifthId = new Object(); Item fifth = container.addItemAfter(null, fifthId); // order is now: fifthId, newFirstId, fourthId, newSecondItemId, id assertNotNull(fifth); assertEquals(fifth, container.getItem(fifthId)); assertOrderedContents(container, fifthId, newFirstId, fourthId, newSecondItemId, id); // addItemAfter(Object,Object) Object sixthId = new Object(); Item sixth = container.addItemAfter(id, sixthId); // order is now: fifthId, newFirstId, fourthId, newSecondItemId, id, // sixthId assertNotNull(sixth); assertEquals(sixth, container.getItem(sixthId)); assertOrderedContents(container, fifthId, newFirstId, fourthId, newSecondItemId, id, sixthId); // Test order after removing first item 'fifthId' container.removeItem(fifthId); // order is now: newFirstId, fourthId, newSecondItemId, id, sixthId assertOrderedContents(container, newFirstId, fourthId, newSecondItemId, id, sixthId); // Test order after removing last item 'sixthId' container.removeItem(sixthId); // order is now: newFirstId, fourthId, newSecondItemId, id assertOrderedContents(container, newFirstId, fourthId, newSecondItemId, id); // Test order after removing item from the middle 'fourthId' container.removeItem(fourthId); // order is now: newFirstId, newSecondItemId, id assertOrderedContents(container, newFirstId, newSecondItemId, id); // Delete remaining items container.removeItem(newFirstId); container.removeItem(newSecondItemId); container.removeItem(id); assertOrderedContents(container); Object finalItem = container.addItem(); assertOrderedContents(container, finalItem); } private void assertOrderedContents(Ordered container, Object... ids) { assertEquals(ids.length, container.size()); for (int i = 0; i < ids.length - 1; i++) { assertNotNull("The item id should not be null", ids[i]); } if (ids.length == 0) { assertNull("The first id is wrong", container.firstItemId()); assertNull("The last id is wrong", container.lastItemId()); return; } assertEquals("The first id is wrong", ids[0], container.firstItemId()); assertEquals("The last id is wrong", ids[ids.length - 1], container.lastItemId()); // isFirstId & isLastId assertTrue(container.isFirstId(container.firstItemId())); assertTrue(container.isLastId(container.lastItemId())); // nextId Object ref = container.firstItemId(); for (int i = 1; i < ids.length; i++) { Object next = container.nextItemId(ref); assertEquals("The id after " + ref + " is wrong", ids[i], next); ref = next; } assertNull("The last id should not have a next id", container.nextItemId(ids[ids.length - 1])); assertNull(container.nextItemId("not-in-container")); // prevId ref = container.lastItemId(); for (int i = ids.length - 2; i >= 0; i--) { Object prev = container.prevItemId(ref); assertEquals("The id before " + ref + " is wrong", ids[i], prev); ref = prev; } assertNull("The first id should not have a prev id", container.prevItemId(ids[0])); assertNull(container.prevItemId("not-in-container")); } protected void testContainerIndexed(Container.Indexed container, Object itemId, int itemPosition, boolean testAddEmptyItemAt, Object newItemId, boolean testAddItemAtWithId) { initializeContainer(container); // indexOfId Assert.assertEquals(itemPosition, container.indexOfId(itemId)); // getIdByIndex Assert.assertEquals(itemId, container.getIdByIndex(itemPosition)); // addItemAt if (testAddEmptyItemAt) { Object addedId = container.addItemAt(itemPosition); Assert.assertEquals(itemPosition, container.indexOfId(addedId)); Assert.assertEquals(itemPosition + 1, container.indexOfId(itemId)); Assert.assertEquals(addedId, container.getIdByIndex(itemPosition)); Assert.assertEquals(itemId, container.getIdByIndex(itemPosition + 1)); Object newFirstId = container.addItemAt(0); Assert.assertEquals(0, container.indexOfId(newFirstId)); Assert.assertEquals(itemPosition + 2, container.indexOfId(itemId)); Assert.assertEquals(newFirstId, container.firstItemId()); Assert.assertEquals(newFirstId, container.getIdByIndex(0)); Assert.assertEquals(itemId, container.getIdByIndex(itemPosition + 2)); Object newLastId = container.addItemAt(container.size()); Assert.assertEquals(container.size() - 1, container.indexOfId(newLastId)); Assert.assertEquals(itemPosition + 2, container.indexOfId(itemId)); Assert.assertEquals(newLastId, container.lastItemId()); Assert.assertEquals(newLastId, container.getIdByIndex(container.size() - 1)); Assert.assertEquals(itemId, container.getIdByIndex(itemPosition + 2)); Assert.assertTrue(container.removeItem(addedId)); Assert.assertTrue(container.removeItem(newFirstId)); Assert.assertTrue(container.removeItem(newLastId)); Assert.assertFalse( "Removing non-existing item should indicate failure", container.removeItem(addedId)); } // addItemAt if (testAddItemAtWithId) { container.addItemAt(itemPosition, newItemId); Assert.assertEquals(itemPosition, container.indexOfId(newItemId)); Assert.assertEquals(itemPosition + 1, container.indexOfId(itemId)); Assert.assertEquals(newItemId, container.getIdByIndex(itemPosition)); Assert.assertEquals(itemId, container.getIdByIndex(itemPosition + 1)); Assert.assertTrue(container.removeItem(newItemId)); Assert.assertFalse(container.containsId(newItemId)); container.addItemAt(0, newItemId); Assert.assertEquals(0, container.indexOfId(newItemId)); Assert.assertEquals(itemPosition + 1, container.indexOfId(itemId)); Assert.assertEquals(newItemId, container.firstItemId()); Assert.assertEquals(newItemId, container.getIdByIndex(0)); Assert.assertEquals(itemId, container.getIdByIndex(itemPosition + 1)); Assert.assertTrue(container.removeItem(newItemId)); Assert.assertFalse(container.containsId(newItemId)); container.addItemAt(container.size(), newItemId); Assert.assertEquals(container.size() - 1, container.indexOfId(newItemId)); Assert.assertEquals(itemPosition, container.indexOfId(itemId)); Assert.assertEquals(newItemId, container.lastItemId()); Assert.assertEquals(newItemId, container.getIdByIndex(container.size() - 1)); Assert.assertEquals(itemId, container.getIdByIndex(itemPosition)); Assert.assertTrue(container.removeItem(newItemId)); Assert.assertFalse(container.containsId(newItemId)); } } protected void testContainerFiltering(Container.Filterable container) { initializeContainer(container); // Filter by "contains ab" SimpleStringFilter filter1 = new SimpleStringFilter( FULLY_QUALIFIED_NAME, "ab", false, false); container.addContainerFilter(filter1); assertTrue(container.getContainerFilters().size() == 1); assertEquals(filter1, container.getContainerFilters().iterator().next()); validateContainer(container, "com.vaadin.data.BufferedValidatable", "com.vaadin.ui.TabSheet", "com.vaadin.terminal.gwt.client.Focusable", "com.vaadin.data.Buffered", isFilteredOutItemNull(), 20); // Filter by "contains da" (reversed as ad here) container.removeAllContainerFilters(); assertTrue(container.getContainerFilters().isEmpty()); SimpleStringFilter filter2 = new SimpleStringFilter( REVERSE_FULLY_QUALIFIED_NAME, "ad", false, false); container.addContainerFilter(filter2); assertTrue(container.getContainerFilters().size() == 1); assertEquals(filter2, container.getContainerFilters().iterator().next()); validateContainer(container, "com.vaadin.data.Buffered", "com.vaadin.server.ComponentSizeValidator", "com.vaadin.data.util.IndexedContainer", "com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility", isFilteredOutItemNull(), 37); } /** * Override in subclasses to return false if the container getItem() method * returns a non-null value for an item that has been filtered out. * * @return */ protected boolean isFilteredOutItemNull() { return true; } protected void testContainerSortingAndFiltering( Container.Sortable sortable) { Filterable filterable = (Filterable) sortable; initializeContainer(sortable); // Filter by "contains ab" filterable.addContainerFilter(new SimpleStringFilter( FULLY_QUALIFIED_NAME, "ab", false, false)); // Must be able to sort based on PROP1 for this test assertTrue(sortable.getSortableContainerPropertyIds() .contains(FULLY_QUALIFIED_NAME)); sortable.sort(new Object[] { FULLY_QUALIFIED_NAME }, new boolean[] { true }); validateContainer(sortable, "com.vaadin.data.BufferedValidatable", "com.vaadin.ui.TableFieldFactory", "com.vaadin.ui.TableFieldFactory", "com.vaadin.data.util.BeanItem", isFilteredOutItemNull(), 20); } protected void testContainerSorting(Container.Filterable container) { Container.Sortable sortable = (Sortable) container; initializeContainer(container); // Must be able to sort based on PROP1 for this test assertTrue(sortable.getSortableContainerPropertyIds() .contains(FULLY_QUALIFIED_NAME)); assertTrue(sortable.getSortableContainerPropertyIds() .contains(REVERSE_FULLY_QUALIFIED_NAME)); sortable.sort(new Object[] { FULLY_QUALIFIED_NAME }, new boolean[] { true }); validateContainer(container, "com.vaadin.Application", "org.vaadin.test.LastClass", "com.vaadin.server.ApplicationResource", "blah", true, sampleData.length); sortable.sort(new Object[] { REVERSE_FULLY_QUALIFIED_NAME }, new boolean[] { true }); validateContainer(container, "com.vaadin.server.ApplicationPortlet2", "com.vaadin.data.util.ObjectProperty", "com.vaadin.ui.BaseFieldFactory", "blah", true, sampleData.length); } protected void initializeContainer(Container container) { Assert.assertTrue(container.removeAllItems()); Object[] propertyIds = container.getContainerPropertyIds().toArray(); for (Object propertyId : propertyIds) { container.removeContainerProperty(propertyId); } container.addContainerProperty(FULLY_QUALIFIED_NAME, String.class, ""); container.addContainerProperty(SIMPLE_NAME, String.class, ""); container.addContainerProperty(REVERSE_FULLY_QUALIFIED_NAME, String.class, null); container.addContainerProperty(ID_NUMBER, Integer.class, null); for (int i = 0; i < sampleData.length; i++) { String id = sampleData[i]; Item item = container.addItem(id); item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(sampleData[i]); item.getItemProperty(SIMPLE_NAME) .setValue(getSimpleName(sampleData[i])); item.getItemProperty(REVERSE_FULLY_QUALIFIED_NAME) .setValue(reverse(sampleData[i])); item.getItemProperty(ID_NUMBER).setValue(i); } } protected static String getSimpleName(String name) { if (name.contains(".")) { return name.substring(name.lastIndexOf('.') + 1); } else { return name; } } protected static String reverse(String string) { return new StringBuilder(string).reverse().toString(); } protected final String[] sampleData = { "com.vaadin.annotations.AutoGenerated", "com.vaadin.Application", "com.vaadin.data.Buffered", "com.vaadin.data.BufferedValidatable", "com.vaadin.data.Container", "com.vaadin.data.Item", "com.vaadin.data.Property", "com.vaadin.data.util.BeanItem", "com.vaadin.data.util.BeanItemContainer", "com.vaadin.data.util.ContainerHierarchicalWrapper", "com.vaadin.data.util.ContainerOrderedWrapper", "com.vaadin.data.util.DefaultItemSorter", "com.vaadin.data.util.FilesystemContainer", "com.vaadin.data.util.Filter", "com.vaadin.data.util.HierarchicalContainer", "com.vaadin.data.util.IndexedContainer", "com.vaadin.data.util.ItemSorter", "com.vaadin.data.util.MethodProperty", "com.vaadin.data.util.ObjectProperty", "com.vaadin.data.util.PropertyFormatter", "com.vaadin.data.util.PropertysetItem", "com.vaadin.data.util.QueryContainer", "com.vaadin.data.util.TextFileProperty", "com.vaadin.data.Validatable", "com.vaadin.data.validator.AbstractStringValidator", "com.vaadin.data.validator.AbstractValidator", "com.vaadin.data.validator.CompositeValidator", "com.vaadin.data.validator.DoubleValidator", "com.vaadin.data.validator.EmailValidator", "com.vaadin.data.validator.IntegerValidator", "com.vaadin.data.validator.NullValidator", "com.vaadin.data.validator.RegexpValidator", "com.vaadin.data.validator.StringLengthValidator", "com.vaadin.data.Validator", "com.vaadin.event.Action", "com.vaadin.event.ComponentEventListener", "com.vaadin.event.EventRouter", "com.vaadin.event.FieldEvents", "com.vaadin.event.ItemClickEvent", "com.vaadin.event.LayoutEvents", "com.vaadin.event.ListenerMethod", "com.vaadin.event.MethodEventSource", "com.vaadin.event.MouseEvents", "com.vaadin.event.ShortcutAction", "com.vaadin.launcher.DemoLauncher", "com.vaadin.launcher.DevelopmentServerLauncher", "com.vaadin.launcher.util.BrowserLauncher", "com.vaadin.service.ApplicationContext", "com.vaadin.service.FileTypeResolver", "com.vaadin.server.ApplicationResource", "com.vaadin.server.ClassResource", "com.vaadin.server.CompositeErrorMessage", "com.vaadin.server.DownloadStream", "com.vaadin.server.ErrorMessage", "com.vaadin.server.ExternalResource", "com.vaadin.server.FileResource", "com.vaadin.terminal.gwt.client.ApplicationConfiguration", "com.vaadin.terminal.gwt.client.ApplicationConnection", "com.vaadin.terminal.gwt.client.BrowserInfo", "com.vaadin.terminal.gwt.client.ClientExceptionHandler", "com.vaadin.terminal.gwt.client.ComponentDetail", "com.vaadin.terminal.gwt.client.ComponentDetailMap", "com.vaadin.terminal.gwt.client.ComponentLocator", "com.vaadin.terminal.gwt.client.Console", "com.vaadin.terminal.gwt.client.Container", "com.vaadin.terminal.gwt.client.ContainerResizedListener", "com.vaadin.terminal.gwt.client.CSSRule", "com.vaadin.terminal.gwt.client.DateTimeService", "com.vaadin.terminal.gwt.client.DefaultWidgetSet", "com.vaadin.terminal.gwt.client.Focusable", "com.vaadin.terminal.gwt.client.HistoryImplIEVaadin", "com.vaadin.terminal.gwt.client.LocaleNotLoadedException", "com.vaadin.terminal.gwt.client.LocaleService", "com.vaadin.terminal.gwt.client.MouseEventDetails", "com.vaadin.terminal.gwt.client.NullConsole", "com.vaadin.terminal.gwt.client.Paintable", "com.vaadin.terminal.gwt.client.RenderInformation", "com.vaadin.terminal.gwt.client.RenderSpace", "com.vaadin.terminal.gwt.client.StyleConstants", "com.vaadin.terminal.gwt.client.TooltipInfo", "com.vaadin.terminal.gwt.client.ui.Action", "com.vaadin.terminal.gwt.client.ui.ActionOwner", "com.vaadin.terminal.gwt.client.ui.AlignmentInfo", "com.vaadin.terminal.gwt.client.ui.CalendarEntry", "com.vaadin.terminal.gwt.client.ui.ClickEventHandler", "com.vaadin.terminal.gwt.client.ui.Field", "com.vaadin.terminal.gwt.client.ui.Icon", "com.vaadin.terminal.gwt.client.ui.layout.CellBasedLayout", "com.vaadin.terminal.gwt.client.ui.layout.ChildComponentContainer", "com.vaadin.terminal.gwt.client.ui.layout.Margins", "com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler", "com.vaadin.terminal.gwt.client.ui.MenuBar", "com.vaadin.terminal.gwt.client.ui.MenuItem", "com.vaadin.terminal.gwt.client.ui.richtextarea.VRichTextToolbar", "com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler", "com.vaadin.terminal.gwt.client.ui.SubPartAware", "com.vaadin.terminal.gwt.client.ui.Table", "com.vaadin.terminal.gwt.client.ui.TreeAction", "com.vaadin.terminal.gwt.client.ui.TreeImages", "com.vaadin.terminal.gwt.client.ui.VAbsoluteLayout", "com.vaadin.terminal.gwt.client.ui.VAccordion", "com.vaadin.terminal.gwt.client.ui.VButton", "com.vaadin.terminal.gwt.client.ui.VCalendarPanel", "com.vaadin.terminal.gwt.client.ui.VCheckBox", "com.vaadin.terminal.gwt.client.ui.VContextMenu", "com.vaadin.terminal.gwt.client.ui.VCssLayout", "com.vaadin.terminal.gwt.client.ui.VCustomComponent", "com.vaadin.terminal.gwt.client.ui.VCustomLayout", "com.vaadin.terminal.gwt.client.ui.VDateField", "com.vaadin.terminal.gwt.client.ui.VDateFieldCalendar", "com.vaadin.terminal.gwt.client.ui.VEmbedded", "com.vaadin.terminal.gwt.client.ui.VFilterSelect", "com.vaadin.terminal.gwt.client.ui.VForm", "com.vaadin.terminal.gwt.client.ui.VFormLayout", "com.vaadin.terminal.gwt.client.ui.VGridLayout", "com.vaadin.terminal.gwt.client.ui.VHorizontalLayout", "com.vaadin.terminal.gwt.client.ui.VLabel", "com.vaadin.terminal.gwt.client.ui.VLink", "com.vaadin.terminal.gwt.client.ui.VListSelect", "com.vaadin.terminal.gwt.client.ui.VMarginInfo", "com.vaadin.terminal.gwt.client.ui.VMenuBar", "com.vaadin.terminal.gwt.client.ui.VNativeButton", "com.vaadin.terminal.gwt.client.ui.VNativeSelect", "com.vaadin.terminal.gwt.client.ui.VNotification", "com.vaadin.terminal.gwt.client.ui.VOptionGroup", "com.vaadin.terminal.gwt.client.ui.VOptionGroupBase", "com.vaadin.terminal.gwt.client.ui.VOrderedLayout", "com.vaadin.terminal.gwt.client.ui.VOverlay", "com.vaadin.terminal.gwt.client.ui.VPanel", "com.vaadin.terminal.gwt.client.ui.VPasswordField", "com.vaadin.terminal.gwt.client.ui.VPopupCalendar", "com.vaadin.terminal.gwt.client.ui.VPopupView", "com.vaadin.terminal.gwt.client.ui.VProgressIndicator", "com.vaadin.terminal.gwt.client.ui.VRichTextArea", "com.vaadin.terminal.gwt.client.ui.VScrollTable", "com.vaadin.terminal.gwt.client.ui.VSlider", "com.vaadin.terminal.gwt.client.ui.VSplitPanel", "com.vaadin.terminal.gwt.client.ui.VSplitPanelHorizontal", "com.vaadin.terminal.gwt.client.ui.VSplitPanelVertical", "com.vaadin.terminal.gwt.client.ui.VTablePaging", "com.vaadin.terminal.gwt.client.ui.VTabsheet", "com.vaadin.terminal.gwt.client.ui.VTabsheetBase", "com.vaadin.terminal.gwt.client.ui.VTabsheetPanel", "com.vaadin.terminal.gwt.client.ui.VTextArea", "com.vaadin.terminal.gwt.client.ui.VTextField", "com.vaadin.terminal.gwt.client.ui.VTextualDate", "com.vaadin.terminal.gwt.client.ui.VTime", "com.vaadin.terminal.gwt.client.ui.VTree", "com.vaadin.terminal.gwt.client.ui.VTwinColSelect", "com.vaadin.terminal.gwt.client.ui.VUnknownComponent", "com.vaadin.terminal.gwt.client.ui.VUpload", "com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility", "com.vaadin.terminal.gwt.client.ui.VVerticalLayout", "com.vaadin.terminal.gwt.client.ui.VView", "com.vaadin.terminal.gwt.client.ui.VWindow", "com.vaadin.terminal.gwt.client.UIDL", "com.vaadin.terminal.gwt.client.Util", "com.vaadin.terminal.gwt.client.ValueMap", "com.vaadin.terminal.gwt.client.VCaption", "com.vaadin.terminal.gwt.client.VCaptionWrapper", "com.vaadin.terminal.gwt.client.VDebugConsole", "com.vaadin.terminal.gwt.client.VErrorMessage", "com.vaadin.terminal.gwt.client.VTooltip", "com.vaadin.terminal.gwt.client.VUIDLBrowser", "com.vaadin.terminal.gwt.client.WidgetMap", "com.vaadin.terminal.gwt.client.WidgetSet", "com.vaadin.server.AbstractApplicationPortlet", "com.vaadin.server.AbstractApplicationServlet", "com.vaadin.server.AbstractCommunicationManager", "com.vaadin.server.AbstractWebApplicationContext", "com.vaadin.server.ApplicationPortlet", "com.vaadin.server.ApplicationPortlet2", "com.vaadin.server.ApplicationRunnerServlet", "com.vaadin.server.ApplicationServlet", "com.vaadin.server.ChangeVariablesErrorEvent", "com.vaadin.server.CommunicationManager", "com.vaadin.server.ComponentSizeValidator", "com.vaadin.server.Constants", "com.vaadin.server.GAEApplicationServlet", "com.vaadin.server.HttpServletRequestListener", "com.vaadin.server.HttpUploadStream", "com.vaadin.server.JsonPaintTarget", "com.vaadin.server.PortletApplicationContext", "com.vaadin.server.PortletApplicationContext2", "com.vaadin.server.PortletCommunicationManager", "com.vaadin.server.PortletRequestListener", "com.vaadin.server.RestrictedRenderResponse", "com.vaadin.server.SessionExpiredException", "com.vaadin.server.SystemMessageException", "com.vaadin.server.WebApplicationContext", "com.vaadin.server.WebBrowser", "com.vaadin.server.widgetsetutils.ClassPathExplorer", "com.vaadin.server.widgetsetutils.WidgetMapGenerator", "com.vaadin.server.widgetsetutils.WidgetSetBuilder", "com.vaadin.server.KeyMapper", "com.vaadin.server.Paintable", "com.vaadin.server.PaintException", "com.vaadin.server.PaintTarget", "com.vaadin.server.ParameterHandler", "com.vaadin.server.Resource", "com.vaadin.server.Scrollable", "com.vaadin.server.Sizeable", "com.vaadin.server.StreamResource", "com.vaadin.server.SystemError", "com.vaadin.server.Terminal", "com.vaadin.server.ThemeResource", "com.vaadin.server.UploadStream", "com.vaadin.server.URIHandler", "com.vaadin.server.UserError", "com.vaadin.server.VariableOwner", "com.vaadin.tools.ReflectTools", "com.vaadin.tools.WidgetsetCompiler", "com.vaadin.ui.AbsoluteLayout", "com.vaadin.ui.AbstractComponent", "com.vaadin.ui.AbstractComponentContainer", "com.vaadin.ui.AbstractField", "com.vaadin.ui.AbstractLayout", "com.vaadin.ui.AbstractOrderedLayout", "com.vaadin.ui.AbstractSelect", "com.vaadin.ui.Accordion", "com.vaadin.ui.Alignment", "com.vaadin.ui.AlignmentUtils", "com.vaadin.ui.BaseFieldFactory", "com.vaadin.ui.Button", "com.vaadin.ui.CheckBox", "com.vaadin.ui.ClientWidget", "com.vaadin.ui.ComboBox", "com.vaadin.ui.Component", "com.vaadin.ui.ComponentContainer", "com.vaadin.ui.CssLayout", "com.vaadin.ui.CustomComponent", "com.vaadin.ui.CustomLayout", "com.vaadin.ui.DateField", "com.vaadin.ui.DefaultFieldFactory", "com.vaadin.ui.Embedded", "com.vaadin.ui.ExpandLayout", "com.vaadin.ui.Field", "com.vaadin.ui.FieldFactory", "com.vaadin.ui.Form", "com.vaadin.ui.FormFieldFactory", "com.vaadin.ui.FormLayout", "com.vaadin.ui.GridLayout", "com.vaadin.ui.HorizontalLayout", "com.vaadin.ui.InlineDateField", "com.vaadin.ui.Label", "com.vaadin.ui.Layout", "com.vaadin.ui.Link", "com.vaadin.ui.ListSelect", "com.vaadin.ui.LoginForm", "com.vaadin.ui.MenuBar", "com.vaadin.ui.NativeButton", "com.vaadin.ui.NativeSelect", "com.vaadin.ui.OptionGroup", "com.vaadin.ui.OrderedLayout", "com.vaadin.ui.Panel", "com.vaadin.ui.PopupDateField", "com.vaadin.ui.PopupView", "com.vaadin.ui.ProgressIndicator", "com.vaadin.ui.RichTextArea", "com.vaadin.ui.Select", "com.vaadin.ui.Slider", "com.vaadin.ui.SplitPanel", "com.vaadin.ui.Table", "com.vaadin.ui.TableFieldFactory", "com.vaadin.ui.TabSheet", "com.vaadin.ui.TextField", "com.vaadin.ui.Tree", "com.vaadin.ui.TwinColSelect", "com.vaadin.ui.Upload", "com.vaadin.ui.UriFragmentUtility", "com.vaadin.ui.VerticalLayout", "com.vaadin.ui.Window", "com.vaadin.util.SerializerHelper", "org.vaadin.test.LastClass" }; }