View Javadoc

1   /**
2    * Copyright (C) 2005-2009 Alfresco Software Limited.
3    *
4    * This file is part of the Spring Surf Extension project.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *  http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
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   * Abdera Service Implementation
48   * 
49   * @author davidc
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       * Set available Writer names
63       * 
64       * @param writerNames  list of writer names
65       */
66      public void setWriters(List<String> writerNames)
67      {
68          this.writerNames = writerNames;
69      }
70      
71      /* (non-Javadoc)
72       * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
73       */
74      public void afterPropertiesSet()
75          throws Exception
76      {
77          // construct Abdera Service
78          abdera = new Abdera();
79          factory = abdera.getFactory();
80          parser = factory.newParser();
81          // TODO: parser options
82          
83          // construct writers
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          // construct qnames
100         qNames = new HashMap<String, QName>();
101     }
102 
103     /* (non-Javadoc)
104      * @see org.springframework.extensions.webscripts.atom.AbderaService#getAbdera()
105      */
106     public Abdera getAbdera()
107     {
108         return abdera;
109     }
110 
111     /* (non-Javadoc)
112      * @see org.springframework.extensions.webscripts.atom.AbderaService#getParser()
113      */
114     public Parser getParser()
115     {
116         return parser;
117     }
118 
119     /* (non-Javadoc)
120      * @see org.springframework.extensions.webscripts.atom.AbderaService#createEntry()
121      */
122     public Entry createEntry()
123     {
124         return factory.newEntry();
125     }
126 
127     /* (non-Javadoc)
128      * @see org.springframework.extensions.webscripts.atom.AbderaService#createFeed()
129      */
130     public Feed createFeed()
131     {
132         return factory.newFeed();
133     }
134 
135     /* (non-Javadoc)
136      * @see org.springframework.extensions.webscripts.atom.AbderaService#parse(java.io.InputStream, java.lang.String)
137      */
138     public Element parse(InputStream doc, String base)
139     {
140         Reader inputReader = new InputStreamReader(doc);
141         return parse(inputReader, base);
142     }
143 
144     /* (non-Javadoc)
145      * @see org.springframework.extensions.webscripts.atom.AbderaService#parse(java.io.Reader, java.lang.String)
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     /* (non-Javadoc)
164      * @see org.springframework.extensions.webscripts.atom.AbderaService#parseService(java.io.InputStream, java.lang.String)
165      */
166     public Service parseService(InputStream doc, String base)
167     {
168         Reader inputReader = new InputStreamReader(doc);
169         return parseService(inputReader, base);
170     }
171 
172     /* (non-Javadoc)
173      * @see org.springframework.extensions.webscripts.atom.AbderaService#parseService(java.io.Reader, java.lang.String)
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     /* (non-Javadoc)
187      * @see org.springframework.extensions.webscripts.atom.AbderaService#parseEntry(java.io.InputStream, java.lang.String)
188      */
189     public Entry parseEntry(InputStream doc, String base)
190     {
191         Reader inputReader = new InputStreamReader(doc);
192         return parseEntry(inputReader, base);
193     }
194 
195     /* (non-Javadoc)
196      * @see org.springframework.extensions.webscripts.atom.AbderaService#parseEntry(java.io.Reader, java.lang.String)
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     /* (non-Javadoc)
210      * @see org.springframework.extensions.webscripts.atom.AbderaService#parseFeed(java.io.InputStream, java.lang.String)
211      */
212     public Feed parseFeed(InputStream doc, String base)
213     {
214         Reader inputReader = new InputStreamReader(doc);
215         return parseFeed(inputReader, base);
216     }
217 
218     /* (non-Javadoc)
219      * @see org.springframework.extensions.webscripts.atom.AbderaService#parseFeed(java.io.Reader, java.lang.String)
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     /* (non-Javadoc)
233      * @see org.springframework.extensions.webscripts.atom.AbderaService#getWriter(java.lang.String)
234      */
235     public Writer getWriter(String name)
236     {
237         return writers.get(name);
238     }
239 
240     /* (non-Javadoc)
241      * @see org.springframework.extensions.webscripts.atom.AbderaService#getNames()
242      */
243     public Map<String, QName> getNames()
244     {
245         return Collections.unmodifiableMap(qNames);
246     }
247 
248     /**
249      * Register QName
250      * 
251      * @param alias
252      * @param qname
253      */
254     public void registerQName(String alias, String qname)
255     {
256         qNames.put(alias, QName.valueOf(qname));
257     }
258 
259     /**
260      * Register Extension Factory
261      * @param extensionFactory
262      */
263     public void registerExtensionFactory(ExtensionFactory extensionFactory)
264     {
265         factory.registerExtension(extensionFactory);
266     }
267 
268 }