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.HashSet;
31 import java.util.LinkedHashMap;
32 import java.util.Map;
33 import java.util.Map.Entry;
34 import java.util.Set;
35 import java.util.concurrent.locks.ReentrantLock;
36
37 import org.apache.hc.core5.annotation.Contract;
38 import org.apache.hc.core5.annotation.ThreadingBehavior;
39 import org.apache.hc.core5.http.impl.routing.PathPatternMatcher;
40 import org.apache.hc.core5.util.Args;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 @Contract(threading = ThreadingBehavior.SAFE)
64 @Deprecated
65 public class UriPatternMatcher<T> implements LookupRegistry<T> {
66
67 private final Map<String, T> map;
68
69 private final ReentrantLock lock;
70
71 public UriPatternMatcher() {
72 super();
73 this.map = new LinkedHashMap<>();
74 this.lock = new ReentrantLock();
75 }
76
77
78
79
80
81
82
83
84
85 public Set<Entry<String, T>> entrySet() {
86 lock.lock();
87 try {
88 return new HashSet<>(map.entrySet());
89 } finally {
90 lock.unlock();
91 }
92 }
93
94
95
96
97
98
99
100
101
102 @Override
103 public void register(final String pattern, final T obj) {
104 lock.lock();
105 try {
106 Args.notNull(pattern, "URI request pattern");
107 this.map.put(pattern, obj);
108 } finally {
109 lock.unlock();
110 }
111 }
112
113
114
115
116
117
118
119 @Override
120 public void unregister(final String pattern) {
121 lock.lock();
122 try {
123 if (pattern == null) {
124 return;
125 }
126 this.map.remove(pattern);
127 } finally {
128 lock.unlock();
129 }
130 }
131
132
133
134
135
136
137
138
139 @Override
140 public T lookup(final String path) {
141 lock.lock();
142 try {
143 Args.notNull(path, "Request path");
144
145 T obj = this.map.get(path);
146 if (obj == null) {
147
148 String bestMatch = null;
149 for (final String pattern : this.map.keySet()) {
150 if (matchUriRequestPattern(pattern, path)) {
151
152 if (bestMatch == null || (bestMatch.length() < pattern.length())
153 || (bestMatch.length() == pattern.length() && pattern.endsWith("*"))) {
154 obj = this.map.get(pattern);
155 bestMatch = pattern;
156 }
157 }
158 }
159 }
160 return obj;
161 } finally {
162 lock.unlock();
163 }
164 }
165
166
167
168
169
170
171
172
173
174
175 protected boolean matchUriRequestPattern(final String pattern, final String path) {
176 return PathPatternMatcher.INSTANCE.match(pattern, path);
177 }
178
179 @Override
180 public String toString() {
181 return this.map.toString();
182 }
183
184 }