You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2007/10/04 22:00:09 UTC

svn commit: r581996 - /incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONUtil.java

Author: jmsnell
Date: Thu Oct  4 13:00:09 2007
New Revision: 581996

URL: http://svn.apache.org/viewvc?rev=581996&view=rev
Log:
Additional tweaks based on feedback 
See http://intertwingly.net/blog/2007/10/04/Mining-Content-For-Value

Modified:
    incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONUtil.java

Modified: incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONUtil.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONUtil.java?rev=581996&r1=581995&r2=581996&view=diff
==============================================================================
--- incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONUtil.java (original)
+++ incubator/abdera/java/trunk/extensions/json/src/main/java/org/apache/abdera/ext/json/JSONUtil.java Thu Oct  4 13:00:09 2007
@@ -34,7 +34,6 @@
 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;
@@ -84,6 +83,85 @@
     JSONStream jstream) 
       throws IOException {
     
+if (element instanceof Text) {
+  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:
+      case HTML:
+        jstream.startArray();
+        jstream.writeQuoted(text.getValue());
+        jstream.endArray();
+        break;
+      case XHTML:
+        writeElementValue(text.getValueElement(), jstream);
+        break;
+    }
+    jstream.endObject();
+  }
+} else if (element instanceof Content) {
+  Content content = (Content)element;
+  Content.Type contenttype = content.getContentType();
+  if (contenttype.equals(Content.Type.TEXT) && 
+      !needToWriteLanguageFields(content)) {
+    jstream.writeQuoted(content.getValue());
+  } else {
+    jstream.startObject();
+    jstream.writeField("attributes");
+    jstream.startObject();    
+    switch(content.getContentType()) {
+      case TEXT:
+      case HTML:
+      case XHTML:
+        jstream.writeField("type",contenttype.name().toLowerCase());
+        break;
+      case MEDIA:
+      case XML:
+        jstream.writeField("type",content.getMimeType());
+    }    
+    writeLanguageFields(element, jstream);
+    if (!isSameAsParentBase(element))
+      jstream.writeField("xml:base", element.getResolvedBaseUri());      
+    writeLanguageFields(content,jstream);
+    jstream.writeField("src", content.getResolvedSrc());
+    jstream.endObject();
+    jstream.writeField("children");
+    switch(content.getContentType()) {
+      case TEXT:
+        jstream.startArray();
+        jstream.writeQuoted(content.getValue());
+        jstream.endArray();
+        break;
+      case HTML:
+        // TODO: eventually we'll parse this out into the hash
+        jstream.startArray();
+        jstream.writeQuoted(content.getValue());
+        jstream.endArray();
+        break;
+      case XHTML:
+        writeElementValue(content.getValueElement(), jstream);
+        break;
+      case MEDIA:
+      case XML:
+        jstream.startArray();
+        jstream.endArray();
+    }
+    jstream.endObject();  
+  }
+} else {
     if (element instanceof Categories) {
       jstream.startObject();
       writeLanguageFields(element, jstream);
@@ -129,36 +207,6 @@
         writeList("categories",collection.getCategories(),jstream);
       writeExtensions((ExtensibleElement)element,jstream);
       jstream.endObject();
-    } else if (element instanceof Content) {
-      jstream.startObject();
-      writeLanguageFields(element, jstream);
-      if (!isSameAsParentBase(element))
-        jstream.writeField("xml:base", element.getResolvedBaseUri());
-      Content content = (Content)element;      
-      writeLanguageFields(content,jstream);
-      jstream.writeField("src", content.getResolvedSrc());
-      switch(content.getContentType()) {
-        case TEXT:
-          jstream.writeField("type","text");
-          jstream.writeField("value",content.getValue());
-          break;
-        case HTML:
-          jstream.writeField("type","html");
-          jstream.writeField("value",content.getValue());
-          break;
-        case XHTML:
-          jstream.writeField("type","xhtml");
-          jstream.writeField("value",content.getValue());
-          writeElementValue((Div)content.getValueElement(), jstream);
-          break;
-        case MEDIA:
-        case XML:
-          jstream.writeField("type",content.getMimeType());
-          if (content.getSrc() == null)
-            jstream.writeField("value",content.getValue());
-          break;
-      }
-      jstream.endObject();
     } else if (element instanceof Control) {
       jstream.startObject();
       writeLanguageFields(element, jstream);
@@ -264,28 +312,6 @@
       }
       writeExtensions((ExtensibleElement)element,jstream);
       jstream.endObject();
-    } else if (element instanceof Text) {
-      jstream.startObject();
-      writeLanguageFields(element, jstream);
-      if (!isSameAsParentBase(element))
-        jstream.writeField("xml:base", element.getResolvedBaseUri());
-      Text text = (Text)element;      
-      switch(text.getTextType()) {
-        case TEXT:
-          jstream.writeField("type","text");
-          jstream.writeField("value",text.getValue());
-          break;
-        case HTML:
-          jstream.writeField("type","html");
-          jstream.writeField("value",text.getValue());
-          break;
-        case XHTML:
-          jstream.writeField("type","xhtml");
-          jstream.writeField("value",text.getValue());
-          writeElementValue(text.getValueElement(), jstream);
-          break;
-      }
-      jstream.endObject();
     } else if (element instanceof Workspace) {
       jstream.startObject();
       writeLanguageFields(element, jstream);
@@ -310,16 +336,24 @@
     } else {
       writeElement(element,null,jstream);
     }
