1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.springframework.extensions.webscripts.atom;
20
21 import java.io.InputStream;
22 import java.io.InputStreamReader;
23 import java.io.Reader;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28
29 import javax.servlet.http.HttpServletResponse;
30 import javax.xml.namespace.QName;
31
32 import org.apache.abdera.Abdera;
33 import org.apache.abdera.factory.ExtensionFactory;
34 import org.apache.abdera.factory.Factory;
35 import org.apache.abdera.model.Document;
36 import org.apache.abdera.model.Element;
37 import org.apache.abdera.model.Entry;
38 import org.apache.abdera.model.Feed;
39 import org.apache.abdera.model.Service;
40 import org.apache.abdera.parser.Parser;
41 import org.apache.abdera.writer.Writer;
42 import org.springframework.beans.factory.InitializingBean;
43 import org.springframework.extensions.webscripts.WebScriptException;
44
45
46
47
48
49
50
51 public class AbderaServiceImpl implements AbderaService, InitializingBean
52 {
53 private Abdera abdera;
54 private Parser parser;
55 private Factory factory;
56 private List<String> writerNames;
57 private Map<String,Writer> writers;
58 private Map<String, QName> qNames;
59
60
61
62
63
64
65
66 public void setWriters(List<String> writerNames)
67 {
68 this.writerNames = writerNames;
69 }
70
71
72
73
74 public void afterPropertiesSet()
75 throws Exception
76 {
77
78 abdera = new Abdera();
79 factory = abdera.getFactory();
80 parser = factory.newParser();
81
82
83
84 writers = new HashMap<String, Writer>(writerNames == null ? 1 : writerNames.size() +1);
85 writers.put(AbderaService.DEFAULT_WRITER, abdera.getWriter());
86 if (writerNames != null)
87 {
88 for (String writerName : writerNames)
89 {
90 Writer writer = abdera.getWriterFactory().getWriter(writerName);
91 if (writer == null)
92 {
93 throw new WebScriptException("Failed to register Atom writer '" + writerName + "'; does not exist.");
94 }
95 writers.put(writerName, writer);
96 }
97 }
98
99
100 qNames = new HashMap<String, QName>();
101 }
102
103
104
105
106 public Abdera getAbdera()
107 {
108 return abdera;
109 }
110
111
112
113
114 public Parser getParser()
115 {
116 return parser;
117 }
118
119
120
121
122 public Entry createEntry()
123 {
124 return factory.newEntry();
125 }
126
127
128
129
130 public Feed createFeed()
131 {
132 return factory.newFeed();
133 }
134
135
136
137
138 public Element parse(InputStream doc, String base)
139 {
140 Reader inputReader = new InputStreamReader(doc);
141 return parse(inputReader, base);
142 }
143
144
145
146
147 public Element parse(Reader doc, String base)
148 {
149 Document<Element> entryDoc;
150 if (base != null && base.length() > 0)
151 {
152 entryDoc = parser.parse(doc, base);
153 }
154 else
155 {
156 entryDoc = parser.parse(doc);
157 }
158
159 Element root = entryDoc.getRoot();
160 return root;
161 }
162
163
164
165
166 public Service parseService(InputStream doc, String base)
167 {
168 Reader inputReader = new InputStreamReader(doc);
169 return parseService(inputReader, base);
170 }
171
172
173
174
175 public Service parseService(Reader doc, String base)
176 {
177 Element root = parse(doc, base);
178 if (!Service.class.isAssignableFrom(root.getClass()))
179 {
180 throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, "Expected APP Service, but recieved " + root.getClass());
181 }
182
183 return (Service)root;
184 }
185
186
187
188
189 public Entry parseEntry(InputStream doc, String base)
190 {
191 Reader inputReader = new InputStreamReader(doc);
192 return parseEntry(inputReader, base);
193 }
194
195
196
197
198 public Entry parseEntry(Reader doc, String base)
199 {
200 Element root = parse(doc, base);
201 if (!Entry.class.isAssignableFrom(root.getClass()))
202 {
203 throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, "Expected Atom Entry, but recieved " + root.getClass());
204 }
205
206 return (Entry)root;
207 }
208
209
210
211
212 public Feed parseFeed(InputStream doc, String base)
213 {
214 Reader inputReader = new InputStreamReader(doc);
215 return parseFeed(inputReader, base);
216 }
217
218
219
220
221 public Feed parseFeed(Reader doc, String base)
222 {
223 Element root = parse(doc, base);
224 if (!Feed.class.isAssignableFrom(root.getClass()))
225 {
226 throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, "Expected Atom Feed, but recieved " + root.getClass());
227 }
228
229 return (Feed)root;
230 }
231
232
233
234
235 public Writer getWriter(String name)
236 {
237 return writers.get(name);
238 }
239
240
241
242
243 public Map<String, QName> getNames()
244 {
245 return Collections.unmodifiableMap(qNames);
246 }
247
248
249
250
251
252
253
254 public void registerQName(String alias, String qname)
255 {
256 qNames.put(alias, QName.valueOf(qname));
257 }
258
259
260
261
262
263 public void registerExtensionFactory(ExtensionFactory extensionFactory)
264 {
265 factory.registerExtension(extensionFactory);
266 }
267
268 }