* <p>
* Bean objects act as identifiers. For this reason, they should implement
* Object.equals(Object) and Object.hashCode() .
+ * </p>
*
* @param <BT>
*
}
}
- 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) {
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();
}
}
--- /dev/null
+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
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) {
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;
}