Author: kmorin Date: 2013-03-01 12:19:52 +0100 (Fri, 01 Mar 2013) New Revision: 2583 Url: http://nuiton.org/projects/jaxx/repository/revisions/2583 Log: escape the special characters Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableListModel.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableListModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableListModel.java 2013-02-27 13:57:45 UTC (rev 2582) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableListModel.java 2013-03-01 11:19:52 UTC (rev 2583) @@ -7,6 +7,7 @@ import java.util.List; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.LogFactory; import org.nuiton.util.decorator.JXPathDecorator; /** @@ -18,16 +19,16 @@ public class JaxxFilterableListModel<E> extends JaxxDefaultListModel<E> { private static final long serialVersionUID = 1L; - + protected ArrayList<E> filteredItems = Lists.newArrayList(); - + protected String filterText; - + /** the decorator of data */ protected JXPathDecorator<E> decorator; - + protected List<Predicate<E>> filters = Lists.newArrayList(); - + @Override public E getElementAt(int index) { if (index < filteredItems.size()) { @@ -36,7 +37,7 @@ return null; } } - + @Override public E elementAt(int index) { return getElementAt(index); @@ -54,17 +55,17 @@ refilter(); return result; } - + @Override public int getSize() { return filteredItems.size(); } - + @Override public int size() { return filteredItems.size(); } - + @Override public void trimToSize() { super.trimToSize(); @@ -82,19 +83,19 @@ super.setSize(newSize); filteredItems.ensureCapacity(newSize); } - + @Override public void setElementAt(E element, int index) { super.setElementAt(element, index); refilter(); } - + @Override public void removeElementAt(int index) { super.removeElementAt(index); refilter(); } - + @Override public void insertElementAt(E element, int index) { super.insertElementAt(element, index); @@ -106,14 +107,14 @@ super.removeAllElements(); refilter(); } - + @Override public E set(int index, E element) { E rv = super.set(index, element); refilter(); return rv; } - + @Override public void add(int index, E element) { super.add(index, element); @@ -150,7 +151,7 @@ super.removeRange(fromIndex, toIndex); refilter(); } - + public String getFilterText() { return filterText; } @@ -167,34 +168,34 @@ public void setDecorator(JXPathDecorator<E> decorator) { this.decorator = decorator; } - + public void addFilter(Predicate<E> filter) { filters.add(filter); refilter(); } - + public void removeFilter(Predicate<E> filter) { filters.remove(filter); refilter(); } - + public void clearFilters() { filters.clear(); refilter(); } - + protected void refilter() { filteredItems.clear(); - - if (StringUtils.isEmpty(StringUtils.remove(filterText, '*')) + + if (StringUtils.isEmpty(StringUtils.remove(filterText, '*')) && filters.isEmpty()) { filteredItems.addAll(delegate); - + } else { int itemNumber = delegate.size(); Pattern pattern = null; if (!StringUtils.isBlank(filterText)) { - String patternText = filterText.replace("*", ".*") + ".*"; + String patternText = Pattern.quote(filterText).replace("*", "\\E.*\\Q") + ".*"; pattern = Pattern.compile(patternText, Pattern.CASE_INSENSITIVE); } for (int i = 0 ; i < itemNumber ; i++) { @@ -209,14 +210,14 @@ } else { decoratedElement = String.valueOf(element); } - boolean matches = pattern == null + boolean matches = pattern == null || pattern.matcher(decoratedElement).matches(); if (matches && addElement) { filteredItems.add(element); } } } - + fireContentsChanged(this, 0, getSize()); } }