cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From serg...@apache.org
Subject svn commit: r1299086 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml
Date Fri, 09 Mar 2012 22:45:37 GMT
Author: sergeyb
Date: Fri Mar  9 22:45:36 2012
New Revision: 1299086

URL: http://svn.apache.org/viewvc?rev=1299086&view=rev
Log:
[CXF-4172] Completing the messy workaround for Jettison, most of this code will be hidden
in the next Jettison release

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java
    cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java?rev=1299086&r1=1299085&r2=1299086&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java
(original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/JSONUtils.java
Fri Mar  9 22:45:36 2012
@@ -18,6 +18,8 @@
  */
 package org.apache.cxf.jaxrs.provider;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -48,6 +50,7 @@ import org.codehaus.jettison.AbstractXML
 import org.codehaus.jettison.AbstractXMLStreamWriter;
 import org.codehaus.jettison.badgerfish.BadgerFishXMLInputFactory;
 import org.codehaus.jettison.badgerfish.BadgerFishXMLOutputFactory;
+import org.codehaus.jettison.json.JSONArray;
 import org.codehaus.jettison.json.JSONException;
 import org.codehaus.jettison.json.JSONObject;
 import org.codehaus.jettison.json.JSONTokener;
@@ -157,6 +160,7 @@ public final class JSONUtils {
     }
     
     private static class JettisonMappedReaderFactory extends AbstractXMLInputFactory {
+        private static final int INPUT_BUF_SIZE = 4096;
         private MappedNamespaceConvention convention;
         private DocumentDepthProperties depthProps;
         public JettisonMappedReaderFactory(Map<?, ?> nstojns, DocumentDepthProperties
depthProps) {
@@ -171,24 +175,194 @@ public final class JSONUtils {
             } catch (JSONException e) {
                 throw new XMLStreamException(e);
             }
-        }    
+        } 
+        private String readAll(InputStream in, String encoding)
+            throws IOException {
+            
+            final byte[] buffer = new byte[INPUT_BUF_SIZE];
+            ByteArrayOutputStream bos = null;
+            while (true) {
+                int count = in.read(buffer);
+                if (count < 0) { // EOF
+                    break;
+                }
+                if (bos == null) {
+                    int cap;
+                    if (count < 64) {
+                        cap = 64;
+                    } else if (count == INPUT_BUF_SIZE) {
+                        // Let's assume there's more coming, not just this chunk
+                        cap = INPUT_BUF_SIZE * 4;
+                    } else {
+                        cap = count;
+                    }
+                    bos = new ByteArrayOutputStream(cap);
+                }
+                bos.write(buffer, 0, count);
+            }
+            return (bos == null) ? "" : bos.toString(encoding);
+        }
+        public XMLStreamReader createXMLStreamReader(InputStream is, String charset) 
+            throws XMLStreamException {
+            /* !!! This is not really correct: should (try to) auto-detect
+             * encoding, since JSON only allows 3 Unicode-based variants.
+             * For now it's ok to default to UTF-8 though.
+             */
+            if (charset == null) {
+                charset = "UTF-8";
+            }
+            try {
+                String doc = readAll(is, charset);
+                return createXMLStreamReader(new JettisonJSONTokener(doc, depthProps));
+            } catch (IOException e) {
+                throw new XMLStreamException(e);
+            }
+        }
+    }
+
+    private static class JettisonJSONTokener extends JSONTokener {
+        private DocumentDepthProperties depthProps;
+        public JettisonJSONTokener(String s, DocumentDepthProperties depthProps) {
+            super(s);
+            this.depthProps = depthProps;
+        }
+        public Object nextValue() throws JSONException {
+            char c = nextClean();
+            switch (c) {
+            case '"':
+            case '\'':
+                return nextString(c);
+            case '{':
+                back();
+                return new JettisonJSONObject(this, depthProps);
+            case '[':
+                back();
+                return new JSONArray(this);
+            default:    
+            }
+
+            return finalize(c);
+        }
+        private Object finalize(char c) throws JSONException { 
+            StringBuffer sb = new StringBuffer();
+            char b = c;
+            while (c >= ' ' && ",:]}/\\\"[{;=#".indexOf(c) < 0) {
+                sb.append(c);
+                c = next();
+            }
+            back();
+
+            String s = sb.toString().trim();
+            if (s.length() == 0) {
+                throw new JSONException("Missing value.");
+            }
+            Object res = null;
+            if (s.equalsIgnoreCase("true")) {
+                res = Boolean.TRUE;
+            } else if (s.equalsIgnoreCase("false")) {
+                res = Boolean.FALSE;
+            } else if (s.equalsIgnoreCase("null")) {
+                res = JSONObject.NULL;
+            }
+            if (res != null) {
+                return res;
+            }
+            if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+')
{
+                if (b == '0') {
+                    if (s.length() > 2 && (s.charAt(1) == 'x' || s.charAt(1) ==
'X')) {
+                        try {
+                            res = new Integer(Integer.parseInt(s.substring(2),
+                                    16));
+                        } catch (Exception e) {
+                            /* Ignore the error */
+                        }
+                    } else {
+                        try {
+                            res = new Integer(Integer.parseInt(s, 8));
+                        } catch (Exception e) {
+                            /* Ignore the error */
+                        }
+                    }
+                }
+                if (res == null) {
+                    try {
+                        res = new Integer(s);
+                    } catch (Exception e) {
+                        try {
+                            res = new Long(s);
+                        } catch (Exception f) {
+                            try {
+                                res = new Double(s);
+                            }  catch (Exception g) {
+                                res = s;
+                            }
+                        }
+                    }
+                }
+                if (res != null) {
+                    return res;
+                }
+            }
+            return s;
+        }
     }
     
     private static class JettisonJSONObject extends JSONObject {
         private static final long serialVersionUID = 9016458891093343731L;
         private int threshold;
-        public JettisonJSONObject(JSONTokener tokener, DocumentDepthProperties depthProps)

+        
+        public JettisonJSONObject(JSONTokener x, DocumentDepthProperties depthProps) 
             throws JSONException {
-            super(tokener);
             this.threshold = depthProps.getElementCountThreshold() != -1 
                 ? depthProps.getElementCountThreshold() : depthProps.getInnerElementCountThreshold();
+            String key;
+            char c;
+            if (x.nextClean() != '{') {
+                throw x.syntaxError("A JSONObject text must begin with '{'");
+            }
+            for (;;) {
+                c = x.nextClean();
+                switch (c) {
+                case 0:
+                    throw x.syntaxError("A JSONObject text must end with '}'");
+                case '}':
+                    return;
+                default:
+                    x.back();
+                    key = x.nextValue().toString();
+                }
+
+                c = x.nextClean();
+                if (c == '=') {
+                    if (x.next() != '>') {
+                        x.back();
+                    }
+                } else if (c != ':') {
+                    throw x.syntaxError("Expected a ':' after a key");
+                }
+                put(key, x.nextValue()); //NOPMD
+                switch (x.nextClean()) {
+                case ';':
+                case ',':
+                    if (x.nextClean() == '}') {
+                        return;
+                    }
+                    x.back();
+                    break;
+                case '}':
+                    return;
+                default:
+                    throw new JSONException("Expected a ',' or '}'");
+                }
+            }
         }
-        @Override
         public JSONObject put(String key, Object value) throws JSONException {
+            JSONObject obj = super.put(key, value);
             if (threshold != -1 && super.length() >= threshold) {
                 throw new DepthExceededStaxException();
             }
-            return super.put(key, value);    
+            return obj;
+            
         }
     }
     

Modified: cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml?rev=1299086&r1=1299085&r2=1299086&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml (original)
+++ cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml Fri Mar  9 22:45:36
2012
@@ -221,7 +221,7 @@ http://cxf.apache.org/schemas/core.xsd">
       <ref bean="serviceBean" />
     </jaxrs:serviceBeans>		   
     <jaxrs:properties>
-       <entry key="org.apache.cxf.staxutils.innerElementLevelThreshold" value="2"/>
+       <entry key="org.apache.cxf.staxutils.innerElementCountThreshold" value="2"/>
     </jaxrs:properties>
         
   </jaxrs:server>



Mime
View raw message