]> source.dussan.org Git - vaadin-framework.git/commitdiff
#2517 merged to 6.0: BeanItemContainer ate exceptions; generalized Filter from Indexe...
authorHenri Sara <henri.sara@itmill.com>
Wed, 1 Apr 2009 11:53:22 +0000 (11:53 +0000)
committerHenri Sara <henri.sara@itmill.com>
Wed, 1 Apr 2009 11:53:22 +0000 (11:53 +0000)
svn changeset:7270/svn branch:6.0

src/com/itmill/toolkit/data/util/BeanItemContainer.java
src/com/itmill/toolkit/data/util/Filter.java [new file with mode: 0644]
src/com/itmill/toolkit/data/util/IndexedContainer.java

index 7fa747372d4c30711dd49feb9c546a65e33a39fe..457526efc421847926b12afdb58027e13c7f3e04 100644 (file)
@@ -28,6 +28,7 @@ import com.itmill.toolkit.data.Property.ValueChangeNotifier;
  * <p>
  * Bean objects act as identifiers. For this reason, they should implement
  * Object.equals(Object) and Object.hashCode() .
+ * </p>
  * 
  * @param <BT>
  * 
@@ -362,24 +363,6 @@ public class BeanItemContainer<BT> implements Indexed, Sortable, Filterable,
         }
     }
 
