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.util.Args;
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 @Contract(threading = ThreadingBehavior.SAFE)
60 public class UriPatternOrderedMatcher<T> implements LookupRegistry<T> {
61
62 private final Map<String, T> map;
63
64 private final ReentrantLock lock = new ReentrantLock();
65
66 public UriPatternOrderedMatcher() {
67 super();
68 this.map = new LinkedHashMap<>();
69 }
70
71
72
73
74
75
76
77
78
79 public Set<Entry<String, T>> entrySet() {
80 lock.lock();
81 try {
82 return new HashSet<>(map.entrySet());
83 } finally {
84 lock.unlock();
85 }
86 }
87
88
89
90
91
92
93
94 @Override
95 public void register(final String pattern, final T obj) {
96 lock.lock();
97 try {
98 Args.notNull(pattern, "URI request pattern");
99 this.map.put(pattern, obj);
100 } finally {
101 lock.unlock();
102 }
103 }
104
105
106
107
108
109
110 @Override
111 public void unregister(final String pattern) {
112 lock.lock();
113 try {
114 if (pattern == null) {
115 return;
116 }
117 this.map.remove(pattern);
118 } finally {
119 lock.unlock();
120 }
121 }
122
123
124
125
126
127
128
129 @Override
130 public T lookup(final String path) {
131 lock.lock();
132 try {
133 Args.notNull(path, "Request path");
134 for (final Entry<String, T> entry : this.map.entrySet()) {
135 final String pattern = entry.getKey();
136 if (path.equals(pattern)) {
137 return entry.getValue();
138 }
139 if (matchUriRequestPattern(pattern, path)) {
140 return this.map.get(pattern);
141 }
142 }
143 return null;
144 } finally {
145 lock.unlock();
146 }
147 }
148
149
150
151
152
153
154
155
156
157 protected boolean matchUriRequestPattern(final String pattern, final String path) {
158 if (pattern.equals("*")) {
159 return true;
160 }
161 return (pattern.endsWith("*") && path.startsWith(pattern.substring(0, pattern.length() - 1)))
162 || (pattern.startsWith("*") && path.endsWith(pattern.substring(1)));
163 }
164
165 @Override
166 public String toString() {
167 return this.map.toString();
168 }
169
170 }