1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.util;
20
21 import java.util.AbstractSet;
22 import java.util.Collections;
23 import java.util.HashSet;
24 import java.util.Iterator;
25 import java.util.Set;
26 import java.util.regex.Pattern;
27
28
29
30
31
32
33 public class RegexSet extends AbstractSet<String> implements Predicate<String>
34 {
35 private final Set<String> _patterns=new HashSet<String>();
36 private final Set<String> _unmodifiable=Collections.unmodifiableSet(_patterns);
37 private Pattern _pattern;
38
39 @Override
40 public Iterator<String> iterator()
41 {
42 return _unmodifiable.iterator();
43 }
44
45 @Override
46 public int size()
47 {
48 return _patterns.size();
49 }
50
51 @Override
52 public boolean add(String pattern)
53 {
54 boolean added = _patterns.add(pattern);
55 if (added)
56 updatePattern();
57 return added;
58 }
59
60 @Override
61 public boolean remove(Object pattern)
62 {
63 boolean removed = _patterns.remove(pattern);
64
65 if (removed)
66 updatePattern();
67 return removed;
68 }
69
70 @Override
71 public boolean isEmpty()
72 {
73 return _patterns.isEmpty();
74 }
75
76 @Override
77 public void clear()
78 {
79 _patterns.clear();
80 _pattern=null;
81 }
82
83 private void updatePattern()
84 {
85 StringBuilder builder = new StringBuilder();
86 builder.append("^(");
87 for (String pattern: _patterns)
88 {
89 if (builder.length()>2)
90 builder.append('|');
91 builder.append('(');
92 builder.append(pattern);
93 builder.append(')');
94 }
95 builder.append(")$");
96 _pattern = Pattern.compile(builder.toString());
97 }
98
99 @Override
100 public boolean test(String s)
101 {
102 return _pattern!=null && _pattern.matcher(s).matches();
103 }
104
105 public boolean matches(String s)
106 {
107 return _pattern!=null && _pattern.matcher(s).matches();
108 }
109 }