1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.springframework.extensions.webscripts;
20
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26
27
28
29
30
31
32 public class FormatRegistry
33 {
34
35 private static final Log logger = LogFactory.getLog(FormatRegistry.class);
36
37 private Map<String, String> formats;
38 private Map<String, String> mimetypes;
39 private Map<String, Map<String, String>> agentFormats;
40 private Map<String, Map<String, String>> agentMimetypes;
41 private Map<String, FormatReader<Object>> readers;
42 private FormatReader<Object> defaultReader;
43 private Map<String, FormatWriter<Object>> writers;
44
45
46
47
48
49 public FormatRegistry()
50 {
51 formats = new HashMap<String, String>();
52 mimetypes = new HashMap<String, String>();
53 agentFormats = new HashMap<String, Map<String, String>>();
54 agentMimetypes = new HashMap<String, Map<String, String>>();
55 readers = new HashMap<String, FormatReader<Object>>();
56 writers = new HashMap<String, FormatWriter<Object>>();
57 }
58
59
60
61
62
63
64 public void setDefaultReader(FormatReader<Object> defaultReader)
65 {
66 this.defaultReader = defaultReader;
67 }
68
69
70
71
72
73
74
75 public void addReader(FormatReader<Object> reader)
76 {
77 String mimetype = reader.getSourceMimetype();
78 readers.put(reader.getSourceMimetype(), reader);
79 if (logger.isDebugEnabled())
80 logger.debug("Registered format reader: converts mimetype '" + mimetype + "' to class '" + reader.getDestinationClass().getSimpleName() + "'");
81 }
82
83
84
85
86
87
88
89 public void addWriter(FormatWriter<Object> writer)
90 {
91 String mimetype = writer.getDestinationMimetype();
92 Class<? extends Object> clazz = writer.getSourceClass();
93 writers.put(clazz.getName() + "||" + mimetype, writer);
94 if (logger.isDebugEnabled())
95 logger.debug("Registered format writer: converts class '" + clazz.getSimpleName() + "' to mimetype '" + mimetype + "'");
96 }
97
98
99
100
101
102
103
104 public void addFormats(String agent, Map<String, String> formatsToAdd)
105 {
106 Map<String, String> formatsForAgent = formats;
107 if (agent != null)
108 {
109 formatsForAgent = agentFormats.get(agent);
110 if (formatsForAgent == null)
111 {
112 formatsForAgent = new HashMap<String, String>();
113 agentFormats.put(agent, formatsForAgent);
114 }
115 }
116
117 for (Map.Entry<String, String> entry : formatsToAdd.entrySet())
118 {
119 if (logger.isWarnEnabled())
120 {
121 String val = formatsForAgent.get(entry.getKey());
122 if (val != null)
123 {
124 logger.warn("Replacing mimetype '" + val + "' with '" + entry.getValue() + "' for format '" + entry.getKey() + "' (agent: " + agent + ")");
125 }
126 }
127
128 formatsForAgent.put(entry.getKey(), entry.getValue());
129
130 if (logger.isDebugEnabled())
131 logger.debug("Registered format '" + entry.getKey() + "' for mimetype '" + entry.getValue() + "' (agent: " + agent + ")");
132 }
133 }
134
135
136
137
138
139
140
141 public void addMimetypes(String agent, Map<String, String> mimetypesToAdd)
142 {
143 Map<String, String> mimetypesForAgent = mimetypes;
144 if (agent != null)
145 {
146 mimetypesForAgent = agentMimetypes.get(agent);
147 if (mimetypesForAgent == null)
148 {
149 mimetypesForAgent = new HashMap<String, String>();
150 agentMimetypes.put(agent, mimetypesForAgent);
151 }
152 }
153
154 for (Map.Entry<String, String> entry : mimetypesToAdd.entrySet())
155 {
156 if (logger.isWarnEnabled())
157 {
158 String val = mimetypesForAgent.get(entry.getKey());
159 if (val != null)
160 {
161 logger.warn("Replacing format '" + val + "' with '" + entry.getValue() + "' for mimetype '" + entry.getKey() + "' (agent: " + agent + ")");
162 }
163 }
164
165 mimetypesForAgent.put(entry.getKey(), entry.getValue());
166
167 if (logger.isDebugEnabled())
168 logger.debug("Registered mimetype '" + entry.getKey() + "' for format '" + entry.getValue() + "' (agent: " + agent + ")");
169 }
170 }
171
172
173
174
175
176
177
178
179 public String getMimeType(String agent, String format)
180 {
181 String mimetype = null;
182
183 if (agent != null)
184 {
185 Map<String, String> formatsForAgent = agentFormats.get(agent);
186 if (formatsForAgent != null)
187 {
188 mimetype = formatsForAgent.get(format);
189 }
190 }
191
192 if (mimetype == null)
193 {
194 mimetype = formats.get(format);
195 }
196
197 return mimetype;
198 }
199
200
201
202
203
204
205
206
207 public String getFormat(String agent, String mimetype)
208 {
209 String format = null;
210
211 if (agent != null)
212 {
213 Map<String, String> mimetypesForAgent = agentMimetypes.get(agent);
214 if (mimetypesForAgent != null)
215 {
216 format = mimetypesForAgent.get(mimetype);
217 }
218 }
219
220 if (format == null)
221 {
222 format = mimetypes.get(mimetype);
223 }
224
225 return format;
226 }
227
228
229
230
231
232
233
234 public FormatReader<Object> getReader(String mimetype)
235 {
236 if (mimetype == null)
237 {
238 return defaultReader;
239 }
240
241
242 String generalizedMimetype = mimetype;
243 while (generalizedMimetype != null)
244 {
245 FormatReader<Object> reader = readers.get(generalizedMimetype);
246 if (reader != null)
247 {
248 return reader;
249 }
250 generalizedMimetype = generalizeMimetype(generalizedMimetype);
251 }
252 return null;
253 }
254
255
256
257
258
259
260
261
262
263 public FormatWriter<Object> getWriter(Object object, String mimetype)
264 {
265
266 String generalizedMimetype = mimetype;
267 while (generalizedMimetype != null)
268 {
269 FormatWriter<Object> writer = writers.get(object.getClass().getName() + "||" + generalizedMimetype);
270 if (writer != null)
271 {
272 return writer;
273 }
274 generalizedMimetype = generalizeMimetype(generalizedMimetype);
275 }
276 return null;
277 }
278
279
280
281
282
283
284
285 public String generalizeMimetype(String mimetype)
286 {
287 String generalizedMimetype = null;
288 if (mimetype != null)
289 {
290 int params = mimetype.lastIndexOf(";");
291 if (params != -1)
292 {
293 generalizedMimetype = mimetype.substring(0, params);
294 }
295 }
296 return generalizedMimetype;
297 }
298
299 }