diff options
author | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2008-08-13 11:18:32 +0000 |
---|---|---|
committer | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2008-08-13 11:18:32 +0000 |
commit | 76350b074c8ef62ba4f1d95ece7bc43921ea9e4b (patch) | |
tree | d72caf74d894bf7476f7d3a1450405db848660b2 /java/sca/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java | |
parent | a79d9789ae878f8e10650a0015ff826d246b884e (diff) |
TUSCANY-2504: apply patch from Dan Becker to give Atom binding support for negotiated content types
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@685516 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r-- | java/sca/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java | 85 |
1 files changed, 66 insertions, 19 deletions
diff --git a/java/sca/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java b/java/sca/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java index e171de8595..766907ef11 100644 --- a/java/sca/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java +++ b/java/sca/modules/binding-atom-abdera/src/main/java/org/apache/tuscany/sca/binding/atom/provider/AtomBindingListenerServlet.java @@ -48,12 +48,14 @@ import org.apache.abdera.model.Service; import org.apache.abdera.model.Workspace; import org.apache.abdera.parser.ParseException; import org.apache.abdera.parser.Parser; +import org.apache.abdera.writer.WriterFactory; + import org.apache.commons.codec.binary.Base64; import org.apache.tuscany.sca.data.collection.Entry; import org.apache.tuscany.sca.databinding.Mediator; import org.apache.tuscany.sca.interfacedef.DataType; -import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl; +import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.interfacedef.util.XMLType; import org.apache.tuscany.sca.invocation.InvocationChain; import org.apache.tuscany.sca.invocation.Invoker; @@ -318,18 +320,35 @@ class AtomBindingListenerServlet extends HttpServlet { } } } - - // Write the Atom feed - response.setContentType("application/atom+xml; charset=utf-8"); - // Provide Etag based on Id and time. - response.addHeader(ETAG, feedETag ); - if ( feedUpdated != null ) - response.addHeader(LASTMODIFIED, dateFormat.format( feedUpdated )); - try { - feed.getDocument().writeTo(response.getOutputStream()); - } catch (IOException ioe) { - throw new ServletException(ioe); - } + // Content negotiation + String acceptType = request.getHeader( "Accept" ); + String preferredType = getContentPreference( acceptType ); + if (( preferredType != null ) && ((preferredType.indexOf( "json") > -1) || (preferredType.indexOf( "JSON") > -1 ))) { + // JSON response body + response.setContentType("application/json;type=feed"); + + try { + Abdera abdera = new Abdera(); + WriterFactory wf = abdera.getWriterFactory(); + org.apache.abdera.writer.Writer json = wf.getWriter("json"); + feed.writeTo(json, response.getWriter()); + } catch (Exception e) { + throw new ServletException(e); + } + + } else { + // Write the Atom feed + response.setContentType("application/atom+xml;type=feed"); + // Provide Etag based on Id and time. + response.addHeader(ETAG, feedETag ); + if ( feedUpdated != null ) + response.addHeader(LASTMODIFIED, dateFormat.format( feedUpdated )); + try { + feed.getDocument().writeTo(response.getOutputStream()); + } catch (IOException ioe) { + throw new ServletException(ioe); + } + } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } @@ -374,12 +393,30 @@ class AtomBindingListenerServlet extends HttpServlet { response.addHeader(LOCATION, link.getHref().toString()); } } - response.setContentType("application/atom+xml;type=entry"); - try { - feedEntry.writeTo(getWriter(response)); - } catch (IOException ioe) { - throw new ServletException(ioe); - } + + // Content negotiation + String acceptType = request.getHeader( "Accept" ); + String preferredType = getContentPreference( acceptType ); + if (( preferredType != null ) && ((preferredType.indexOf( "json") > -1) || (preferredType.indexOf( "JSON") > -1 ))) { + // JSON response body + response.setContentType("application/json;type=entry"); + try { + Abdera abdera = new Abdera(); + WriterFactory wf = abdera.getWriterFactory(); + org.apache.abdera.writer.Writer json = wf.getWriter("json"); + feedEntry.writeTo(json, response.getWriter()); + } catch (Exception e) { + throw new ServletException(e); + } + } else { + // XML response body + response.setContentType("application/atom+xml;type=entry"); + try { + feedEntry.writeTo(getWriter(response)); + } catch (IOException ioe) { + throw new ServletException(ioe); + } + } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } @@ -710,4 +747,14 @@ class AtomBindingListenerServlet extends HttpServlet { return feedId + "-" + feedUpdated.hashCode(); } + + public static String getContentPreference( String acceptType ) { + if (( acceptType == null ) || ( acceptType.length() < 1 )) { + return "application/atom+xml"; + } + StringTokenizer st = new StringTokenizer( acceptType, "," ); + if ( st.hasMoreTokens() ) + return st.nextToken(); + return "application/atom+xml"; + } } |