-
Notifications
You must be signed in to change notification settings - Fork 888
/
MethodExpression.java
102 lines (86 loc) · 3.19 KB
/
MethodExpression.java
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package org.jboss.resteasy.core.registry;
import org.jboss.resteasy.core.ResourceLocatorInvoker;
import org.jboss.resteasy.core.ResourceMethodInvoker;
import org.jboss.resteasy.resteasy_jaxrs.i18n.Messages;
import org.jboss.resteasy.specimpl.ResteasyUriInfo;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.ResourceInvoker;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.core.PathSegment;
import java.util.regex.Matcher;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class MethodExpression extends Expression
{
protected SegmentNode parent;
protected ResourceInvoker invoker;
public int compareTo(Expression expression)
{
int s = super.compareTo(expression);
if (s != 0) return s;
MethodExpression me = (MethodExpression)expression;
if (invoker.getClass().equals(me.invoker.getClass())) return 0;
if (invoker instanceof ResourceMethodInvoker) return -1;
else return 1;
}
public MethodExpression(final SegmentNode parent, final String segment, final ResourceInvoker invoker)
{
this(parent, segment, invoker, null);
}
public MethodExpression(final SegmentNode parent, final String segment, final ResourceInvoker invoker, final String additionalRegex)
{
super(segment, additionalRegex);
this.parent = parent;
this.invoker = invoker;
}
public void populatePathParams(HttpRequest request, Matcher matcher, String path)
{
ResteasyUriInfo uriInfo = (ResteasyUriInfo) request.getUri();
for (Group group : groups)
{
String value = matcher.group(group.group);
uriInfo.addEncodedPathParameter(group.name, value);
int index = matcher.start(group.group);
int start = 0;
if (path.charAt(0) == '/') start++;
int segmentIndex = 0;
if (start < path.length())
{
int count = 0;
for (int i = start; i < index && i < path.length(); i++)
{
if (path.charAt(i) == '/') count++;
}
segmentIndex = count;
}
int numSegments = 1;
for (int i = 0; i < value.length(); i++)
{
if (value.charAt(i) == '/') numSegments++;
}
if (segmentIndex + numSegments > request.getUri().getPathSegments().size())
{
throw new BadRequestException(Messages.MESSAGES.numberOfMatchedSegments());
}
PathSegment[] encodedSegments = new PathSegment[numSegments];
PathSegment[] decodedSegments = new PathSegment[numSegments];
for (int i = 0; i < numSegments; i++)
{
decodedSegments[i] = request.getUri().getPathSegments().get(segmentIndex + i);
encodedSegments[i] = request.getUri().getPathSegments(false).get(segmentIndex + i);
}
uriInfo.getEncodedPathParameterPathSegments().add(group.name, encodedSegments);
uriInfo.getPathParameterPathSegments().add(group.name, decodedSegments);
}
}
public boolean isLocator()
{
return invoker instanceof ResourceLocatorInvoker;
}
public ResourceInvoker getInvoker()
{
return invoker;
}
}