|
From: <pm_...@us...> - 2011-12-22 11:00:33
|
Revision: 4510
http://mxquery.svn.sourceforge.net/mxquery/?rev=4510&view=rev
Author: pm_fischer
Date: 2011-12-22 11:00:23 +0000 (Thu, 22 Dec 2011)
Log Message:
-----------
- json:parse support on XQIB
- base 64 support
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/Extensions.xml
trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/expathhttp/HttpIO.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java
Added Paths:
-----------
trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/base64/Base64Ops.java
trunk/MXQuery/xqib_src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/Extensions.xml
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/Extensions.xml 2011-12-21 06:34:33 UTC (rev 4509)
+++ trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/Extensions.xml 2011-12-22 11:00:23 UTC (rev 4510)
@@ -218,5 +218,21 @@
<className op="json">Parse</className>
</functionDescription>
</functionGroup>
+<functionGroup prefix="base64" namespace="http://www.zorba-xquery.com/modules/base64">
+ <functionDescription>
+ <functionName>encode</functionName>
+ <parameters>
+ <paramType>string</paramType>
+ </parameters>
+ <className op="enc">Base64Ops</className>
+ </functionDescription>
+ <functionDescription>
+ <functionName>decode</functionName>
+ <parameters>
+ <paramType>base64Binary</paramType>
+ </parameters>
+ <className op="dec">Base64Ops</className>
+ </functionDescription>
+</functionGroup>
</functionGallery>
\ No newline at end of file
Added: trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/base64/Base64Ops.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/base64/Base64Ops.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/base64/Base64Ops.java 2011-12-22 11:00:23 UTC (rev 4510)
@@ -0,0 +1,86 @@
+/* Copyright 2006 - 2009 ETH Zurich
+ *
+ * Licensed 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.
+ */
+
+package ch.ethz.mxquery.extensionsModules.base64;
+
+import java.util.Vector;
+
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.MXQueryBinary;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+import ch.ethz.mxquery.datamodel.xdm.BinaryToken;
+import ch.ethz.mxquery.datamodel.xdm.TextToken;
+import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.exceptions.ErrorCodes;
+import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.functions.RequestTypeMulti;
+import ch.ethz.mxquery.model.TokenBasedIterator;
+import ch.ethz.mxquery.model.XDMIterator;
+import ch.ethz.mxquery.util.Base64;
+
+public class Base64Ops extends TokenBasedIterator implements RequestTypeMulti{
+
+ private boolean dec = false;
+
+ protected XDMIterator copy(Context context, XDMIterator[] subIters, Vector nestedPredCtxStack)
+ throws MXQueryException {
+ Base64Ops ret = new Base64Ops();
+ ret.setSubIters(subIters);
+ ret.setContext(context, false);
+ ret.dec = dec;
+ return ret;
+ }
+
+
+
+ public void init() throws MXQueryException {
+ if (dec) {
+ TokenInterface arg = subIters[0].next();
+ int aType = Type.getEventTypeSubstituted(arg.getEventType(),Context.getDictionary());
+ if ( !(Type.isTypeOrSubTypeOf(aType, Type.BASE64_BINARY,Context.getDictionary()) ||aType == Type.UNTYPED_ATOMIC )) {
+ throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Item of type "+"xs:string"+" expected", loc);
+ }
+ if (subIters[0].next().getEventType() != Type.END_SEQUENCE)
+ throw new TypeException(ErrorCodes.E0004_TYPE_INAPPROPRIATE_TYPE, "Single Item expected", loc);
+ MXQueryBinary bin = arg.getBinary();
+ currentToken = new TextToken(null, new String(Base64.decode(bin.toString())));
+
+ }
+ else {
+ String add = getStringValue(subIters[0]);
+ currentToken = new BinaryToken(null,new MXQueryBinary(add, Type.BASE64_BINARY),null);
+
+ }
+ }
+ public TypeInfo getStaticType() {
+ return new TypeInfo(Type.START_TAG,Type.OCCURRENCE_IND_ZERO_OR_ONE);
+ }
+
+ public void setOperation(String type) throws MXQueryException {
+ if (type.equals("dec"))
+ dec = true;
+ else if (type.equals("enc"))
+ dec = false;
+
+ else throw new MXQueryException(ErrorCodes.A0009_EC_EVALUATION_NOT_POSSIBLE, "Incorrect operation for parse/tidy", loc);
+
+ }
+
+ public void setReturnType(int type) throws MXQueryException {
+ }
+
+}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/expathhttp/HttpIO.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/expathhttp/HttpIO.java 2011-12-21 06:34:33 UTC (rev 4509)
+++ trunk/MXQuery/src/ch/ethz/mxquery/extensionsModules/expathhttp/HttpIO.java 2011-12-22 11:00:23 UTC (rev 4510)
@@ -445,7 +445,8 @@
contentType = overrideMediaType;
if (contentType.startsWith("text")
|| contentType.indexOf("+xml") >= 0
- || contentType.equals("application/xml")) {
+ || contentType.equals("application/xml")
+ || contentType.equals("application/json")) {
String enc = conn.getContentEncoding();
if (enc == null)
enc = "utf-8";
@@ -557,7 +558,7 @@
else if (contentType.indexOf("html") >= 0) {
resIts[resIts.length - 1] = XDMInputFactory.createTidyInput(
context, new StringReader(result.toString()), loc);
- } else if (contentType.startsWith("text/") || contentType.equalsIgnoreCase("application/xml-dtd")) {
+ } else if (contentType.startsWith("text/") || contentType.equalsIgnoreCase("application/xml-dtd") || contentType.equalsIgnoreCase("application/json")) {
resIts[resIts.length - 1] = new TokenIterator(context,
new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(3), result
.toString(), curNsScope), loc, false);
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java 2011-12-21 06:34:33 UTC (rev 4509)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java 2011-12-22 11:00:23 UTC (rev 4510)
@@ -69,14 +69,15 @@
if (tokens.size() > 0) // If not standalone
tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, "object", TYPE_QN, curNsScope));
JSONArray names = jo.names();
- for (int i=0;i<names.length();i++) {
+ if (names != null)
+ for (int i=0;i<names.length();i++) {
String nm = (String)names.get(i);
tokens.addElement(new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, "pair"), PAIR_QN, curNsScope));
- tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, nm, NAME_QN, curNsScope));
+ tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, nm, NAME_QN, curNsScope));
Object no = jo.get(nm);
handleJSONItem(no);
tokens.addElement(new ElementToken(Type.END_TAG, createNextTokenId(Type.END_TAG, "pair"), PAIR_QN, curNsScope));
- }
+ }
return;
}
if (obj instanceof JSONArray) {
@@ -105,6 +106,14 @@
tokens.add(new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(Type.TEXT_NODE_UNTYPED_ATOMIC, null), it.toString(), curNsScope));
return;
}
+ if (obj instanceof Long) {
+ Long it = (Long)obj;
+ if (tokens.size() > 0) // If not standalone
+ tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, "number", TYPE_QN, curNsScope));
+ tokens.add(new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(Type.TEXT_NODE_UNTYPED_ATOMIC, null), it.toString(), curNsScope));
+ return;
+ }
+
if (obj instanceof Double) {
Double db = (Double)obj;
if (tokens.size() > 0) // If not standalone
@@ -129,8 +138,7 @@
protected XDMIterator copy(Context context, XDMIterator[] subIters,
Vector nestedPredCtxStack) throws MXQueryException {
- // TODO Auto-generated method stub
- return null;
+ return new JSONAdapter(context, getLoc(), this.jsonString, this.jsonML);
}
}
Copied: trunk/MXQuery/xqib_src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java (from rev 4509, trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java)
===================================================================
--- trunk/MXQuery/xqib_src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java (rev 0)
+++ trunk/MXQuery/xqib_src/ch/ethz/mxquery/xdmio/xmlAdapters/JSONAdapter.java 2011-12-22 11:00:23 UTC (rev 4510)
@@ -0,0 +1,134 @@
+package ch.ethz.mxquery.xdmio.xmlAdapters;
+
+import com.google.gwt.json.client.*;
+
+import java.util.Vector;
+
+import com.google.gwt.json.client.JSONParser;
+
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.MXQueryDouble;
+import ch.ethz.mxquery.datamodel.QName;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.xdm.ElementToken;
+import ch.ethz.mxquery.datamodel.xdm.TextToken;
+import ch.ethz.mxquery.datamodel.xdm.Token;
+import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.exceptions.DynamicException;
+import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.model.XDMIterator;
+import ch.ethz.mxquery.xdmio.xmlAdapters.JSONAdapter;
+
+public class JSONAdapter extends XDMImportAdapter {
+ public static final String JSON_URI="http://www.zorba-xquery.com/modules/converters/json";
+ private static final QName JSON_QN = new QName(null,null,"json");
+ private static final QName TYPE_QN = new QName(null,null,"type");
+ private static final QName PAIR_QN = new QName(null,null,"pair");
+ private static final QName NAME_QN = new QName(null,null,"name");
+ private static final QName ITEM_QN = new QName(null,null,"item");
+ Vector tokens;
+ String jsonString;
+ boolean jsonML;
+
+ public JSONAdapter(Context ctx, QueryLocation loc, String jsonString, boolean useJSONML) {
+ super(ctx, loc);
+ this.jsonString = jsonString;
+ tokens = new Vector();
+ jsonML = useJSONML;
+ }
+
+ public TokenInterface next() throws MXQueryException {
+ if (called == 0) {
+ init();
+ }
+ if (called < tokens.size()) {
+ called++;
+ return (TokenInterface)tokens.elementAt(called-1);
+ }
+ return Token.END_SEQUENCE_TOKEN;
+ }
+
+ private void init() throws MXQueryException {
+ try {
+ JSONValue jo = JSONParser.parseStrict(jsonString);
+ tokens.addElement(new Token(Type.START_DOCUMENT, createNextTokenId(Type.START_DOCUMENT,null),curNsScope));
+ tokens.addElement(new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, "json"), JSON_QN, curNsScope));
+ //tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, "unknown", TYPE_QN, curNsScope));
+ handleJSONItem(jo);
+ tokens.addElement(new ElementToken(Type.END_TAG, createNextTokenId(Type.START_TAG, "json"), JSON_QN, curNsScope));
+ tokens.addElement(new Token(Type.END_DOCUMENT, createNextTokenId(Type.END_DOCUMENT,null),curNsScope));
+ } catch (JSONException je) {
+ throw new DynamicException(new QName(JSON_URI,"json","ParseError"), je.toString(), loc);
+ }
+ }
+
+ void handleJSONItem (JSONValue obj) throws JSONException, MXQueryException {
+ if (obj.isObject() != null) {
+ JSONObject jo = obj.isObject();
+ if (tokens.size() > 0) // If not standalone
+ tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, "object", TYPE_QN, curNsScope));
+ java.util.Set<java.lang.String> nameSet = jo.keySet();
+ java.util.Iterator<java.lang.String> names = nameSet.iterator();
+ while (names.hasNext()) {
+ String nm = names.next();
+ tokens.addElement(new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, "pair"), PAIR_QN, curNsScope));
+ tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, nm, NAME_QN, curNsScope));
+ JSONValue no = jo.get(nm);
+ handleJSONItem(no);
+ tokens.addElement(new ElementToken(Type.END_TAG, createNextTokenId(Type.END_TAG, "pair"), PAIR_QN, curNsScope));
+ }
+ return;
+ }
+ if (obj.isArray() != null) {
+ JSONArray ja = obj.isArray();
+ if (tokens.size() > 0) // If not standalone
+ tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, "array", TYPE_QN, curNsScope));
+ for (int i=0;i<ja.size();i++) {
+ tokens.addElement(new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, "item"), ITEM_QN, curNsScope));
+ JSONValue o = ja.get(i);
+ handleJSONItem(o);
+ tokens.addElement(new ElementToken(Type.END_TAG, createNextTokenId(Type.START_TAG, "item"), ITEM_QN, curNsScope));
+ }
+ return;
+ }
+ if (obj.isString() != null) {
+ JSONString str = obj.isString();
+ if (tokens.size() > 0) // If not standalone
+ tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, "string", TYPE_QN, curNsScope));
+ tokens.add(new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(Type.TEXT_NODE_UNTYPED_ATOMIC, null), str.stringValue(), curNsScope));
+ return;
+ }
+ if (obj.isNumber() != null) {
+ JSONNumber nm = obj.isNumber();
+ if (tokens.size() > 0) // If not standalone
+ tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, "number", TYPE_QN, curNsScope));
+ MXQueryDouble db = new MXQueryDouble(nm.doubleValue());
+ tokens.add(new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(Type.TEXT_NODE_UNTYPED_ATOMIC, null), db.toString(), curNsScope));
+ return;
+ }
+
+ if (obj.isBoolean() != null) {
+ JSONBoolean bo = obj.isBoolean();
+ if (tokens.size() > 0) // If not standalone
+ tokens.addElement(createAttributeToken(Type.UNTYPED_ATOMIC, "boolean", TYPE_QN, curNsScope));
+ String boolVal = "false";
+ if (bo.booleanValue())
+ boolVal = "true";
+ tokens.add(new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(Type.TEXT_NODE_UNTYPED_ATOMIC, null), boolVal, curNsScope));
+ return;
+ }
+ if (obj.isNull() != null) {
+ return;
+ }
+ throw new DynamicException(new QName(JSON_URI,"json","ParseError"),"Not implemented Type",loc);
+ }
+
+
+
+ protected XDMIterator copy(Context context, XDMIterator[] subIters,
+ Vector nestedPredCtxStack) throws MXQueryException {
+ return new JSONAdapter(context, getLoc(), this.jsonString, this.jsonML);
+ }
+
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|