1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.forgerock.json.resource;
18
19 import static org.forgerock.http.routing.RouteMatchers.resourceApiVersionMatcher;
20 import static org.forgerock.http.routing.RouteMatchers.uriMatcher;
21
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import org.forgerock.http.routing.ResourceApiVersionBehaviourManager;
26 import org.forgerock.http.routing.RoutingMode;
27 import org.forgerock.http.routing.Version;
28 import org.forgerock.http.ApiProducer;
29 import org.forgerock.services.context.Context;
30 import org.forgerock.services.routing.IncomparableRouteMatchException;
31 import org.forgerock.services.routing.RouteMatch;
32 import org.forgerock.services.routing.RouteMatcher;
33
34
35
36
37 public final class RouteMatchers {
38
39 private static final SelfApiMatcher SELF_API_MATCHER = new SelfApiMatcher();
40
41 private RouteMatchers() {
42 }
43
44
45
46
47
48
49
50
51
52 public static RouteMatcher<Request> requestUriMatcher(RoutingMode mode, String template) {
53 return new RequestUriRouteMatcher(uriMatcher(mode, template));
54 }
55
56
57
58
59
60
61
62
63
64 public static ResourceApiVersionBehaviourManager newResourceApiVersionBehaviourManager() {
65 return org.forgerock.http.routing.RouteMatchers.newResourceApiVersionBehaviourManager();
66 }
67
68
69
70
71
72
73
74
75
76
77
78 public static Filter resourceApiVersionContextFilter(ResourceApiVersionBehaviourManager behaviourManager) {
79 return new ResourceApiVersionRoutingFilter(behaviourManager);
80 }
81
82
83
84
85
86
87
88
89 public static RouteMatcher<Request> requestResourceApiVersionMatcher(Version version) {
90 return new RequestApiVersionRouteMatcher(resourceApiVersionMatcher(version));
91 }
92
93
94
95
96
97
98 static RouteMatcher<Request> selfApiMatcher() {
99 return SELF_API_MATCHER;
100 }
101
102
103
104
105
106
107 private static final class RequestUriRouteMatcher extends RouteMatcher<Request> {
108
109 private final RouteMatcher<List<String>> delegate;
110
111 private RequestUriRouteMatcher(RouteMatcher<List<String>> delegate) {
112 this.delegate = delegate;
113 }
114
115 @Override
116 public RouteMatch evaluate(Context context, Request request) {
117 final List<String> pathElements = new ArrayList<>(request.getResourcePathObject().size());
118 for (String pathElement : request.getResourcePathObject()) {
119 pathElements.add(pathElement);
120 }
121 return delegate.evaluate(context, pathElements);
122 }
123
124 @Override
125 public String toString() {
126 return delegate.toString();
127 }
128
129 @Override
130 public String idFragment() {
131 return delegate.idFragment();
132 }
133
134 @Override
135 public boolean equals(Object o) {
136 if (this == o) {
137 return true;
138 }
139 if (!(o instanceof RequestUriRouteMatcher)) {
140 return false;
141 }
142 RequestUriRouteMatcher that = (RequestUriRouteMatcher) o;
143 return delegate.equals(that.delegate);
144 }
145
146 @Override
147 public <T> T transformApi(T t, ApiProducer<T> apiProducer) {
148 return delegate.transformApi(t, apiProducer);
149 }
150
151 @Override
152 public int hashCode() {
153 return delegate.hashCode();
154 }
155 }
156
157
158
159
160
161
162 private static final class RequestApiVersionRouteMatcher extends RouteMatcher<Request> {
163
164 private final RouteMatcher<Version> delegate;
165
166 private RequestApiVersionRouteMatcher(RouteMatcher<Version> delegate) {
167 this.delegate = delegate;
168 }
169
170 @Override
171 public RouteMatch evaluate(Context context, Request request) {
172 return delegate.evaluate(context, request.getResourceVersion());
173 }
174
175 @Override
176 public String toString() {
177 return delegate.toString();
178 }
179
180 @Override
181 public String idFragment() {
182 return delegate.idFragment();
183 }
184
185 @Override
186 public boolean equals(Object o) {
187 if (this == o) {
188 return true;
189 }
190 if (!(o instanceof RequestApiVersionRouteMatcher)) {
191 return false;
192 }
193 RequestApiVersionRouteMatcher that = (RequestApiVersionRouteMatcher) o;
194 return delegate.equals(that.delegate);
195 }
196
197 @Override
198 public <T> T transformApi(T t, ApiProducer<T> apiProducer) {
199 return delegate.transformApi(t, apiProducer);
200 }
201
202 @Override
203 public int hashCode() {
204 return delegate.hashCode();
205 }
206 }
207
208 private static class SelfApiMatcher extends RouteMatcher<Request> {
209
210 @Override
211 public RouteMatch evaluate(Context context, final Request request) {
212 return new RouteMatch() {
213 @Override
214 public boolean isBetterMatchThan(RouteMatch result) throws IncomparableRouteMatchException {
215 return request.getRequestType().equals(RequestType.API)
216 && request.getResourceVersion() == null
217 && request.getResourcePathObject().equals(ResourcePath.empty());
218 }
219
220 @Override
221 public Context decorateContext(Context context) {
222 return context;
223 }
224 };
225 }
226
227 @Override
228 public String toString() {
229 return "API Request";
230 }
231
232 @Override
233 public int hashCode() {
234 return 0;
235 }
236
237 @Override
238 public boolean equals(Object o) {
239 return this == o;
240 }
241
242 @Override
243 public String idFragment() {
244 throw new UnsupportedOperationException();
245 }
246
247 @Override
248 public <D> D transformApi(D descriptor, ApiProducer<D> producer) {
249 throw new UnsupportedOperationException();
250 }
251 }
252 }