/**
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.
*/
package org.apache.synapse.commons.json;
import junit.framework.TestCase;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.builder.Builder;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.MessageFormatter;
import org.apache.commons.io.IOUtils;
import javax.xml.stream.XMLStreamException;
import java.io.*;
public class StreamBuilderFormatterTest extends TestCase {
private Builder jsonBuilder = Util.newJsonStreamBuilder();
private MessageFormatter formatter = Util.newJsonStreamFormatter();
private static final String jsonIn2 = "{\"type\":\"Polygon\",\"coordinates\":[[[116.0865381,-8.608804],[116.127196,-8.608804],[116.127196,-8.554822],[116.0865381,-8.554822]]]}";
private static final String xml2 = "<jsonObject><type>Polygon</type><coordinates><jsonArray><jsonElement><jsonArray><jsonElement>116.0865381</jsonElement><jsonElement>-8.608804</jsonElement></jsonArray></jsonElement><jsonElement><jsonArray><jsonElement>116.127196</jsonElement><jsonElement>-8.608804</jsonElement></jsonArray></jsonElement><jsonElement><jsonArray><jsonElement>116.127196</jsonElement><jsonElement>-8.554822</jsonElement></jsonArray></jsonElement><jsonElement><jsonArray><jsonElement>116.0865381</jsonElement><jsonElement>-8.554822</jsonElement></jsonArray></jsonElement></jsonArray></coordinates></jsonObject>";
private static final String jsonIn3 = "[[[116.0865381,-8.608804],[116.127196,-8.608804],[116.127196,-8.554822],[116.0865381,-8.554822]]]";
private static final String xml3 = "<jsonArray><jsonElement><jsonArray><jsonElement><jsonArray><jsonElement>116.0865381</jsonElement><jsonElement>-8.608804</jsonElement></jsonArray></jsonElement><jsonElement><jsonArray><jsonElement>116.127196</jsonElement><jsonElement>-8.608804</jsonElement></jsonArray></jsonElement><jsonElement><jsonArray><jsonElement>116.127196</jsonElement><jsonElement>-8.554822</jsonElement></jsonArray></jsonElement><jsonElement><jsonArray><jsonElement>116.0865381</jsonElement><jsonElement>-8.554822</jsonElement></jsonArray></jsonElement></jsonArray></jsonElement></jsonArray>";
private static final String jsonIn4 = "[\n" +
" {\"name\":\"Ishan\", \"phone\":\"+94 (11) 222 3333\"},\n" +
" {\"name\":null, \"phone\":{}},\n" +
" {\"name\":\"WSO2\", \"phone\":\"+94 (11) 222 3333\"}\n" +
"]";
private static final String xml4 = "<jsonArray><jsonElement><name>Ishan</name><phone>+94 (11) 222 3333</phone></jsonElement><jsonElement><name /><phone /></jsonElement><jsonElement><name>WSO2</name><phone>+94 (11) 222 3333</phone></jsonElement></jsonArray>";
private static final String jsonIn5 = "{ \"id\":12345, \"id_str\":\"12345\", \"array\":[1, 2, [[],[{\"inner_id\":6789}]]], \"name\":null, \"object\":{}, \"$schema_location\":\"unknown\", \"12X12\":\"image12x12.png\"}";
private static final String xml5 = "<jsonObject><id>12345</id><id_str>12345</id_str><array>1</array><array>2</array><array><jsonArray><jsonElement><jsonArray /></jsonElement><jsonElement><jsonArray><jsonElement><inner_id>6789</inner_id></jsonElement></jsonArray></jsonElement></jsonArray></array><name /><object /><_JsonReader_PS_schema_location>unknown</_JsonReader_PS_schema_location><_JsonReader_PD_12X12>image12x12.png</_JsonReader_PD_12X12></jsonObject>";
private static final String xmlString =
"<object xmlns:ns1=\"namespace_1\" xmlns:ns2=\"namespace_2\" xmlns:n3=\"namespace_3\"" +
" attrb_1=\"Value1\" ns2:attrb_11=\"Value2\">\n" +
" <child c_attrb=\"Child\">Child Text</child>\n" +
" <inner xmlns:p=\"item:Namespace\" p:c_attrb=\"Inner\"><e>Text</e></inner>\n" +
" <none>\n" +
" <noneChild>\n" +
" <key>IDString</key>\n" +
" <value>00200je832oiuh91hnu8833</value>\n" +
" </noneChild>\n" +
" </none>\n" +
"</object>";
private static final String jsonString = "{\"object\":{\"@attrb_1\":\"Value1\",\"@attrb_11\":\"Value2\",\"child\":{\"@c_attrb\":\"Child\",\"$\":\"Child Text\"},\"inner\":{\"@c_attrb\":\"Inner\",\"e\":\"Text\"},\"none\":{\"noneChild\":{\"key\":\"IDString\",\"value\":\"00200je832oiuh91hnu8833\"}}}}";
private static final String convertedXml = "<jsonObject><object attrb_1=\"Value1\" attrb_11=\"Value2\"><child c_attrb=\"Child\">Child Text</child><inner c_attrb=\"Inner\"><e>Text</e></inner><none><noneChild><key>IDString</key><value>00200je832oiuh91hnu8833</value></noneChild></none></object></jsonObject>";
public void test1() {
runTest(jsonIn2, xml2);
}
public void test3() {
runTest(jsonIn3, xml3);
}
public void test4() {
runTest(jsonIn4, xml4);
}
public void test5() {
runTest(jsonIn5, xml5);
}
public void test2() {
try {
InputStream is = Util.getJson(1);
MessageContext message = Util.newMessageContext();
OMElement element = jsonBuilder.processDocument(is, "application/json", message);
OutputStream out = Util.newOutputStream();
formatter.writeTo(message, null, out, false);
InputStream outContent = new ByteArrayInputStream(((ByteArrayOutputStream) out).toByteArray());
InputStream compare = Util.getJson(1);
assertTrue(IOUtils.contentEquals(outContent, compare));
} catch (FileNotFoundException e) {
e.printStackTrace();
assertTrue(false);
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void test6() {
runTest(jsonString, convertedXml);
}
public void test7() {
// The Input XML must be such that 1) it does not have mixed content 2) no attributes have same name even they
// belong to different namespaces.
// mixed content is not supported. ie both Text nodes and Elements as child nodes of an element.
// cannot have same attribute names even with different ns s. That's because, we remove all namespace declarations
// before converting to JSON.
try {
MessageContext message = null;
try {
message = Util.newMessageContext(xmlString);
} catch (XMLStreamException e) {
e.printStackTrace();
}
//System.out.println(message.getEnvelope().getBody().toString());
OutputStream out = Util.newOutputStream();
formatter.writeTo(message, null, out, false);
String outStr = new String(((ByteArrayOutputStream) out).toByteArray());
//System.out.println(outStr);
assertTrue(jsonString.equals(outStr));
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
assertTrue(false);
}
}
public void runTest(String jsonIn, String xmlOut) {
try {
MessageContext message = Util.newMessageContext();
InputStream inputStream = Util.newInputStream(jsonIn.getBytes());
OMElement element = jsonBuilder.processDocument(inputStream, "application/json", message);
message.getEnvelope().getBody().addChild(element);
//System.out.println(element.toString());
assertTrue(xmlOut.equals(element.toString()));
OutputStream out = Util.newOutputStream();
formatter.writeTo(message, null, out, false);
String outStr = new String(((ByteArrayOutputStream) out).toByteArray());
//System.out.println(outStr);
assertTrue(jsonIn.equals(outStr));
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
assertTrue(false);
}
}
}