1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.web.servlet.mvc.condition;
18
19 import java.util.Collection;
20 import java.util.Collections;
21 import java.util.LinkedHashSet;
22 import java.util.Set;
23 import javax.servlet.http.HttpServletRequest;
24
25 import org.springframework.web.bind.annotation.RequestMapping;
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public final class HeadersRequestCondition extends AbstractRequestCondition<HeadersRequestCondition> {
40
41 private final Set<HeaderExpression> expressions;
42
43
44
45
46
47
48
49
50
51 public HeadersRequestCondition(String... headers) {
52 this(parseExpressions(headers));
53 }
54
55 private HeadersRequestCondition(Collection<HeaderExpression> conditions) {
56 this.expressions = Collections.unmodifiableSet(new LinkedHashSet<HeaderExpression>(conditions));
57 }
58
59
60 private static Collection<HeaderExpression> parseExpressions(String... headers) {
61 Set<HeaderExpression> expressions = new LinkedHashSet<HeaderExpression>();
62 if (headers != null) {
63 for (String header : headers) {
64 HeaderExpression expr = new HeaderExpression(header);
65 if ("Accept".equalsIgnoreCase(expr.name) || "Content-Type".equalsIgnoreCase(expr.name)) {
66 continue;
67 }
68 expressions.add(expr);
69 }
70 }
71 return expressions;
72 }
73
74
75
76
77 public Set<NameValueExpression<String>> getExpressions() {
78 return new LinkedHashSet<NameValueExpression<String>>(this.expressions);
79 }
80
81 @Override
82 protected Collection<HeaderExpression> getContent() {
83 return this.expressions;
84 }
85
86 @Override
87 protected String getToStringInfix() {
88 return " && ";
89 }
90
91
92
93
94
95 @Override
96 public HeadersRequestCondition combine(HeadersRequestCondition other) {
97 Set<HeaderExpression> set = new LinkedHashSet<HeaderExpression>(this.expressions);
98 set.addAll(other.expressions);
99 return new HeadersRequestCondition(set);
100 }
101
102
103
104
105
106 @Override
107 public HeadersRequestCondition getMatchingCondition(HttpServletRequest request) {
108 for (HeaderExpression expression : expressions) {
109 if (!expression.match(request)) {
110 return null;
111 }
112 }
113 return this;
114 }
115
116
117
118
119
120
121
122
123
124
125
126
127 @Override
128 public int compareTo(HeadersRequestCondition other, HttpServletRequest request) {
129 return other.expressions.size() - this.expressions.size();
130 }
131
132
133
134
135
136 static class HeaderExpression extends AbstractNameValueExpression<String> {
137
138 public HeaderExpression(String expression) {
139 super(expression);
140 }
141
142 @Override
143 protected boolean isCaseSensitiveName() {
144 return false;
145 }
146
147 @Override
148 protected String parseValue(String valueExpression) {
149 return valueExpression;
150 }
151
152 @Override
153 protected boolean matchName(HttpServletRequest request) {
154 return request.getHeader(name) != null;
155 }
156
157 @Override
158 protected boolean matchValue(HttpServletRequest request) {
159 return value.equals(request.getHeader(name));
160 }
161 }
162
163 }