You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2008/02/26 20:32:03 UTC
svn commit: r631348 -
/incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONFilter.java
Author: jmsnell
Date: Tue Feb 26 11:32:02 2008
New Revision: 631348
URL: http://svn.apache.org/viewvc?rev=631348&view=rev
Log:
filter implementation that optionally converts an Atom document to json
Added:
incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONFilter.java
Added: incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONFilter.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONFilter.java?rev=631348&view=auto
==============================================================================
--- incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONFilter.java (added)
+++ incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONFilter.java Tue Feb 26 11:32:02 2008
@@ -0,0 +1,120 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. The ASF licenses this file to You
+* under the Apache License, Version 2.0 (the "License"); you may not
+* use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License. For additional information regarding
+* copyright in this work, please see the NOTICE file in the top level
+* directory of this distribution.
+*/
+package org.apache.abdera.ext.json;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.model.Document;
+import org.apache.abdera.model.Element;
+import org.apache.abdera.protocol.server.Filter;
+import org.apache.abdera.protocol.server.FilterChain;
+import org.apache.abdera.protocol.server.ProviderHelper;
+import org.apache.abdera.protocol.server.RequestContext;
+import org.apache.abdera.protocol.server.ResponseContext;
+import org.apache.abdera.protocol.server.context.ResponseContextWrapper;
+import org.apache.abdera.writer.Writer;
+
+/**
+ * Filter implementation that will convert an Atom document returned by
+ * the server into a JSON document if the request specifies a higher
+ * preference value for JSON or explicitly requests JSON by including
+ * a format=json querystring parameter
+ */
+public class JSONFilter
+ implements Filter {
+
+ public ResponseContext filter(
+ RequestContext request,
+ FilterChain chain) {
+ ResponseContext resp = chain.next(request);
+ String format = request.getParameter("format");
+ return jsonPreferred(request,resp.getContentType().toString()) ||
+ (format != null && format.equalsIgnoreCase("json")) ?
+ new JsonResponseContext(resp,request.getAbdera()) :
+ resp;
+ }
+
+ private boolean jsonPreferred(RequestContext request, String type) {
+ return ProviderHelper.isPreferred(
+ request,
+ "application/json",
+ type);
+ }
+
+ private class JsonResponseContext
+ extends ResponseContextWrapper {
+
+ private final Abdera abdera;
+
+ public JsonResponseContext(
+ ResponseContext response,
+ Abdera abdera) {
+ super(response);
+ setContentType("application/json");
+ this.abdera = abdera;
+ }
+
+ public void writeTo(
+ OutputStream out,
+ Writer writer)
+ throws IOException {
+ try {
+ toJson(out,writer);
+ } catch (Exception se) {
+ if (se instanceof RuntimeException)
+ throw (RuntimeException)se;
+ throw new RuntimeException(se);
+ }
+ }
+
+ public void writeTo(
+ OutputStream out)
+ throws IOException {
+ try {
+ toJson(out,null);
+ } catch (Exception se) {
+ if (se instanceof RuntimeException)
+ throw (RuntimeException)se;
+ throw new RuntimeException(se);
+ }
+ }
+
+ private void toJson(OutputStream aout,Writer writer) throws Exception {
+ Document<Element> doc = null;
+ try {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ if (writer == null)
+ super.writeTo(out);
+ else
+ super.writeTo(out,writer);
+ ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+ doc = abdera.getParser().parse(in);
+ } catch (Exception e) {}
+ if (doc != null) {
+ doc.writeTo("json",aout);
+ } else {
+ throw new RuntimeException(
+ "There was an error serializing the entry to JSON");
+ }
+ }
+ }
+}