1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.http.protocol;
29
30 import java.util.LinkedHashMap;
31 import java.util.Map;
32 import java.util.Map.Entry;
33 import java.util.concurrent.locks.ReentrantLock;
34 import java.util.regex.Pattern;
35
36 import org.apache.hc.core5.annotation.Contract;
37 import org.apache.hc.core5.annotation.ThreadingBehavior;
38 import org.apache.hc.core5.util.Args;
39
40
41
42
43
44
45
46
47
48
49
50
51 @Contract(threading = ThreadingBehavior.SAFE)
52 public class UriRegexMatcher<T> implements LookupRegistry<T> {
53
54 private final Map<String, T> objectMap;
55 private final Map<String, Pattern> patternMap;
56
57 private final ReentrantLock lock;
58
59 public UriRegexMatcher() {
60 super();
61 this.objectMap = new LinkedHashMap<>();
62 this.patternMap = new LinkedHashMap<>();
63 this.lock = new ReentrantLock();
64 }
65
66
67
68
69
70
71
72
73
74 @Override
75 public void register(final String regex, final T obj) {
76 lock.lock();
77 try {
78 Args.notNull(regex, "URI request regex");
79 this.objectMap.put(regex, obj);
80 this.patternMap.put(regex, Pattern.compile(regex));
81 } finally {
82 lock.unlock();
83 }
84 }
85
86
87
88
89
90
91
92 @Override
93 public void unregister(final String regex) {
94 lock.lock();
95 try {
96 if (regex == null) {
97 return;
98 }
99 this.objectMap.remove(regex);
100 this.patternMap.remove(regex);
101 } finally {
102 lock.unlock();
103 }
104 }
105
106
107
108
109
110
111
112
113 @Override
114 public T lookup(final String path) {
115 lock.lock();
116 try {
117 Args.notNull(path, "Request path");
118
119 final T obj = this.objectMap.get(path);
120 if (obj == null) {
121
122 for (final Entry<String, Pattern> entry : this.patternMap.entrySet()) {
123 if (entry.getValue().matcher(path).matches()) {
124 return objectMap.get(entry.getKey());
125 }
126 }
127 }
128 return obj;
129 } finally {
130 lock.unlock();
131 }
132 }
133
134 @Override
135 public String toString() {
136 return this.objectMap.toString();
137 }
138
139 }