]> source.dussan.org Git - vaadin-framework.git/commitdiff
Make CustomField iterator() comply with contract
authorArtur Signell <artur@vaadin.com>
Mon, 27 Mar 2017 18:51:03 +0000 (21:51 +0300)
committerHenri Sara <henri.sara@gmail.com>
Thu, 30 Mar 2017 08:20:55 +0000 (11:20 +0300)
Fixes #8957

server/src/main/java/com/vaadin/ui/CustomField.java
server/src/test/java/com/vaadin/ui/CustomFieldTest.java [new file with mode: 0644]

index c8cfc2a25e0de52b3da776abb21ba2dc0e291e44..bd073598b4b5ab6a9edc65ee520edeca8040e33e 100644 (file)
@@ -16,7 +16,7 @@
 
 package com.vaadin.ui;
 
-import java.io.Serializable;
+import java.util.Collections;
 import java.util.Iterator;
 
 import com.vaadin.data.HasValue;
@@ -130,30 +130,16 @@ public abstract class CustomField<T> extends AbstractField<T>
 
     // ComponentContainer methods
 
-    private class ComponentIterator
-            implements Iterator<Component>, Serializable {
-        boolean first = (root != null);
-
-        @Override
-        public boolean hasNext() {
-            return first;
-        }
-
-        @Override
-        public Component next() {
-            first = false;
-            return getContent();
-        }
-
-        @Override
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
     @Override
     public Iterator<Component> iterator() {
-        return new ComponentIterator();
+        // Can't use getContent() here as this will cause an infinite loop if
+        // initContent happens to all iterator(). This happens if you do
+        // setWidth...
+        if (root != null) {
+            return Collections.singletonList(root).iterator();
+        } else {
+            return Collections.<Component> emptyList().iterator();
+        }
     }
 
     /**
diff --git a/server/src/test/java/com/vaadin/ui/CustomFieldTest.java b/server/src/test/java/com/vaadin/ui/CustomFieldTest.java
new file mode 100644 (file)
index 0000000..94636dc
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2000-2016 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.ui;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CustomFieldTest {
+
+    public static class TestCustomField extends CustomField<String> {
+
+        private String value = "initial";
+        private Button button;
+
+        @Override
+        public String getValue() {
+            return value;
+        }
+
+        @Override
+        protected Component initContent() {
+            button = new Button("Content");
+            return button;
+        }
+
+        @Override
+        protected void doSetValue(String value) {
+            this.value = value;
+
+        }
+
+    }
+
+    @Test(expected = NoSuchElementException.class)
+    public void iterator() {
+        TestCustomField field = new TestCustomField();
+        // Needs to trigger initContent somehow as
+        // iterator() can't do it even though it should...
+        field.getContent();
+        Iterator<Component> iterator = field.iterator();
+        Assert.assertNotNull(iterator);
+        Assert.assertTrue(iterator.hasNext());
+        Assert.assertEquals(field.button, iterator.next());
+        Assert.assertFalse(iterator.hasNext());
+        iterator.next();
+    }
+}