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;