1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.server.endpoint.mapping;
18
19 import java.util.HashMap;
20 import java.util.Iterator;
21 import java.util.Map;
22 import java.util.Properties;
23
24 import org.springframework.beans.BeansException;
25 import org.springframework.context.ApplicationContextException;
26 import org.springframework.util.StringUtils;
27 import org.springframework.ws.context.MessageContext;
28
29
30
31
32
33
34
35
36
37
38
39 public abstract class AbstractMapBasedEndpointMapping extends AbstractEndpointMapping {
40
41 private boolean lazyInitEndpoints = false;
42
43 private boolean registerBeanNames = false;
44
45 private final Map endpointMap = new HashMap();
46
47
48 private Map temporaryEndpointMap = new HashMap();
49
50
51
52
53
54
55
56
57
58
59 public void setLazyInitEndpoints(boolean lazyInitEndpoints) {
60 this.lazyInitEndpoints = lazyInitEndpoints;
61 }
62
63
64
65
66
67 public final void setRegisterBeanNames(boolean registerBeanNames) {
68 this.registerBeanNames = registerBeanNames;
69 }
70
71
72
73
74
75
76
77 public final void setEndpointMap(Map endpointMap) {
78 temporaryEndpointMap.putAll(endpointMap);
79 }
80
81
82
83
84
85 public void setMappings(Properties mappings) {
86 temporaryEndpointMap.putAll(mappings);
87 }
88
89
90 protected abstract boolean validateLookupKey(String key);
91
92
93
94
95
96
97 protected abstract String getLookupKeyForMessage(MessageContext messageContext) throws Exception;
98
99
100
101
102
103
104
105 protected final Object getEndpointInternal(MessageContext messageContext) throws Exception {
106 String key = getLookupKeyForMessage(messageContext);
107 if (!StringUtils.hasLength(key)) {
108 return null;
109 }
110 if (logger.isDebugEnabled()) {
111 logger.debug("Looking up endpoint for [" + key + "]");
112 }
113 return lookupEndpoint(key);
114 }
115
116
117
118
119
120
121
122 protected Object lookupEndpoint(String key) {
123 return endpointMap.get(key);
124 }
125
126
127
128
129
130
131
132
133
134 protected void registerEndpoint(String key, Object endpoint) throws BeansException {
135 Object mappedEndpoint = endpointMap.get(key);
136 if (mappedEndpoint != null) {
137 throw new ApplicationContextException("Cannot map endpoint [" + endpoint + "] on registration key [" + key +
138 "]: there's already endpoint [" + mappedEndpoint + "] mapped");
139 }
140 if (!lazyInitEndpoints && endpoint instanceof String) {
141 String endpointName = (String) endpoint;
142 endpoint = resolveStringEndpoint(endpointName);
143 }
144 if (endpoint == null) {
145 throw new ApplicationContextException("Could not find endpoint for key [" + key + "]");
146 }
147 endpointMap.put(key, endpoint);
148 if (logger.isDebugEnabled()) {
149 logger.debug("Mapped key [" + key + "] onto endpoint [" + endpoint + "]");
150 }
151 }
152
153
154
155
156
157
158
159
160
161
162
163
164 protected final void initApplicationContext() throws BeansException {
165 for (Iterator iter = temporaryEndpointMap.keySet().iterator(); iter.hasNext();) {
166 String key = (String) iter.next();
167 Object endpoint = temporaryEndpointMap.get(key);
168 if (!validateLookupKey(key)) {
169 throw new ApplicationContextException("Invalid key [" + key + "] for endpoint [" + endpoint + "]");
170 }
171 registerEndpoint(key, endpoint);
172 }
173 temporaryEndpointMap = null;
174 if (registerBeanNames) {
175 if (logger.isDebugEnabled()) {
176 logger.debug("Looking for endpoint mappings in application context: [" + getApplicationContext() + "]");
177 }
178 String[] beanNames = getApplicationContext().getBeanDefinitionNames();
179 for (int i = 0; i < beanNames.length; i++) {
180 if (validateLookupKey(beanNames[i])) {
181 registerEndpoint(beanNames[i], beanNames[i]);
182 }
183 String[] aliases = getApplicationContext().getAliases(beanNames[i]);
184 for (int j = 0; j < aliases.length; j++) {
185 if (validateLookupKey(aliases[j])) {
186 registerEndpoint(aliases[j], beanNames[i]);
187 }
188 }
189 }
190 }
191 }
192
193 }