+}
   }
     
   private static void writeElementValue(
     Element element, 
     JSONStream jstream) 
       throws IOException {
-    jstream.writeField("hash");
     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, 
@@ -327,14 +361,9 @@
       throws IOException {
     QName childqname = child.getQName();
     String prefix = childqname.getPrefix();
-    jstream.startArray();
-    if (prefix != null && !"".equals(prefix)) {
-      jstream.writeQuoted(
-        childqname.getPrefix() + ":" + childqname.getLocalPart());
-    } else {
-      jstream.writeQuoted(childqname.getLocalPart());
-    } 
-    jstream.writeSeparator();
+    jstream.startObject();
+    jstream.writeField("name", getName(childqname));
+    jstream.writeField("attributes");
     List<QName> attributes = child.getAttributes();
     jstream.startObject();
     if (!isSameNamespace(childqname, parentqname)) {
@@ -348,12 +377,26 @@
       jstream.writeField("xml:base",child.getResolvedBaseUri());
     writeLanguageFields(child, jstream);
     for (QName attr : attributes) {
-      jstream.writeField(attr.getLocalPart(),child.getAttributeValue(attr));
+      jstream.writeField(getName(attr));
+      if ("".equals(attr.getPrefix())  || 
+          "xml".equals(attr.getPrefix())) {
+        jstream.writeQuoted(child.getAttributeValue(attr));
+      } 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.writeSeparator();
+    jstream.writeField("children");
     writeElementChildren((Element)child,jstream);
-    jstream.endArray();
+    jstream.endObject();
   }
   
   private static void writeElementChildren(
@@ -401,39 +444,70 @@
     writeList("extensions",element.getExtensions(),jstream);
     if (attributes.size() > 0) {
       jstream.writeField("attributes");
-      jstream.startArray();
+      
+      jstream.startObject();
       for (int n = 0; n < attributes.size(); n++) {
         QName qname = attributes.get(n);
-        writeAttribute(qname, element.getAttributeValue(qname), jstream);
-        if (n < attributes.size()-1) jstream.writeSeparator();
+        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.endArray();
+      jstream.endObject();
     }
   }
   
-  private static void writeLanguageFields(
-    Element element, 
-    JSONStream jstream) 
-      throws IOException {
+  private static boolean needToWriteLanguageFields(Element element) {
+    return 
+      needToWriteLang(element) || 
+      needToWriteDir(element);
+  }
+  
+  private static boolean needToWriteLang(Element element) {
     String parentlang = null;
-    BidiHelper.Direction parentdir = BidiHelper.Direction.UNSPECIFIED;
     if (element.getParentElement() != null) {
       Base parent = element.getParentElement();
       parentlang = parent instanceof Document ?
         ((Document)parent).getLanguage() :
-        ((Element)parent).getLanguage();
-      if (parent instanceof Element) {
-        parentdir = BidiHelper.getDirection((Element)parent);
-      }
+        ((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) {
+    BidiHelper.Direction parentdir = BidiHelper.Direction.UNSPECIFIED;
     BidiHelper.Direction dir = BidiHelper.getDirection(element);
-    if (parentlang == null || 
-        (parentlang != null && !parentlang.equalsIgnoreCase(lang)))
+    if (element.getParentElement() != null) {
+      Base parent = element.getParentElement();
+      if (parent instanceof Element)
+        parentdir = BidiHelper.getDirection((Element)parent);
+    }
+    return dir != BidiHelper.Direction.UNSPECIFIED && !dir.equals(parentdir);
+  }
+  
+  private static void writeLanguageFields(
+    Element element, 
+    JSONStream jstream) 
+      throws IOException {
+    if (needToWriteLang(element)) {
+      String lang = element.getLanguage();
       jstream.writeField("xml:lang",lang);
-    if (dir != null && 
-        dir != BidiHelper.Direction.UNSPECIFIED && 
-        !dir.equals(parentdir)) {
+    }
+    if (needToWriteDir(element)) {
+      BidiHelper.Direction dir = BidiHelper.getDirection(element);
       jstream.writeField("dir", dir.name().toLowerCase());
     }
   }
@@ -485,29 +559,7 @@
     jstream.endObject();
   }
   
-  private static void writeAttribute(
-    QName qname, 
-    String value, 
-    JSONStream jstream) 
-      throws IOException {
-    jstream.startArray();
-    String prefix = qname.getPrefix();
-    String localpart = qname.getLocalPart();
-    String uri = qname.getNamespaceURI();
-    if (prefix != null && !"".equals(prefix)) {
-      jstream.writeQuoted(prefix + ":" + localpart);
-      jstream.writeSeparator();
-      jstream.startObject();
-      jstream.writeField("xmlns:" + prefix, uri);
-      jstream.endObject();
-    } else {
-      jstream.writeQuoted(localpart);
-    }
-    jstream.writeSeparator();
-    jstream.writeQuoted(value);
-    jstream.endArray();
-  }
-  
+
   private static Object[] getChildren(
     Element element) {
       Abdera abdera = element.getFactory().getAbdera();