--- /dev/null
+package com.vaadin.tests.server.container;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import junit.framework.TestCase;\r
+\r
+import com.vaadin.data.Container;\r
+import com.vaadin.data.Item;\r
+import com.vaadin.data.Container.Filterable;\r
+import com.vaadin.data.Container.Sortable;\r
+\r
+public abstract class AbstractContainerTest extends TestCase {\r
+\r
+ protected void validateContainer(Container container,\r
+ Object expectedFirstItemId, Object expectedLastItemId,\r
+ Object itemIdInSet, Object itemIdNotInSet, int expectedSize) {\r
+ Container.Indexed indexed = null;\r
+ if (container instanceof Container.Indexed) {\r
+ indexed = (Container.Indexed) container;\r
+ }\r
+\r
+ List<Object> itemIdList = new ArrayList<Object>(container.getItemIds());\r
+\r
+ // size()\r
+ assertEquals(expectedSize, container.size());\r
+ assertEquals(expectedSize, itemIdList.size());\r
+\r
+ // first item, last item\r
+ Object first = itemIdList.get(0);\r
+ Object last = itemIdList.get(itemIdList.size() - 1);\r
+\r
+ assertEquals(expectedFirstItemId, first);\r
+ assertEquals(expectedLastItemId, last);\r
+\r
+ // containsId\r
+ assertFalse(container.containsId(itemIdNotInSet));\r
+ assertTrue(container.containsId(itemIdInSet));\r
+\r
+ // getItem\r
+ assertNull(container.getItem(itemIdNotInSet));\r
+ assertNotNull(container.getItem(itemIdInSet));\r
+\r
+ // getContainerProperty\r
+ for (Object propId : container.getContainerPropertyIds()) {\r
+ assertNull(container.getContainerProperty(itemIdNotInSet, propId));\r
+ assertNotNull(container.getContainerProperty(itemIdInSet, propId));\r
+ }\r
+\r
+ if (indexed != null) {\r
+ // firstItemId\r
+ assertEquals(first, indexed.firstItemId());\r
+\r
+ // lastItemId\r
+ assertEquals(last, indexed.lastItemId());\r
+\r
+ // nextItemId\r
+ assertEquals(itemIdList.get(1), indexed.nextItemId(first));\r
+\r
+ // prevItemId\r
+ assertEquals(itemIdList.get(itemIdList.size() - 2), indexed\r
+ .prevItemId(last));\r
+\r
+ // isFirstId\r
+ assertTrue(indexed.isFirstId(first));\r
+ assertFalse(indexed.isFirstId(last));\r
+\r
+ // isLastId\r
+ assertTrue(indexed.isLastId(last));\r
+ assertFalse(indexed.isLastId(first));\r
+\r
+ // indexOfId\r
+ assertEquals(0, indexed.indexOfId(first));\r
+ assertEquals(expectedSize - 1, indexed.indexOfId(last));\r
+\r
+ // getIdByIndex\r
+ assertEquals(indexed.getIdByIndex(0), first);\r
+ assertEquals(indexed.getIdByIndex(expectedSize - 1), last);\r
+\r
+ }\r
+\r
+ }\r
+\r
+ protected static final Object PROP1 = "PROP1";\r
+ protected static final Object PROP2 = "PROP2";\r
+ protected static final Object PROP3 = "PROP3";\r
+\r
+ protected void testBasicContainerOperations(Container.Filterable container) {\r
+ initializeContainer(container);\r
+\r
+ // Basic container\r
+ validateContainer(container, sampleData[0],\r
+ sampleData[sampleData.length - 1], sampleData[10], "abc",\r
+ sampleData.length);\r
+ }\r
+\r
+ protected void testContainerFiltering(Container.Filterable container) {\r
+ initializeContainer(container);\r
+\r
+ // Filter by "contains ab"\r
+ container.addContainerFilter(PROP1, "ab", false, false);\r
+\r
+ validateContainer(container, "com.vaadin.data.BufferedValidatable",\r
+ "com.vaadin.ui.TabSheet",\r
+ "com.vaadin.terminal.gwt.client.Focusable",\r
+ "com.vaadin.data.Buffered", 20);\r
+\r
+ // Filter by "contains da" (reversed as ad here)\r
+ container.removeAllContainerFilters();\r
+ container.addContainerFilter(PROP2, "ad", false, false);\r
+\r
+ validateContainer(container, "com.vaadin.data.Buffered",\r
+ "com.vaadin.terminal.gwt.server.ComponentSizeValidator",\r
+ "com.vaadin.data.util.IndexedContainer",\r
+ "com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility", 37);\r
+ }\r
+\r
+ protected void testContainerSortingAndFiltering(Container.Sortable sortable) {\r
+ Filterable filterable = (Filterable) sortable;\r
+\r
+ initializeContainer(sortable);\r
+\r
+ // Filter by "contains ab"\r
+ filterable.addContainerFilter(PROP1, "ab", false, false);\r
+\r
+ // Must be able to sort based on PROP1 for this test\r
+ assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP1));\r
+\r
+ sortable.sort(new Object[] { PROP1 }, new boolean[] { true });\r
+\r
+ validateContainer(sortable, "com.vaadin.data.BufferedValidatable",\r
+ "com.vaadin.ui.TableFieldFactory",\r
+ "com.vaadin.ui.TableFieldFactory",\r
+ "com.vaadin.data.util.BeanItem", 20);\r
+ }\r
+\r
+ protected void testContainerSorting(Container.Filterable container) {\r
+ Container.Sortable sortable = (Sortable) container;\r
+\r
+ initializeContainer(container);\r
+\r
+ // Must be able to sort based on PROP1 for this test\r
+ assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP1));\r
+ assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP2));\r
+\r
+ sortable.sort(new Object[] { PROP1 }, new boolean[] { true });\r
+\r
+ validateContainer(container, "com.vaadin.Application",\r
+ "com.vaadin.util.SerializerHelper",\r
+ "com.vaadin.terminal.ApplicationResource", "blah",\r
+ sampleData.length);\r
+\r
+ sortable.sort(new Object[] { PROP2 }, new boolean[] { true });\r
+\r
+ validateContainer(container,\r
+ "com.vaadin.terminal.gwt.server.ApplicationPortlet2",\r
+ "com.vaadin.data.util.ObjectProperty",\r
+ "com.vaadin.ui.BaseFieldFactory", "blah", sampleData.length);\r
+\r
+ }\r
+\r
+ protected void initializeContainer(Container container) {\r
+ container.removeAllItems();\r
+ Object[] propertyIds = container.getContainerPropertyIds().toArray();\r
+ for (Object propertyId : propertyIds) {\r
+ container.removeContainerProperty(propertyId);\r
+ }\r
+\r
+ container.addContainerProperty(PROP1, String.class, "");\r
+ container.addContainerProperty(PROP2, String.class, null);\r
+ container.addContainerProperty(PROP3, Integer.class, null);\r
+\r
+ for (int i = 0; i < sampleData.length; i++) {\r
+ String id = sampleData[i];\r
+ Item item = container.addItem(id);\r
+\r
+ item.getItemProperty(PROP1).setValue(sampleData[i]);\r
+ item.getItemProperty(PROP2).setValue(reverse(sampleData[i]));\r
+ item.getItemProperty(PROP3).setValue(i);\r
+ }\r
+ }\r
+\r
+ protected static String reverse(String string) {\r
+ return new StringBuilder(string).reverse().toString();\r
+ }\r
+\r
+ protected final String[] sampleData = {\r
+ "com.vaadin.annotations.AutoGenerated", "com.vaadin.Application",\r
+ "com.vaadin.data.Buffered", "com.vaadin.data.BufferedValidatable",\r
+ "com.vaadin.data.Container", "com.vaadin.data.Item",\r
+ "com.vaadin.data.Property", "com.vaadin.data.util.BeanItem",\r
+ "com.vaadin.data.util.BeanItemContainer",\r
+ "com.vaadin.data.util.ContainerHierarchicalWrapper",\r
+ "com.vaadin.data.util.ContainerOrderedWrapper",\r
+ "com.vaadin.data.util.DefaultItemSorter",\r
+ "com.vaadin.data.util.FilesystemContainer",\r
+ "com.vaadin.data.util.Filter",\r
+ "com.vaadin.data.util.HierarchicalContainer",\r
+ "com.vaadin.data.util.IndexedContainer",\r
+ "com.vaadin.data.util.ItemSorter",\r
+ "com.vaadin.data.util.MethodProperty",\r
+ "com.vaadin.data.util.ObjectProperty",\r
+ "com.vaadin.data.util.PropertyFormatter",\r
+ "com.vaadin.data.util.PropertysetItem",\r
+ "com.vaadin.data.util.QueryContainer",\r
+ "com.vaadin.data.util.TextFileProperty",\r
+ "com.vaadin.data.Validatable",\r
+ "com.vaadin.data.validator.AbstractStringValidator",\r
+ "com.vaadin.data.validator.AbstractValidator",\r
+ "com.vaadin.data.validator.CompositeValidator",\r
+ "com.vaadin.data.validator.DoubleValidator",\r
+ "com.vaadin.data.validator.EmailValidator",\r
+ "com.vaadin.data.validator.IntegerValidator",\r
+ "com.vaadin.data.validator.NullValidator",\r
+ "com.vaadin.data.validator.RegexpValidator",\r
+ "com.vaadin.data.validator.StringLengthValidator",\r
+ "com.vaadin.data.Validator", "com.vaadin.event.Action",\r
+ "com.vaadin.event.ComponentEventListener",\r
+ "com.vaadin.event.EventRouter", "com.vaadin.event.FieldEvents",\r
+ "com.vaadin.event.ItemClickEvent", "com.vaadin.event.LayoutEvents",\r
+ "com.vaadin.event.ListenerMethod",\r
+ "com.vaadin.event.MethodEventSource",\r
+ "com.vaadin.event.MouseEvents", "com.vaadin.event.ShortcutAction",\r
+ "com.vaadin.launcher.DemoLauncher",\r
+ "com.vaadin.launcher.DevelopmentServerLauncher",\r
+ "com.vaadin.launcher.util.BrowserLauncher",\r
+ "com.vaadin.service.ApplicationContext",\r
+ "com.vaadin.service.FileTypeResolver",\r
+ "com.vaadin.terminal.ApplicationResource",\r
+ "com.vaadin.terminal.ClassResource",\r
+ "com.vaadin.terminal.CompositeErrorMessage",\r
+ "com.vaadin.terminal.DownloadStream",\r
+ "com.vaadin.terminal.ErrorMessage",\r
+ "com.vaadin.terminal.ExternalResource",\r
+ "com.vaadin.terminal.FileResource",\r
+ "com.vaadin.terminal.gwt.client.ApplicationConfiguration",\r
+ "com.vaadin.terminal.gwt.client.ApplicationConnection",\r
+ "com.vaadin.terminal.gwt.client.BrowserInfo",\r
+ "com.vaadin.terminal.gwt.client.ClientExceptionHandler",\r
+ "com.vaadin.terminal.gwt.client.ComponentDetail",\r
+ "com.vaadin.terminal.gwt.client.ComponentDetailMap",\r
+ "com.vaadin.terminal.gwt.client.ComponentLocator",\r
+ "com.vaadin.terminal.gwt.client.Console",\r
+ "com.vaadin.terminal.gwt.client.Container",\r
+ "com.vaadin.terminal.gwt.client.ContainerResizedListener",\r
+ "com.vaadin.terminal.gwt.client.CSSRule",\r
+ "com.vaadin.terminal.gwt.client.DateTimeService",\r
+ "com.vaadin.terminal.gwt.client.DefaultWidgetSet",\r
+ "com.vaadin.terminal.gwt.client.Focusable",\r
+ "com.vaadin.terminal.gwt.client.HistoryImplIEVaadin",\r
+ "com.vaadin.terminal.gwt.client.LocaleNotLoadedException",\r
+ "com.vaadin.terminal.gwt.client.LocaleService",\r
+ "com.vaadin.terminal.gwt.client.MouseEventDetails",\r
+ "com.vaadin.terminal.gwt.client.NullConsole",\r
+ "com.vaadin.terminal.gwt.client.Paintable",\r
+ "com.vaadin.terminal.gwt.client.RenderInformation",\r
+ "com.vaadin.terminal.gwt.client.RenderSpace",\r
+ "com.vaadin.terminal.gwt.client.StyleConstants",\r
+ "com.vaadin.terminal.gwt.client.TooltipInfo",\r
+ "com.vaadin.terminal.gwt.client.ui.Action",\r
+ "com.vaadin.terminal.gwt.client.ui.ActionOwner",\r
+ "com.vaadin.terminal.gwt.client.ui.AlignmentInfo",\r
+ "com.vaadin.terminal.gwt.client.ui.CalendarEntry",\r
+ "com.vaadin.terminal.gwt.client.ui.ClickEventHandler",\r
+ "com.vaadin.terminal.gwt.client.ui.Field",\r
+ "com.vaadin.terminal.gwt.client.ui.Icon",\r
+ "com.vaadin.terminal.gwt.client.ui.layout.CellBasedLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.layout.ChildComponentContainer",\r
+ "com.vaadin.terminal.gwt.client.ui.layout.Margins",\r
+ "com.vaadin.terminal.gwt.client.ui.LayoutClickEventHandler",\r
+ "com.vaadin.terminal.gwt.client.ui.MenuBar",\r
+ "com.vaadin.terminal.gwt.client.ui.MenuItem",\r
+ "com.vaadin.terminal.gwt.client.ui.richtextarea.VRichTextArea",\r
+ "com.vaadin.terminal.gwt.client.ui.richtextarea.VRichTextToolbar",\r
+ "com.vaadin.terminal.gwt.client.ui.ShortcutActionHandler",\r
+ "com.vaadin.terminal.gwt.client.ui.SubPartAware",\r
+ "com.vaadin.terminal.gwt.client.ui.Table",\r
+ "com.vaadin.terminal.gwt.client.ui.TreeAction",\r
+ "com.vaadin.terminal.gwt.client.ui.TreeImages",\r
+ "com.vaadin.terminal.gwt.client.ui.VAbsoluteLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.VAccordion",\r
+ "com.vaadin.terminal.gwt.client.ui.VButton",\r
+ "com.vaadin.terminal.gwt.client.ui.VCalendarPanel",\r
+ "com.vaadin.terminal.gwt.client.ui.VCheckBox",\r
+ "com.vaadin.terminal.gwt.client.ui.VContextMenu",\r
+ "com.vaadin.terminal.gwt.client.ui.VCssLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.VCustomComponent",\r
+ "com.vaadin.terminal.gwt.client.ui.VCustomLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.VDateField",\r
+ "com.vaadin.terminal.gwt.client.ui.VDateFieldCalendar",\r
+ "com.vaadin.terminal.gwt.client.ui.VEmbedded",\r
+ "com.vaadin.terminal.gwt.client.ui.VFilterSelect",\r
+ "com.vaadin.terminal.gwt.client.ui.VForm",\r
+ "com.vaadin.terminal.gwt.client.ui.VFormLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.VGridLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.VHorizontalLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.VLabel",\r
+ "com.vaadin.terminal.gwt.client.ui.VLink",\r
+ "com.vaadin.terminal.gwt.client.ui.VListSelect",\r
+ "com.vaadin.terminal.gwt.client.ui.VMarginInfo",\r
+ "com.vaadin.terminal.gwt.client.ui.VMenuBar",\r
+ "com.vaadin.terminal.gwt.client.ui.VNativeButton",\r
+ "com.vaadin.terminal.gwt.client.ui.VNativeSelect",\r
+ "com.vaadin.terminal.gwt.client.ui.VNotification",\r
+ "com.vaadin.terminal.gwt.client.ui.VOptionGroup",\r
+ "com.vaadin.terminal.gwt.client.ui.VOptionGroupBase",\r
+ "com.vaadin.terminal.gwt.client.ui.VOrderedLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.VOverlay",\r
+ "com.vaadin.terminal.gwt.client.ui.VPanel",\r
+ "com.vaadin.terminal.gwt.client.ui.VPasswordField",\r
+ "com.vaadin.terminal.gwt.client.ui.VPopupCalendar",\r
+ "com.vaadin.terminal.gwt.client.ui.VPopupView",\r
+ "com.vaadin.terminal.gwt.client.ui.VProgressIndicator",\r
+ "com.vaadin.terminal.gwt.client.ui.VScrollTable",\r
+ "com.vaadin.terminal.gwt.client.ui.VSlider",\r
+ "com.vaadin.terminal.gwt.client.ui.VSplitPanel",\r
+ "com.vaadin.terminal.gwt.client.ui.VSplitPanelHorizontal",\r
+ "com.vaadin.terminal.gwt.client.ui.VSplitPanelVertical",\r
+ "com.vaadin.terminal.gwt.client.ui.VTablePaging",\r
+ "com.vaadin.terminal.gwt.client.ui.VTabsheet",\r
+ "com.vaadin.terminal.gwt.client.ui.VTabsheetBase",\r
+ "com.vaadin.terminal.gwt.client.ui.VTabsheetPanel",\r
+ "com.vaadin.terminal.gwt.client.ui.VTextArea",\r
+ "com.vaadin.terminal.gwt.client.ui.VTextField",\r
+ "com.vaadin.terminal.gwt.client.ui.VTextualDate",\r
+ "com.vaadin.terminal.gwt.client.ui.VTime",\r
+ "com.vaadin.terminal.gwt.client.ui.VTree",\r
+ "com.vaadin.terminal.gwt.client.ui.VTwinColSelect",\r
+ "com.vaadin.terminal.gwt.client.ui.VUnknownComponent",\r
+ "com.vaadin.terminal.gwt.client.ui.VUpload",\r
+ "com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility",\r
+ "com.vaadin.terminal.gwt.client.ui.VVerticalLayout",\r
+ "com.vaadin.terminal.gwt.client.ui.VView",\r
+ "com.vaadin.terminal.gwt.client.ui.VWindow",\r
+ "com.vaadin.terminal.gwt.client.UIDL",\r
+ "com.vaadin.terminal.gwt.client.Util",\r
+ "com.vaadin.terminal.gwt.client.ValueMap",\r
+ "com.vaadin.terminal.gwt.client.VCaption",\r
+ "com.vaadin.terminal.gwt.client.VCaptionWrapper",\r
+ "com.vaadin.terminal.gwt.client.VDebugConsole",\r
+ "com.vaadin.terminal.gwt.client.VErrorMessage",\r
+ "com.vaadin.terminal.gwt.client.VTooltip",\r
+ "com.vaadin.terminal.gwt.client.VUIDLBrowser",\r
+ "com.vaadin.terminal.gwt.client.WidgetMap",\r
+ "com.vaadin.terminal.gwt.client.WidgetSet",\r
+ "com.vaadin.terminal.gwt.server.AbstractApplicationPortlet",\r
+ "com.vaadin.terminal.gwt.server.AbstractApplicationServlet",\r
+ "com.vaadin.terminal.gwt.server.AbstractCommunicationManager",\r
+ "com.vaadin.terminal.gwt.server.AbstractWebApplicationContext",\r
+ "com.vaadin.terminal.gwt.server.ApplicationPortlet",\r
+ "com.vaadin.terminal.gwt.server.ApplicationPortlet2",\r
+ "com.vaadin.terminal.gwt.server.ApplicationRunnerServlet",\r
+ "com.vaadin.terminal.gwt.server.ApplicationServlet",\r
+ "com.vaadin.terminal.gwt.server.ChangeVariablesErrorEvent",\r
+ "com.vaadin.terminal.gwt.server.CommunicationManager",\r
+ "com.vaadin.terminal.gwt.server.ComponentSizeValidator",\r
+ "com.vaadin.terminal.gwt.server.Constants",\r
+ "com.vaadin.terminal.gwt.server.GAEApplicationServlet",\r
+ "com.vaadin.terminal.gwt.server.HttpServletRequestListener",\r
+ "com.vaadin.terminal.gwt.server.HttpUploadStream",\r
+ "com.vaadin.terminal.gwt.server.JsonPaintTarget",\r
+ "com.vaadin.terminal.gwt.server.PortletApplicationContext",\r
+ "com.vaadin.terminal.gwt.server.PortletApplicationContext2",\r
+ "com.vaadin.terminal.gwt.server.PortletCommunicationManager",\r
+ "com.vaadin.terminal.gwt.server.PortletRequestListener",\r
+ "com.vaadin.terminal.gwt.server.RestrictedRenderResponse",\r
+ "com.vaadin.terminal.gwt.server.SessionExpiredException",\r
+ "com.vaadin.terminal.gwt.server.SystemMessageException",\r
+ "com.vaadin.terminal.gwt.server.WebApplicationContext",\r
+ "com.vaadin.terminal.gwt.server.WebBrowser",\r
+ "com.vaadin.terminal.gwt.widgetsetutils.ClassPathExplorer",\r
+ "com.vaadin.terminal.gwt.widgetsetutils.WidgetMapGenerator",\r
+ "com.vaadin.terminal.gwt.widgetsetutils.WidgetSetBuilder",\r
+ "com.vaadin.terminal.KeyMapper", "com.vaadin.terminal.Paintable",\r
+ "com.vaadin.terminal.PaintException",\r
+ "com.vaadin.terminal.PaintTarget",\r
+ "com.vaadin.terminal.ParameterHandler",\r
+ "com.vaadin.terminal.Resource", "com.vaadin.terminal.Scrollable",\r
+ "com.vaadin.terminal.Sizeable",\r
+ "com.vaadin.terminal.StreamResource",\r
+ "com.vaadin.terminal.SystemError", "com.vaadin.terminal.Terminal",\r
+ "com.vaadin.terminal.ThemeResource",\r
+ "com.vaadin.terminal.UploadStream",\r
+ "com.vaadin.terminal.URIHandler", "com.vaadin.terminal.UserError",\r
+ "com.vaadin.terminal.VariableOwner",\r
+ "com.vaadin.tools.ReflectTools",\r
+ "com.vaadin.tools.WidgetsetCompiler",\r
+ "com.vaadin.ui.AbsoluteLayout", "com.vaadin.ui.AbstractComponent",\r
+ "com.vaadin.ui.AbstractComponentContainer",\r
+ "com.vaadin.ui.AbstractField", "com.vaadin.ui.AbstractLayout",\r
+ "com.vaadin.ui.AbstractOrderedLayout",\r
+ "com.vaadin.ui.AbstractSelect", "com.vaadin.ui.Accordion",\r
+ "com.vaadin.ui.Alignment", "com.vaadin.ui.AlignmentUtils",\r
+ "com.vaadin.ui.BaseFieldFactory", "com.vaadin.ui.Button",\r
+ "com.vaadin.ui.CheckBox", "com.vaadin.ui.ClientWidget",\r
+ "com.vaadin.ui.ComboBox", "com.vaadin.ui.Component",\r
+ "com.vaadin.ui.ComponentContainer", "com.vaadin.ui.CssLayout",\r
+ "com.vaadin.ui.CustomComponent", "com.vaadin.ui.CustomLayout",\r
+ "com.vaadin.ui.DateField", "com.vaadin.ui.DefaultFieldFactory",\r
+ "com.vaadin.ui.Embedded", "com.vaadin.ui.ExpandLayout",\r
+ "com.vaadin.ui.Field", "com.vaadin.ui.FieldFactory",\r
+ "com.vaadin.ui.Form", "com.vaadin.ui.FormFieldFactory",\r
+ "com.vaadin.ui.FormLayout", "com.vaadin.ui.GridLayout",\r
+ "com.vaadin.ui.HorizontalLayout", "com.vaadin.ui.InlineDateField",\r
+ "com.vaadin.ui.Label", "com.vaadin.ui.Layout",\r
+ "com.vaadin.ui.Link", "com.vaadin.ui.ListSelect",\r
+ "com.vaadin.ui.LoginForm", "com.vaadin.ui.MenuBar",\r
+ "com.vaadin.ui.NativeButton", "com.vaadin.ui.NativeSelect",\r
+ "com.vaadin.ui.OptionGroup", "com.vaadin.ui.OrderedLayout",\r
+ "com.vaadin.ui.Panel", "com.vaadin.ui.PopupDateField",\r
+ "com.vaadin.ui.PopupView", "com.vaadin.ui.ProgressIndicator",\r
+ "com.vaadin.ui.RichTextArea", "com.vaadin.ui.Select",\r
+ "com.vaadin.ui.Slider", "com.vaadin.ui.SplitPanel",\r
+ "com.vaadin.ui.Table", "com.vaadin.ui.TableFieldFactory",\r
+ "com.vaadin.ui.TabSheet", "com.vaadin.ui.TextField",\r
+ "com.vaadin.ui.Tree", "com.vaadin.ui.TwinColSelect",\r
+ "com.vaadin.ui.Upload", "com.vaadin.ui.UriFragmentUtility",\r
+ "com.vaadin.ui.VerticalLayout", "com.vaadin.ui.Window",\r
+ "com.vaadin.util.SerializerHelper" };\r
+\r
+}\r
--- /dev/null
+package com.vaadin.tests.server.container;\r
+\r
+import java.util.Collection;\r
+\r
+import com.vaadin.data.Container;\r
+import com.vaadin.data.Item;\r
+import com.vaadin.data.Container.Hierarchical;\r
+import com.vaadin.data.Container.Sortable;\r
+\r
+public class AbstractHierarchicalContainerTest extends AbstractContainerTest {\r
+ private void validateHierarchicalContainer(Hierarchical container,\r
+ Object expectedFirstItemId, Object expectedLastItemId,\r
+ Object itemIdInSet, Object itemIdNotInSet, int expectedSize,\r
+ int expectedRootSize) {\r
+\r
+ validateContainer(container, expectedFirstItemId, expectedLastItemId,\r
+ itemIdInSet, itemIdNotInSet, expectedSize);\r
+\r
+ // rootItemIds\r
+ Collection<?> rootIds = container.rootItemIds();\r
+ assertEquals(expectedRootSize, rootIds.size());\r
+\r
+ for (Object rootId : rootIds) {\r
+ // All roots must be in container\r
+ assertTrue(container.containsId(rootId));\r
+\r
+ // All roots must have no parent\r
+ assertNull(container.getParent(rootId));\r
+\r
+ // all roots must be roots\r
+ assertTrue(container.isRoot(rootId));\r
+\r
+ // all roots have children allowed in this case\r
+ assertTrue(container.areChildrenAllowed(rootId));\r
+\r
+ // all roots have children in this case\r
+ Collection<?> children = container.getChildren(rootId);\r
+ assertNotNull(rootId + " should have children", children);\r
+ assertTrue(rootId + " should have children", (children.size() > 0));\r
+\r
+ // getParent\r
+ for (Object childId : children) {\r
+ assertEquals(container.getParent(childId), rootId);\r
+ }\r
+ }\r
+\r
+ // isRoot should return false for unknown items (#4215)\r
+ assertFalse(container.isRoot(itemIdNotInSet));\r
+\r
+ // hasChildren should return false for unknown items\r
+ assertFalse(container.hasChildren(itemIdNotInSet));\r
+\r
+ // areChildrenAllowed should return false for unknown items (#4216)\r
+ assertFalse(container.areChildrenAllowed(itemIdNotInSet));\r
+\r
+ // removeItem of unknown items should return false\r
+ assertFalse(container.removeItem(itemIdNotInSet));\r
+\r
+ assertEquals(countNodes(container), expectedSize);\r
+\r
+ validateHierarchy(container);\r
+ }\r
+\r
+ private int countNodes(Hierarchical container) {\r
+ int totalNodes = 0;\r
+ for (Object rootId : container.rootItemIds()) {\r
+ totalNodes += countNodes(container, rootId);\r
+ }\r
+\r
+ return totalNodes;\r
+ }\r
+\r
+ private int countNodes(Hierarchical container, Object itemId) {\r
+ int nodes = 1; // This\r
+ Collection<?> children = container.getChildren(itemId);\r
+ if (children != null) {\r
+ for (Object id : children) {\r
+ nodes += countNodes(container, id);\r
+ }\r
+ }\r
+\r
+ return nodes;\r
+ }\r
+\r
+ private void validateHierarchy(Hierarchical container) {\r
+ for (Object rootId : container.rootItemIds()) {\r
+ validateHierarchy(container, rootId, null);\r
+ }\r
+ }\r
+\r
+ private void validateHierarchy(Hierarchical container, Object itemId,\r
+ Object parentId) {\r
+ Collection<?> children = container.getChildren(itemId);\r
+\r
+ // getParent\r
+ assertEquals(container.getParent(itemId), parentId);\r
+\r
+ if (!container.areChildrenAllowed(itemId)) {\r
+ // If no children is allowed the item should have no children\r
+ assertFalse(container.hasChildren(itemId));\r
+ assertTrue(children == null || children.size() == 0);\r
+\r
+ return;\r
+ }\r
+ if (children != null) {\r
+ for (Object id : children) {\r
+ validateHierarchy(container, id, itemId);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected void testHierarchicalContainer(Container.Hierarchical container) {\r
+ initializeContainer(container);\r
+\r
+ int packages = 21;\r
+ validateHierarchicalContainer(container, "com",\r
+ "com.vaadin.util.SerializerHelper",\r
+ "com.vaadin.terminal.ApplicationResource", "blah",\r
+ sampleData.length + packages, 1);\r
+\r
+ }\r
+\r
+ protected void testHierarchicalSorting(Container.Hierarchical container) {\r
+ Container.Sortable sortable = (Sortable) container;\r
+\r
+ initializeContainer(container);\r
+\r
+ // Must be able to sort based on PROP1 and PROP2 for this test\r
+ assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP1));\r
+ assertTrue(sortable.getSortableContainerPropertyIds().contains(PROP2));\r
+\r
+ sortable.sort(new Object[] { PROP1 }, new boolean[] { true });\r
+\r
+ int packages = 21;\r
+ validateHierarchicalContainer(container, "com",\r
+ "com.vaadin.util.SerializerHelper",\r
+ "com.vaadin.terminal.ApplicationResource", "blah",\r
+ sampleData.length + packages, 1);\r
+\r
+ sortable.sort(new Object[] { PROP2 }, new boolean[] { true });\r
+\r
+ validateHierarchicalContainer(container,\r
+ "com.vaadin.terminal.gwt.server.ApplicationPortlet2",\r
+ "com.vaadin.data.util.ObjectProperty",\r
+ "com.vaadin.terminal.ApplicationResource", "blah",\r
+ sampleData.length + packages, 1);\r
+\r
+ }\r
+\r
+ protected void testHierarchicalFiltering(Container.Hierarchical container) {\r
+ Container.Filterable filterable = (Container.Filterable) container;\r
+\r
+ initializeContainer(container);\r
+\r
+ // Filter by "contains ab"\r
+ filterable.addContainerFilter(PROP1, "ab", false, false);\r
+\r
+ validateHierarchicalContainer(container,\r
+ "com.vaadin.data.BufferedValidatable",\r
+ "com.vaadin.ui.TabSheet",\r
+ "com.vaadin.terminal.gwt.client.Focusable",\r
+ "com.vaadin.data.Buffered", 20, 0);\r
+\r
+ // filter out every second item except hierarchy items\r
+ filterable.removeAllContainerFilters();\r
+ filterable.addContainerFilter(PROP3, "1", false, false);\r
+\r
+ int packages = 21;\r
+ int other = sampleData.length / 2;\r
+ validateHierarchicalContainer(container, "com", "com.vaadin.util",\r
+ "com.vaadin.data.util.IndexedContainer",\r
+ "com.vaadin.data.util.ObjectProperty", packages + other, 0);\r
+\r
+ // Additionally remove all without 'm'. Hierarchy is now one root only.\r
+ filterable.addContainerFilter(PROP1, "m", false, false);\r
+\r
+ validateHierarchicalContainer(container, "com.vaadin.data.Buffered",\r
+ "com.vaadin.terminal.gwt.server.ComponentSizeValidator",\r
+ "com.vaadin.data.util.IndexedContainer",\r
+ "com.vaadin.terminal.gwt.client.ui.VUriFragmentUtility",\r
+ packages + other, 0);\r
+ //\r
+ // int packages = 21;\r
+ // validateHierarchicalContainer(container, "com",\r
+ // "com.vaadin.util.SerializerHelper",\r
+ // "com.vaadin.terminal.ApplicationResource", "blah",\r
+ // sampleData.length + packages, 1);\r
+ //\r
+ // sortable.sort(new Object[] { PROP2 }, new boolean[] { true });\r
+ //\r
+ // validateHierarchicalContainer(container,\r
+ // "com.vaadin.terminal.gwt.server.ApplicationPortlet2",\r
+ // "com.vaadin.data.util.ObjectProperty",\r
+ // "com.vaadin.terminal.ApplicationResource", "blah",\r
+ // sampleData.length + packages, 1);\r
+\r
+ }\r
+\r
+ protected void initializeContainer(Container.Hierarchical container) {\r
+ container.removeAllItems();\r
+ Object[] propertyIds = container.getContainerPropertyIds().toArray();\r
+ for (Object propertyId : propertyIds) {\r
+ container.removeContainerProperty(propertyId);\r
+ }\r
+\r
+ container.addContainerProperty(PROP1, String.class, "");\r
+ container.addContainerProperty(PROP2, String.class, null);\r
+ container.addContainerProperty(PROP3, Integer.class, null);\r
+\r
+ for (int i = 0; i < sampleData.length; i++) {\r
+ String id = sampleData[i];\r
+\r
+ // Add path as parent\r
+ String paths[] = id.split("\\.");\r
+ String path = paths[0];\r
+ // Adds "com" and other items multiple times so should return null\r
+ // for all but the first time\r
+ if (container.addItem(path) != null) {\r
+ assertTrue(container.setChildrenAllowed(path, false));\r
+ Item item = container.getItem(path);\r
+ item.getItemProperty(PROP1).setValue(path);\r
+ item.getItemProperty(PROP2).setValue(reverse(path));\r
+ item.getItemProperty(PROP3).setValue(1);\r
+ }\r
+ for (int j = 1; j < paths.length; j++) {\r
+ String parent = path;\r
+ path = path + "." + paths[j];\r
+\r
+ // Adds "com" and other items multiple times so should return\r
+ // null for all but the first time\r
+ if (container.addItem(path) != null) {\r
+ assertTrue(container.setChildrenAllowed(path, false));\r
+\r
+ Item item = container.getItem(path);\r
+ item.getItemProperty(PROP1).setValue(path);\r
+ item.getItemProperty(PROP2).setValue(reverse(path));\r
+ item.getItemProperty(PROP3).setValue(1);\r
+\r
+ }\r
+ assertTrue(container.setChildrenAllowed(parent, true));\r
+ assertTrue(\r
+ "Failed to set " + parent + " as parent for " + path,\r
+ container.setParent(path, parent));\r
+ }\r
+\r
+ Item item = container.getItem(id);\r
+ assertNotNull(item);\r
+ String parent = id.substring(0, id.lastIndexOf('.'));\r
+ assertTrue(container.setParent(id, parent));\r
+ item.getItemProperty(PROP1).setValue(sampleData[i]);\r
+ item.getItemProperty(PROP2).setValue(reverse(sampleData[i]));\r
+ item.getItemProperty(PROP3).setValue(i % 2);\r
+ }\r
+ }\r
+\r
+}\r