1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.web.method.annotation;
18
19 import java.util.Arrays;
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.HashSet;
23 import java.util.Map;
24 import java.util.Set;
25 import java.util.concurrent.ConcurrentHashMap;
26
27 import org.springframework.core.annotation.AnnotationUtils;
28 import org.springframework.util.Assert;
29 import org.springframework.web.bind.annotation.SessionAttributes;
30 import org.springframework.web.bind.support.SessionAttributeStore;
31 import org.springframework.web.bind.support.SessionStatus;
32 import org.springframework.web.context.request.WebRequest;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public class SessionAttributesHandler {
49
50 private final Set<String> attributeNames = new HashSet<String>();
51
52 private final Set<Class<?>> attributeTypes = new HashSet<Class<?>>();
53
54 private final Set<String> knownAttributeNames =
55 Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(4));
56
57 private final SessionAttributeStore sessionAttributeStore;
58
59
60
61
62
63
64
65
66
67 public SessionAttributesHandler(Class<?> handlerType, SessionAttributeStore sessionAttributeStore) {
68 Assert.notNull(sessionAttributeStore, "SessionAttributeStore may not be null.");
69 this.sessionAttributeStore = sessionAttributeStore;
70
71 SessionAttributes annotation = AnnotationUtils.findAnnotation(handlerType, SessionAttributes.class);
72 if (annotation != null) {
73 this.attributeNames.addAll(Arrays.asList(annotation.value()));
74 this.attributeTypes.addAll(Arrays.<Class<?>>asList(annotation.types()));
75 }
76
77 for (String attributeName : this.attributeNames) {
78 this.knownAttributeNames.add(attributeName);
79 }
80 }
81
82
83
84
85
86 public boolean hasSessionAttributes() {
87 return ((this.attributeNames.size() > 0) || (this.attributeTypes.size() > 0));
88 }
89
90
91
92
93
94
95
96
97
98
99
100
101 public boolean isHandlerSessionAttribute(String attributeName, Class<?> attributeType) {
102 Assert.notNull(attributeName, "Attribute name must not be null");
103 if (this.attributeNames.contains(attributeName) || this.attributeTypes.contains(attributeType)) {
104 this.knownAttributeNames.add(attributeName);
105 return true;
106 }
107 else {
108 return false;
109 }
110 }
111
112
113
114
115
116
117
118 public void storeAttributes(WebRequest request, Map<String, ?> attributes) {
119 for (String name : attributes.keySet()) {
120 Object value = attributes.get(name);
121 Class<?> attrType = (value != null) ? value.getClass() : null;
122
123 if (isHandlerSessionAttribute(name, attrType)) {
124 this.sessionAttributeStore.storeAttribute(request, name, value);
125 }
126 }
127 }
128
129
130
131
132
133
134
135
136 public Map<String, Object> retrieveAttributes(WebRequest request) {
137 Map<String, Object> attributes = new HashMap<String, Object>();
138 for (String name : this.knownAttributeNames) {
139 Object value = this.sessionAttributeStore.retrieveAttribute(request, name);
140 if (value != null) {
141 attributes.put(name, value);
142 }
143 }
144 return attributes;
145 }
146
147
148
149
150
151
152
153 public void cleanupAttributes(WebRequest request) {
154 for (String attributeName : this.knownAttributeNames) {
155 this.sessionAttributeStore.cleanupAttribute(request, attributeName);
156 }
157 }
158
159
160
161
162
163
164
165 Object retrieveAttribute(WebRequest request, String attributeName) {
166 return this.sessionAttributeStore.retrieveAttribute(request, attributeName);
167 }
168
169 }