-    class Filter {
-
-        private final Object propertyId;
-        private final String filterString;
-        private final boolean onlyMatchPrefix;
-        private final boolean ignoreCase;
-
-        public Filter(Object propertyId, String filterString,
-                boolean ignoreCase, boolean onlyMatchPrefix) {
-            this.propertyId = propertyId;
-            this.ignoreCase = ignoreCase;
-            this.filterString = ignoreCase ? filterString.toLowerCase()
-                    : filterString;
-            this.onlyMatchPrefix = onlyMatchPrefix;
-        }
-
-    }
-
     @SuppressWarnings("unchecked")
     public void addContainerFilter(Object propertyId, String filterString,
             boolean ignoreCase, boolean onlyMatchPrefix) {
@@ -423,24 +406,7 @@ public class BeanItemContainer<BT> implements Indexed, Sortable, Filterable,
         Iterator<BT> iterator = list.iterator();
         while (iterator.hasNext()) {
             BT bean = iterator.next();
-            // TODO #2517: should not swallow exceptions - requires several
-            // checks
-            try {
-                String value = getContainerProperty(bean, f.propertyId)
-                        .getValue().toString();
-                if (f.ignoreCase) {
-                    value = value.toLowerCase();
-                }
-                if (f.onlyMatchPrefix) {
-                    if (!value.startsWith(f.filterString)) {
-                        iterator.remove();
-                    }
-                } else {
-                    if (!value.contains(f.filterString)) {
-                        iterator.remove();
-                    }
-                }
-            } catch (Exception e) {
+            if (!f.passesFilter(getItem(bean))) {
                 iterator.remove();
             }
         }
diff --git a/src/com/itmill/toolkit/data/util/Filter.java b/src/com/itmill/toolkit/data/util/Filter.java
new file mode 100644 (file)
index 0000000..cbb1efa
--- /dev/null
@@ -0,0 +1,87 @@
+package com.itmill.toolkit.data.util;\r
+\r
+import com.itmill.toolkit.data.Item;\r
+import com.itmill.toolkit.data.Property;\r
+\r
+/**\r
+ * A default filter that can be used to implement\r
+ * {@link com.itmill.toolkit.data.Container.Filterable}.\r
+ * \r
+ * @since 5.4\r
+ */\r
+public class Filter {\r
+    final Object propertyId;\r
+    final String filterString;\r
+    final boolean ignoreCase;\r
+    final boolean onlyMatchPrefix;\r
+\r
+    Filter(Object propertyId, String filterString, boolean ignoreCase,\r
+            boolean onlyMatchPrefix) {\r
+        this.propertyId = propertyId;\r
+        ;\r
+        this.filterString = ignoreCase ? filterString.toLowerCase()\r
+                : filterString;\r
+        this.ignoreCase = ignoreCase;\r
+        this.onlyMatchPrefix = onlyMatchPrefix;\r
+    }\r
+\r
+    /**\r
+     * Check if an item passes the filter.\r
+     * \r
+     * @param item\r
+     * @return true if the item is accepted by this filter\r
+     */\r
+    public boolean passesFilter(Item item) {\r
+        final Property p = item.getItemProperty(propertyId);\r
+        if (p == null || p.toString() == null) {\r
+            return false;\r
+        }\r
+        final String value = ignoreCase ? p.toString().toLowerCase() : p\r
+                .toString();\r
+        if (onlyMatchPrefix) {\r
+            if (!value.startsWith(filterString)) {\r
+                return false;\r
+            }\r
+        } else {\r
+            if (!value.contains(filterString)) {\r
+                return false;\r
+            }\r
+        }\r
+        return true;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+\r
+        // Only ones of the objects of the same class can be equal\r
+        if (!(obj instanceof Filter)) {\r
+            return false;\r
+        }\r
+        final Filter o = (Filter) obj;\r
+\r
+        // Checks the properties one by one\r
+        if (propertyId != o.propertyId && o.propertyId != null\r
+                && !o.propertyId.equals(propertyId)) {\r
+            return false;\r
+        }\r
+        if (filterString != o.filterString && o.filterString != null\r
+                && !o.filterString.equals(filterString)) {\r
+            return false;\r
+        }\r
+        if (ignoreCase != o.ignoreCase) {\r
+            return false;\r
+        }\r
+        if (onlyMatchPrefix != o.onlyMatchPrefix) {\r
+            return false;\r
+        }\r
+\r
+        return true;\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        return (propertyId != null ? propertyId.hashCode() : 0)\r
+                ^ (filterString != null ? filterString.hashCode() : 0);\r
+    }\r
+\r
+}
\ No newline at end of file
index af4b1e131c4e889380603d3c78967f5abf388030..0dbe44fc46d93f1572e7a0cf299af9cd63378f6a 100644 (file)
@@ -1566,57 +1566,6 @@ public class IndexedContainer implements Container.Indexed,
         return super.equals(obj);
     }
 
-    private class Filter {
-        Object propertyId;
-        String filterString;
-        boolean ignoreCase;
-        boolean onlyMatchPrefix;
-
-        Filter(Object propertyId, String filterString, boolean ignoreCase,
-                boolean onlyMatchPrefix) {
-            this.propertyId = propertyId;
-            ;
-            this.filterString = filterString;
-            this.ignoreCase = ignoreCase;
-            this.onlyMatchPrefix = onlyMatchPrefix;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-
-            // Only ones of the objects of the same class can be equal
-            if (!(obj instanceof Filter)) {
-                return false;
-            }
-            final Filter o = (Filter) obj;
-
-            // Checks the properties one by one
-            if (propertyId != o.propertyId && o.propertyId != null
-                    && !o.propertyId.equals(propertyId)) {
-                return false;
-            }
-            if (filterString != o.filterString && o.filterString != null
-                    && !o.filterString.equals(filterString)) {
-                return false;
-            }
-            if (ignoreCase != o.ignoreCase) {
-                return false;
-            }
-            if (onlyMatchPrefix != o.onlyMatchPrefix) {
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            return (propertyId != null ? propertyId.hashCode() : 0)
-                    ^ (filterString != null ? filterString.hashCode() : 0);
-        }
-
-    }
-
     public void addContainerFilter(Object propertyId, String filterString,
             boolean ignoreCase, boolean onlyMatchPrefix) {
         if (filters == null) {
@@ -1705,23 +1654,9 @@ public class IndexedContainer implements Container.Indexed,
         final Iterator<Filter> i = filters.iterator();
         while (i.hasNext()) {
             final Filter f = i.next();
-            final String s1 = f.ignoreCase ? f.filterString.toLowerCase()
-                    : f.filterString;
-            final Property p = item.getItemProperty(f.propertyId);
-            if (p == null || p.toString() == null) {
+            if (!f.passesFilter(item)) {
                 return false;
             }
-            final String s2 = f.ignoreCase ? p.toString().toLowerCase() : p
-                    .toString();
-            if (f.onlyMatchPrefix) {
-                if (s2.indexOf(s1) != 0) {
-                    return false;
-                }
-            } else {
-                if (s2.indexOf(s1) < 0) {
-                    return false;
-                }
-            }
         }
         return true;
     }