You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by et...@apache.org on 2008/05/10 12:38:57 UTC
svn commit: r655042 - in /incubator/shindig/trunk/java:
gadgets/src/main/java/org/apache/shindig/common/servlet/
gadgets/src/main/java/org/apache/shindig/gadgets/http/
server/src/main/webapp/WEB-INF/
social-api/src/main/java/org/apache/shindig/social/ ...
Author: etnu
Date: Sat May 10 03:38:57 2008
New Revision: 655042
URL: http://svn.apache.org/viewvc?rev=655042&view=rev
Log:
Migrating shared servlet code to common package. Also including missing files from last patch.
Added:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/GuiceServletContextListener.java
- copied, changed from r655017, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GuiceServletContextListener.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/InjectedServlet.java
- copied, changed from r655017, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/InjectedServlet.java
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONStream.java
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONUtil.java
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONWriter.java
Removed:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GuiceServletContextListener.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/InjectedServlet.java
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/RpcServlet.java
incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml
incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.gadgets.xml
incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.social.xml
incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/GadgetDataServlet.java
incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/RestServerServlet.java
incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/JettyServer.java
Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/GuiceServletContextListener.java (from r655017, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GuiceServletContextListener.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/GuiceServletContextListener.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/GuiceServletContextListener.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GuiceServletContextListener.java&r1=655017&r2=655042&rev=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GuiceServletContextListener.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/GuiceServletContextListener.java Sat May 10 03:38:57 2008
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.shindig.gadgets.http;
+package org.apache.shindig.common.servlet;
import com.google.inject.Guice;
import com.google.inject.Module;
Copied: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/InjectedServlet.java (from r655017, incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/InjectedServlet.java)
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/InjectedServlet.java?p2=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/InjectedServlet.java&p1=incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/InjectedServlet.java&r1=655017&r2=655042&rev=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/InjectedServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/common/servlet/InjectedServlet.java Sat May 10 03:38:57 2008
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.shindig.gadgets.http;
+package org.apache.shindig.common.servlet;
import com.google.inject.Injector;
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java Sat May 10 03:38:57 2008
@@ -17,6 +17,8 @@
*/
package org.apache.shindig.gadgets.http;
+import org.apache.shindig.common.servlet.InjectedServlet;
+
import com.google.inject.Inject;
import com.google.inject.Provider;
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java Sat May 10 03:38:57 2008
@@ -18,6 +18,7 @@
package org.apache.shindig.gadgets.http;
import org.apache.shindig.common.SecurityTokenDecoder;
+import org.apache.shindig.common.servlet.InjectedServlet;
import org.apache.shindig.gadgets.GadgetContext;
import org.apache.shindig.gadgets.GadgetFeature;
import org.apache.shindig.gadgets.GadgetFeatureFactory;
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java Sat May 10 03:38:57 2008
@@ -18,6 +18,7 @@
*/
package org.apache.shindig.gadgets.http;
+import org.apache.shindig.common.servlet.InjectedServlet;
import org.apache.shindig.gadgets.GadgetException;
import com.google.inject.Inject;
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/RpcServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/RpcServlet.java?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/RpcServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/RpcServlet.java Sat May 10 03:38:57 2008
@@ -19,6 +19,7 @@
package org.apache.shindig.gadgets.http;
+import org.apache.shindig.common.servlet.InjectedServlet;
import org.apache.shindig.util.InputStreamConsumer;
import com.google.inject.Inject;
Modified: incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml (original)
+++ incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.full.xml Sat May 10 03:38:57 2008
@@ -30,7 +30,7 @@
</context-param>
<listener>
- <listener-class>org.apache.shindig.gadgets.http.GuiceServletContextListener</listener-class>
+ <listener-class>org.apache.shindig.common.servlet.GuiceServletContextListener</listener-class>
</listener>
<!-- Render a Gadget -->
Modified: incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.gadgets.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.gadgets.xml?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.gadgets.xml (original)
+++ incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.gadgets.xml Sat May 10 03:38:57 2008
@@ -30,7 +30,7 @@
</context-param>
<listener>
- <listener-class>org.apache.shindig.gadgets.http.GuiceServletContextListener</listener-class>
+ <listener-class>org.apache.shindig.common.servlet.GuiceServletContextListener</listener-class>
</listener>
<!-- Render a Gadget -->
Modified: incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.social.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.social.xml?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.social.xml (original)
+++ incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.social.xml Sat May 10 03:38:57 2008
@@ -30,7 +30,7 @@
</context-param>
<listener>
- <listener-class>org.apache.shindig.gadgets.http.GuiceServletContextListener</listener-class>
+ <listener-class>org.apache.shindig.common.servlet.GuiceServletContextListener</listener-class>
</listener>
<!-- Serve social data -->
Modified: incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml (original)
+++ incubator/shindig/trunk/java/server/src/main/webapp/WEB-INF/web.xml Sat May 10 03:38:57 2008
@@ -30,7 +30,7 @@
</context-param>
<listener>
- <listener-class>org.apache.shindig.gadgets.http.GuiceServletContextListener</listener-class>
+ <listener-class>org.apache.shindig.common.servlet.GuiceServletContextListener</listener-class>
</listener>
<!-- Render a Gadget -->
Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/GadgetDataServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/GadgetDataServlet.java?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/GadgetDataServlet.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/GadgetDataServlet.java Sat May 10 03:38:57 2008
@@ -20,7 +20,7 @@
import org.apache.shindig.common.SecurityToken;
import org.apache.shindig.common.SecurityTokenDecoder;
import org.apache.shindig.common.SecurityTokenException;
-import org.apache.shindig.gadgets.http.InjectedServlet;
+import org.apache.shindig.common.servlet.InjectedServlet;
import org.apache.shindig.social.opensocial.util.BeanJsonConverter;
import com.google.inject.Inject;
Modified: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/RestServerServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/RestServerServlet.java?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/RestServerServlet.java (original)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/RestServerServlet.java Sat May 10 03:38:57 2008
@@ -18,7 +18,7 @@
*/
package org.apache.shindig.social;
-import org.apache.shindig.gadgets.http.GuiceServletContextListener;
+import org.apache.shindig.common.servlet.GuiceServletContextListener;
import org.apache.shindig.social.abdera.json.JSONWriter;
import com.google.inject.Injector;
Added: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java?rev=655042&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java (added)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONFilter.java Sat May 10 03:38:57 2008
@@ -0,0 +1,133 @@
+/*
+* 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.
+*/
+/**
+ * THIS IS COPIED from org.apache.abdera.ext.json package.
+ */
+package org.apache.shindig.social.abdera.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");
+ if (format != null && format.equalsIgnoreCase("atom")) {
+ return resp;
+ }
+ // if there is no content, it could be either due to some error such as
+ // 404 or, there is no content to be translated into json. return
+ // TODO verify this claim
+ if (resp.getContentType() == null) {
+ return resp;
+ }
+
+ 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");
+ }
+ }
+ }
+}
Added: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONStream.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONStream.java?rev=655042&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONStream.java (added)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONStream.java Sat May 10 03:38:57 2008
@@ -0,0 +1,251 @@
+/*
+* 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.
+*/
+/**
+ * THIS IS COPIED from org.apache.abdera.ext.json package.
+ */
+package org.apache.shindig.social.abdera.json;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Date;
+import java.util.Stack;
+
+import javax.activation.MimeType;
+
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.model.AtomDate;
+import org.apache.abdera.util.EntityTag;
+
+public class JSONStream {
+
+ private final Writer writer;
+ private int depth = 0;
+ private final Stack<Boolean> sepstack = new Stack<Boolean>();
+
+ private void pushStack() {
+ sepstack.push(true);
+ }
+
+ private boolean isStart() {
+ boolean b = sepstack.peek();
+ if (b) {
+ sepstack.set(sepstack.size()-1, false);
+ }
+ return b;
+ }
+
+ private void popStack() {
+ sepstack.pop();
+ }
+
+ public JSONStream(Writer writer) {
+ this.writer = writer;
+ }
+
+ private void inc() {
+ depth++;
+ }
+
+ private void dec() {
+ depth--;
+ }
+
+ private void writeIndent() throws IOException {
+ for (int n = 0; n < depth; n++) {
+ writer.write(' ');
+ }
+ writer.flush();
+ }
+
+ private void writeNewLine() throws IOException {
+ writer.write('\n');
+ writer.flush();
+ }
+
+ public void startObject() throws IOException {
+ writer.write('{');
+ inc();
+ pushStack();
+ writer.flush();
+ }
+
+ public void endObject() throws IOException {
+ popStack();
+ dec();
+ writeNewLine();
+ writeIndent();
+ writer.write('}');
+ writer.flush();
+ }
+
+ public void startArray() throws IOException {
+ writer.write('[');
+ inc();
+ writer.flush();
+ }
+
+ public void endArray() throws IOException {
+ dec();
+ //writeNewLine();
+ //writeIndent();
+ writer.write(']');
+ writer.flush();
+ }
+
+ public void writeSeparator() throws IOException {
+ writer.write(',');
+ writer.flush();
+ }
+
+ private void writeColon() throws IOException {
+ writer.write(':');
+ writer.flush();
+ }
+
+ public void writeQuoted(String value) throws IOException {
+ writer.write('"');
+ writer.write(escape(value));
+ writer.write('"');
+ writer.flush();
+ }
+
+ public void writeValue(String value) throws IOException {
+ writer.write(value);
+ writer.flush();
+ }
+
+ public void writeField(String name) throws IOException {
+ if (name == null) {
+ return;
+ }
+
+ if (!isStart()) {
+ writeSeparator();
+ }
+ writeNewLine();
+ writeIndent();
+ writeQuoted(name);
+ writeColon();
+ }
+
+ public void skipWritingFieldName() throws IOException {
+ if (isStart()) {
+ return;
+ }
+ writeSeparator();
+ writeNewLine();
+ writeIndent();
+ }
+
+
+ public void writeField(String name, Date value) throws IOException {
+ if (value != null) {
+ writeField(name, AtomDate.format(value));
+ }
+ }
+
+ public void writeField(String name, IRI value) throws IOException {
+ if (value != null) {
+ writeField(name, value.toASCIIString());
+ }
+ }
+
+ public void writeField(String name, MimeType value) throws IOException {
+ if (value != null) {
+ writeField(name, value.toString());
+ }
+ }
+
+ public void writeField(String name, EntityTag value) throws IOException {
+ if (value != null) {
+ writeField(name, value.toString());
+ }
+ }
+
+ public void writeField(String name, String value) throws IOException {
+ if (value != null) {
+ writeField(name);
+ writeQuoted(value);
+ }
+ }
+
+ public void writeField(String name, Number value) throws IOException {
+ if (value != null) {
+ writeField(name);
+ writer.write(value.toString());
+ }
+ writer.flush();
+ }
+
+ public void writeField(String name, Boolean value) throws IOException {
+ if (value != null) {
+ writeField(name);
+ writer.write(value.toString());
+ }
+ writer.flush();
+ }
+
+ private static String escape(String value) {
+ if (value == null) {
+ return null;
+ }
+ StringBuffer buf = new StringBuffer();
+ char[] chars = value.toCharArray();
+ char b = 0;
+ String t = null;
+ for (char c : chars) {
+ switch(c) {
+ case '\\':
+ case '"':
+ buf.append('\\');
+ buf.append(c);
+ break;
+ case '/':
+ if (b == '<') {
+ buf.append('\\');
+ }
+ buf.append(c);
+ break;
+ case '\b':
+ buf.append("\\b");
+ break;
+ case '\t':
+ buf.append("\\t");
+ break;
+ case '\n':
+ buf.append("\\n");
+ break;
+ case '\f':
+ buf.append("\\f");
+ break;
+ case '\r':
+ buf.append("\\r");
+ break;
+ default:
+ if (c < ' ' || c > 127) {
+ t = "000" + Integer.toHexString(c);
+ buf.append("\\u" + t.substring(t.length() - 4));
+ } else {
+ buf.append(c);
+ }
+ }
+ b = c;
+ }
+ return buf.toString();
+ }
+}
Added: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONUtil.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONUtil.java?rev=655042&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONUtil.java (added)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONUtil.java Sat May 10 03:38:57 2008
@@ -0,0 +1,650 @@
+/*
+ * 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.
+ */
+/**
+ * THIS IS COPIED from org.apache.abdera.ext.json package.
+ */
+package org.apache.shindig.social.abdera.json;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.ext.bidi.BidiHelper;
+import org.apache.abdera.ext.html.HtmlHelper;
+import org.apache.abdera.ext.thread.InReplyTo;
+import org.apache.abdera.ext.thread.ThreadHelper;
+import org.apache.abdera.i18n.iri.IRI;
+import org.apache.abdera.i18n.text.Bidi.Direction;
+import org.apache.abdera.model.Base;
+import org.apache.abdera.model.Categories;
+import org.apache.abdera.model.Category;
+import org.apache.abdera.model.Collection;
+import org.apache.abdera.model.Content;
+import org.apache.abdera.model.Control;
+import org.apache.abdera.model.Div;
+import org.apache.abdera.model.Document;
+import org.apache.abdera.model.Element;
+import org.apache.abdera.model.Entry;
+import org.apache.abdera.model.ExtensibleElement;
+import org.apache.abdera.model.Feed;
+import org.apache.abdera.model.Generator;
+import org.apache.abdera.model.Link;
+import org.apache.abdera.model.Person;
+import org.apache.abdera.model.Source;
+import org.apache.abdera.model.Text;
+import org.apache.abdera.model.TextValue;
+import org.apache.abdera.xpath.XPath;
+
+@SuppressWarnings("unchecked")
+public class JSONUtil {
+
+ public static void toJson(
+ Base base,
+ Writer writer)
+ throws IOException {
+ JSONStream jstream = new JSONStream(writer);
+ if (base instanceof Document) {
+ toJson((Document)base,jstream);
+ } else if (base instanceof Element) {
+ toJson((Element)base,jstream);
+ }
+ writer.flush();
+ }
+
+ private static boolean isSameAsParentBase(
+ Element element) {
+ IRI parentbase = null;
+ if (element.getParentElement() != null) {
+ parentbase = element instanceof Document ?
+ ((Document)element).getBaseUri() :
+ element.getResolvedBaseUri();
+ }
+ IRI base = element.getResolvedBaseUri();
+
+ if (parentbase == null && base != null) {
+ return false;
+ }
+ if (parentbase == null && base == null) {
+ return true;
+ }
+ return parentbase.equals(element.getResolvedBaseUri());
+ }
+
+ private static void writeText (
+ Element element,
+ JSONStream jstream)
+ throws IOException {
+ Text text = (Text)element;
+ Text.Type texttype = text.getTextType();
+ if (texttype.equals(Text.Type.TEXT) &&
+ !needToWriteLanguageFields(text)) {
+ jstream.writeQuoted(text.getValue());
+ } else {
+ jstream.startObject();
+ jstream.writeField("attributes");
+ jstream.startObject();
+ jstream.writeField("type",texttype.name().toLowerCase());
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ jstream.endObject();
+ jstream.writeField("children");
+ switch(text.getTextType()) {
+ case TEXT:
+ jstream.startArray();
+ jstream.writeQuoted(text.getValue());
+ jstream.endArray();
+ break;
+ case HTML:
+ Div div = HtmlHelper.parse(text.getValue());
+ writeElementValue(div, jstream);
+ break;
+ case XHTML:
+ writeElementValue(text.getValueElement(), jstream);
+ break;
+ }
+ jstream.endObject();
+ }
+ }
+
+ private static void toJson(
+ Element element,
+ JSONStream jstream)
+ throws IOException {
+
+ if (element instanceof Text) {
+ writeText(element, jstream);
+ return;
+ }
+
+ if (element instanceof Content) {
+ Content content = (Content)element;
+ Content.Type contenttype = content.getContentType();
+ if (contenttype.equals(Content.Type.TEXT) &&
+ !needToWriteLanguageFields(content)) {
+ String buf = content.getValue();
+ if (buf.length() > 2) {
+ jstream.writeValue(buf.substring(1, buf.length() - 1));
+ }
+ }
+ return;
+ }
+
+ if (element instanceof Categories) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ Categories categories = (Categories) element;
+ jstream.writeField("fixed", categories.isFixed()?"true":"false");
+ jstream.writeField("scheme", categories.getScheme());
+ writeList("categories",categories.getCategories(),jstream);
+ writeExtensions((ExtensibleElement)element,jstream);
+ jstream.endObject();
+ return;
+ }
+
+ if (element instanceof Category) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ Category category = (Category) element;
+ jstream.writeField("term", category.getTerm());
+ jstream.writeField("scheme", category.getScheme());
+ jstream.writeField("label", category.getLabel());
+ writeExtensions((ExtensibleElement)element,jstream);
+ jstream.endObject();
+ return;
+ }
+
+ if (element instanceof Collection) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ Collection collection = (Collection)element;
+ jstream.writeField("href", collection.getResolvedHref());
+ writeElement("title",collection.getTitleElement(),jstream);
+ String[] accepts = collection.getAccept();
+ if (accepts != null || accepts.length > 0) {
+ jstream.writeField("accept");
+ jstream.startArray();
+ for (int n = 0; n < accepts.length; n++) {
+ jstream.writeQuoted(accepts[n]);
+ if (n < accepts.length - 1) {
+ jstream.writeSeparator();
+ }
+ }
+ jstream.endArray();
+ }
+ List<Categories> cats = collection.getCategories();
+ if (cats.size() > 0) {
+ writeList("categories",collection.getCategories(),jstream);
+ }
+ writeExtensions((ExtensibleElement)element,jstream);
+ jstream.endObject();
+ return;
+ }
+
+ if (element instanceof Control) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ Control control = (Control)element;
+ jstream.writeField("draft", control.isDraft()?"true":"false");
+ writeExtensions((ExtensibleElement)element,jstream);
+ jstream.endObject();
+ return;
+ }
+
+ if (element instanceof Entry) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ Entry entry = (Entry)element;
+ jstream.writeField("id", entry.getId());
+ writeElement("title", entry.getTitleElement(),jstream);
+ writeElement("summary", entry.getSummaryElement(),jstream);
+ writeElement("rights", entry.getRightsElement(),jstream);
+ writeElement("content", entry.getContentElement(),jstream);
+ jstream.writeField("updated", entry.getUpdated());
+ jstream.writeField("published", entry.getPublished());
+ jstream.writeField("edited", entry.getEdited());
+ writeElement("source", entry.getSource(),jstream);
+ writeList("authors",entry.getAuthors(),jstream);
+ writeList("contributors",entry.getContributors(),jstream);
+ writeList("links",entry.getLinks(),jstream);
+ writeList("categories",entry.getCategories(),jstream);
+ writeList("inreplyto",ThreadHelper.getInReplyTos(entry),jstream);
+ writeElement("control", entry.getControl(), jstream);
+ //writeExtensions((ExtensibleElement)element,jstream);
+ jstream.endObject();
+ return;
+ }
+
+ if (element instanceof Generator) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ Generator generator = (Generator)element;
+ jstream.writeField("version", generator.getVersion());
+ jstream.writeField("uri", generator.getResolvedUri());
+ jstream.writeField("value", generator.getText());
+ jstream.endObject();
+ return;
+ }
+
+ if (element instanceof Link) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ Link link = (Link)element;
+ jstream.writeField("href", link.getResolvedHref());
+ jstream.writeField("rel", link.getRel());
+ jstream.writeField("title", link.getTitle());
+ jstream.writeField("type", link.getMimeType());
+ jstream.writeField("hreflang", link.getHrefLang());
+ if (link.getLength() > -1) {
+ jstream.writeField("length", link.getLength());
+ }
+ writeExtensions((ExtensibleElement)element,jstream);
+ jstream.endObject();
+ return;
+ }
+
+ if (element instanceof Person) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ Person person = (Person)element;
+ jstream.writeField("name",person.getName());
+ if (person.getEmail() != null) {
+ jstream.writeField("email",person.getEmail());
+ }
+ if (person.getUri() != null) {
+ jstream.writeField("uri",person.getUriElement().getResolvedValue());
+ }
+ writeExtensions((ExtensibleElement)element,jstream);
+ jstream.endObject();
+ return;
+ }
+
+ if (element instanceof Source) {
+ //jstream.startObject();
+ writeLanguageFields(element, jstream);
+// if (!isSameAsParentBase(element)) {
+// jstream.writeField("xml:base", element.getResolvedBaseUri());
+// }
+ Source source = (Source)element;
+// jstream.writeField("id", source.getId());
+// writeElement("title", source.getTitleElement(),jstream);
+// writeElement("subtitle", source.getSubtitleElement(),jstream);
+// writeElement("rights", source.getRightsElement(),jstream);
+// jstream.writeField("updated", source.getUpdated());
+// writeElement("generator", source.getGenerator(),jstream);
+// if (source.getIconElement() != null) {
+// jstream.writeField("icon", source.getIconElement().getResolvedValue());
+// }
+// if (source.getLogoElement() != null) {
+// jstream.writeField("logo", source.getLogoElement().getResolvedValue());
+// }
+// writeList("authors",source.getAuthors(),jstream);
+// writeList("contributors",source.getContributors(),jstream);
+// writeList("links",source.getLinks(),jstream);
+// writeList("categories",source.getCategories(),jstream);
+// if (FeedPagingHelper.isComplete(source)) {
+// jstream.writeField("complete",true);
+// }
+// if (FeedPagingHelper.isArchive(source)) {
+// jstream.writeField("archive",true);
+// }
+ if (source instanceof Feed) {
+ //writeList("entries",((Feed)source).getEntries(),jstream);
+ writeList(null,((Feed)source).getEntries(),jstream);
+ }
+ //writeExtensions((ExtensibleElement)element,jstream);
+ //jstream.endObject();
+ return;
+ }
+
+ if (element instanceof InReplyTo) {
+ jstream.startObject();
+ writeLanguageFields(element, jstream);
+ if (!isSameAsParentBase(element)) {
+ jstream.writeField("xml:base", element.getResolvedBaseUri());
+ }
+ InReplyTo irt = (InReplyTo)element;
+ jstream.writeField("ref",irt.getRef());
+ jstream.writeField("href",irt.getResolvedHref());
+ jstream.writeField("type",irt.getMimeType());
+ jstream.writeField("source",irt.getResolvedSource());
+ jstream.endObject();
+ return;
+ }
+ }
+
+ private static void writeElementValue(
+ Element element,
+ JSONStream jstream)
+ throws IOException {
+ writeElementChildren(element, jstream);
+ }
+
+ private static String getName(QName qname) {
+ String prefix = qname.getPrefix();
+ String name = qname.getLocalPart();
+ return prefix != null && !"".equals(prefix) ?
+ prefix + ":" + name :
+ name;
+ }
+
+ private static void writeElement(
+ Element child,
+ QName parentqname,
+ JSONStream jstream)
+ throws IOException {
+ QName childqname = child.getQName();
+ String prefix = childqname.getPrefix();
+ jstream.startObject();
+ jstream.writeField("name", getName(childqname));
+ jstream.writeField("attributes");
+ List<QName> attributes = child.getAttributes();
+ jstream.startObject();
+ if (!isSameNamespace(childqname, parentqname)) {
+ if (prefix != null && !"".equals(prefix)) {
+ jstream.writeField("xmlns:" + prefix);
+ } else {
+ jstream.writeField("xmlns");
+ }
+ jstream.writeQuoted(childqname.getNamespaceURI());
+ }
+ if (!isSameAsParentBase(child)) {
+ jstream.writeField("xml:base",child.getResolvedBaseUri());
+ }
+ writeLanguageFields(child, jstream);
+ for (QName attr : attributes) {
+ String name = getName(attr);
+ jstream.writeField(name);
+ if ("".equals(attr.getPrefix()) ||
+ "xml".equals(attr.getPrefix())) {
+ String val = child.getAttributeValue(attr);
+ if (val != null &&
+ ("href".equalsIgnoreCase(name) ||
+ "src".equalsIgnoreCase(name) ||
+ "action".equalsIgnoreCase(name))) {
+ IRI base = child.getResolvedBaseUri();
+ if (base != null) {
+ val = base.resolve(val).toASCIIString();
+ }
+ }
+ jstream.writeQuoted(val);
+ } else {
+ jstream.startObject();
+ jstream.writeField("attributes");
+ jstream.startObject();
+ jstream.writeField("xmlns:" + attr.getPrefix());
+ jstream.writeQuoted(attr.getNamespaceURI());
+ jstream.endObject();
+ jstream.writeField("value");
+ jstream.writeQuoted(child.getAttributeValue(attr));
+ jstream.endObject();
+ }
+ }
+ jstream.endObject();
+ jstream.writeField("children");
+ writeElementChildren(child,jstream);
+ jstream.endObject();
+ }
+
+ private static void writeElementChildren(
+ Element element,
+ JSONStream jstream)
+ throws IOException {
+ jstream.startArray();
+ Object[] children = getChildren(element);
+ QName parentqname = element.getQName();
+ for (int n = 0; n < children.length; n++) {
+ Object child = children[n];
+ if (child instanceof Element) {
+ writeElement((Element)child, parentqname, jstream);
+ if (n < children.length-1) {
+ jstream.writeSeparator();
+ }
+ } else if (child instanceof TextValue) {
+ TextValue textvalue = (TextValue) child;
+ String value = textvalue.getText();
+ if (!element.getMustPreserveWhitespace()) {
+ if (!value.matches("\\s*")) {
+ jstream.writeQuoted(value.trim());
+ if (n < children.length-1) {
+ jstream.writeSeparator();
+ }
+ }
+ } else {
+ jstream.writeQuoted(value);
+ if (n < children.length-1) {
+ jstream.writeSeparator();
+ }
+ }
+ }
+ }
+ jstream.endArray();
+ }
+
+ private static void writeExtensions(
+ ExtensibleElement element,
+ JSONStream jstream)
+ throws IOException {
+ writeExtensions(element,jstream,true);
+ }
+
+ private static void writeExtensions(
+ ExtensibleElement element,
+ JSONStream jstream,
+ boolean startsep)
+ throws IOException {
+ List<QName> attributes = element.getExtensionAttributes();
+ writeList("extensions",element.getExtensions(),jstream);
+ if (attributes.size() > 0) {
+ jstream.writeField("attributes");
+
+ jstream.startObject();
+ for (int n = 0; n < attributes.size(); n++) {
+ QName qname = attributes.get(n);
+ jstream.writeField(getName(qname));
+ if ("".equals(qname.getPrefix()) ||
+ "xml".equals(qname.getPrefix())) {
+ jstream.writeQuoted(element.getAttributeValue(qname));
+ } else {
+ jstream.startObject();
+ jstream.writeField("attributes");
+ jstream.startObject();
+ jstream.writeField("xmlns:" + qname.getPrefix());
+ jstream.writeQuoted(qname.getNamespaceURI());
+ jstream.endObject();
+ jstream.writeField("value");
+ jstream.writeQuoted(element.getAttributeValue(qname));
+ jstream.endObject();
+ }
+ }
+ jstream.endObject();
+ }
+ }
+
+ private static boolean needToWriteLanguageFields(Element element) {
+ return
+ needToWriteLang(element) ||
+ needToWriteDir(element);
+ }
+
+ private static boolean needToWriteLang(Element element) {
+ String parentlang = null;
+ if (element.getParentElement() != null) {
+ Base parent = element.getParentElement();
+ parentlang = parent instanceof Document ?
+ ((Document)parent).getLanguage() :
+ ((Element)parent).getLanguage();
+ }
+ String lang = element.getLanguage();
+ return parentlang == null && lang != null ||
+ lang != null && parentlang != null && !parentlang.equalsIgnoreCase(lang);
+ }
+
+ private static boolean needToWriteDir(Element element) {
+ Direction parentdir = Direction.UNSPECIFIED;
+ Direction dir = BidiHelper.getDirection(element);
+ if (element.getParentElement() != null) {
+ Base parent = element.getParentElement();
+ if (parent instanceof Element) {
+ parentdir = BidiHelper.getDirection((Element)parent);
+ }
+ }
+ return dir != Direction.UNSPECIFIED && !dir.equals(parentdir);
+ }
+
+ private static void writeLanguageFields(
+ Element element,
+ JSONStream jstream)
+ throws IOException {
+ if (needToWriteLang(element)) {
+ String lang = element.getLanguage();
+ jstream.writeField("lang",lang);
+ }
+ if (needToWriteDir(element)) {
+ Direction dir = BidiHelper.getDirection(element);
+ jstream.writeField("dir", dir.name().toLowerCase());
+ }
+ }
+
+ private static void writeElement(
+ String name,
+ Element element,
+ JSONStream jstream)
+ throws IOException {
+ if (element != null) {
+ if (name.equalsIgnoreCase("feed") ||
+ name.equalsIgnoreCase("entry")) {
+ // skip writing this name
+ } else if (name.equalsIgnoreCase("content")) {
+ jstream.skipWritingFieldName();
+ } else {
+ jstream.writeField(name);
+ }
+ toJson(element,jstream);
+ }
+ }
+
+ private static boolean writeList(
+ String name,
+ List list,
+ JSONStream jstream)
+ throws IOException {
+ if (list == null || list.size() == 0) {
+ return false;
+ }
+ jstream.writeField(name);
+ jstream.startArray();
+ for (int n = 0; n < list.size(); n++) {
+ Element el = (Element)list.get(n);
+ if (!(el instanceof InReplyTo) &&
+ !(el instanceof Control)) {
+ toJson(el,jstream);
+ if (n < list.size()-1) {
+ jstream.writeSeparator();
+ }
+ }
+ }
+ jstream.endArray();
+ return true;
+ }
+
+ private static void toJson(
+ Document document,
+ JSONStream jstream)
+ throws IOException {
+
+ Element root = document.getRoot();
+ if (root != null &&
+ root.getQName().getLocalPart().equalsIgnoreCase("entry")) {
+ writeElement("entry", document.getRoot(), jstream);
+ return;
+ }
+
+ jstream.startObject();
+ jstream.writeField("base", document.getBaseUri());
+ jstream.writeField("content-type", document.getContentType());
+ jstream.writeField("etag", document.getEntityTag());
+ jstream.writeField("language", document.getLanguage());
+ jstream.writeField("slug", document.getSlug());
+ jstream.writeField("last-modified", document.getLastModified());
+
+ if (root != null) {
+ String rootname = root.getQName().getLocalPart();
+ writeElement(rootname,document.getRoot(),jstream);
+ }
+ jstream.endObject();
+ }
+
+
+ private static Object[] getChildren(
+ Element element) {
+ Abdera abdera = element.getFactory().getAbdera();
+ XPath xpath = abdera.getXPath();
+ List<Object> nodes = xpath.selectNodes("node()", element);
+ return nodes.toArray(new Object[nodes.size()]);
+ }
+
+ private static boolean isSameNamespace(
+ QName q1,
+ QName q2) {
+ if (q1 == null && q2 != null) {
+ return false;
+ }
+ if (q1 != null && q2 == null) {
+ return false;
+ }
+ String p1 = q1 == null ? "" :
+ q1.getPrefix() != null ? q1.getPrefix() : "";
+ String p2 = q2 == null ? "" :
+ q2.getPrefix() != null ? q2.getPrefix() : "";
+ String n1 = q1 == null ? "" :
+ q1.getNamespaceURI() != null ? q1.getNamespaceURI() : "";
+ String n2 = q2 == null ? "" :
+ q2.getNamespaceURI() != null ? q2.getNamespaceURI() : "";
+ return n1.equals(n2) && p1.equals(p2);
+ }
+
+}
Added: incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONWriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONWriter.java?rev=655042&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONWriter.java (added)
+++ incubator/shindig/trunk/java/social-api/src/main/java/org/apache/shindig/social/abdera/json/JSONWriter.java Sat May 10 03:38:57 2008
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+/**
+ * THIS IS COPIED from org.apache.abdera.ext.json package.
+ */
+package org.apache.shindig.social.abdera.json;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+
+import org.apache.abdera.model.Base;
+import org.apache.abdera.util.AbstractNamedWriter;
+import org.apache.abdera.util.AbstractWriterOptions;
+import org.apache.abdera.writer.NamedWriter;
+import org.apache.abdera.writer.WriterOptions;
+
+public class JSONWriter
+ extends AbstractNamedWriter
+ implements NamedWriter {
+
+ public static final String NAME = "json";
+
+ public static final String[] FORMATS = {
+ "application/json",
+ };
+
+ public JSONWriter() {
+ super(NAME,FORMATS);
+ }
+
+ @Override
+ protected WriterOptions initDefaultWriterOptions() {
+ return new AbstractWriterOptions() {};
+ }
+
+ public String getName() {
+ return NAME;
+ }
+
+ public Object write(Base base, WriterOptions options) throws IOException {
+ try {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ writeTo(base,out,options);
+ return new String(out.toByteArray(),options.getCharset());
+ } catch (IOException i) {
+ throw i;
+ } catch (Exception e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ public void writeTo(Base base, OutputStream out, WriterOptions options) throws IOException {
+ writeTo(base,new OutputStreamWriter(out,options.getCharset()),options);
+ }
+
+ public void writeTo(Base base, java.io.Writer out, WriterOptions options) throws IOException {
+ try {
+ JSONUtil.toJson(base, out);
+ if (options.getAutoClose()) out.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new IOException(e.getMessage());
+ }
+ }
+
+}
Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/JettyServer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/JettyServer.java?rev=655042&r1=655041&r2=655042&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/JettyServer.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/JettyServer.java Sat May 10 03:38:57 2008
@@ -17,7 +17,7 @@
*/
package org.apache.shindig.social;
-import org.apache.shindig.gadgets.http.GuiceServletContextListener;
+import org.apache.shindig.common.servlet.GuiceServletContextListener;
import org.apache.abdera.protocol.server.Provider;
import org.apache.abdera.protocol.server.ServiceManager;