/*******************************************************************************
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2013,2014 by Peter Pilgrim, Addiscombe, Surrey, XeNoNiQUe UK
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU GPL v3.0
* which accompanies this distribution, and is available at:
* http://www.gnu.org/licenses/gpl-3.0.txt
*
* Developers:
* Peter Pilgrim -- design, development and implementation
* -- Blog: http://www.xenonique.co.uk/blog/
* -- Twitter: @peter_pilgrim
*
* Contributors:
*
*******************************************************************************/
package je7hb.appendix.utilities.jsondemos;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.json.Json;
import javax.json.stream.JsonGenerator;
import javax.json.stream.JsonParser;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static javax.json.stream.JsonParser.Event.*;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
/**
* Verifies the operation of the JSONPStreamingAPITest
*
* @author Peter Pilgrim
*/
@RunWith(Arquillian.class)
public class JSONPStreamingAPITest {
@Deployment
public static JavaArchive createDeployment() {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class)
.addAsManifestResource(
EmptyAsset.INSTANCE,
ArchivePaths.create("beans.xml"));
return jar;
}
String TEST_JSON2 =
"{\n" +
" \"firstName\": \"John\",\n" +
" \"lastName\": \"Smith\",\n" +
" \"age\": 25,\n" +
" \"address\": {\n" +
" \"streetAddress\": \"21 2nd Street\",\n" +
" \"city\": \"New York\",\n" +
" \"state\": \"NY\",\n" +
" \"postalCode\": 10021\n" +
" },\n" +
" \"phoneNumbers\": [\n" +
" {\n" +
" \"type\": \"home\",\n" +
" \"number\": \"212 555-1234\"\n" +
" },\n" +
" {\n" +
" \"type\": \"fax\",\n" +
" \"number\": \"646 555-4567\"\n" +
" }\n" +
" ]\n" +
"}"
;
static String TEST_JSON =
"{\n" +
" \"firstName\": \"John\",\n" +
" \"lastName\": \"Smith\",\n" +
" \"age\": 25,\n" +
" \"address\": {\n" +
" \"streetAddress\": \"21 2nd Street\",\n" +
" \"city\": \"New York\",\n" +
" \"state\": \"NY\",\n" +
" \"postalCode\": 10021\n" +
" }\n" +
"}"
;
class Phone {
final private String type;
final private String number;
Phone(String type, String number) {
this.type = type;
this.number = number;
}
}
@Test
public void shouldParseJSONSchema() {
StringReader sreader = new StringReader(TEST_JSON2);
JsonParser parser = Json.createParser(sreader);
JsonParser.Event event = parser.next();
assertEquals(START_OBJECT, event);
List<Phone> phoneList = new ArrayList<>();
while (parser.hasNext()) {
event = readNextEvent(parser);
if ( event == KEY_NAME) {
switch (parser.getString()) {
case "firstName":
event = readNextEvent(parser);
assertThat( parser.getString(), is("John"));
break;
case "lastName":
event = readNextEvent(parser);
assertThat( parser.getString(), is("Smith"));
break;
case "age":
event = readNextEvent(parser);
assertThat( parser.getInt(), is(25));
break;
case "phoneNumbers": {
event = readNextEvent(parser);
assertThat(event, is(START_ARRAY));
event = readNextEvent(parser);
while (event != END_ARRAY) {
assertThat(event, is(START_OBJECT));
event = readNextEvent(parser);
assertThat(event, is(KEY_NAME));
event = readNextEvent(parser);
assertThat(event, is(VALUE_STRING));
String type = parser.getString();
event = readNextEvent(parser);
assertThat(event, is(KEY_NAME));
event = readNextEvent(parser);
assertThat(event, is(VALUE_STRING));
String number = parser.getString();
System.out.printf("parser=%s, type=%s, number=%s\n", parser, type, number);
phoneList.add( new Phone(type,number));
event = readNextEvent(parser);
assertThat(event, is(END_OBJECT));
event = readNextEvent(parser);
}
}
break;
}
}
}
assertThat(phoneList.size(), is(2));
}
private JsonParser.Event readNextEvent( JsonParser parser ) {
JsonParser.Event event = parser.next();
debugJSONEvent(parser,event);
return event;
}
private void debugJSONEvent(
JsonParser parser, JsonParser.Event event) {
switch(event) {
case START_ARRAY:
case END_ARRAY:
case START_OBJECT:
case END_OBJECT:
case VALUE_FALSE:
case VALUE_NULL:
case VALUE_TRUE:
System.out.println(event.toString());
break;
case KEY_NAME:
System.out.print(event.toString() + " " +
parser.getString() + " - ");
break;
case VALUE_STRING:
case VALUE_NUMBER:
System.out.println(event.toString() + " `" +
parser.getString()+"'");
break;
}
}
@Test
public void shouldGenerateJSON() {
StringWriter swriter = new StringWriter();
Map<String,Object> properties = new HashMap<String, Object>() {{
put(JsonGenerator.PRETTY_PRINTING, true);
}};
try (JsonGenerator generator =
Json.createGeneratorFactory(/*properties*/ null )
.createGenerator(swriter)) {
generator
.writeStartObject()
.write("artist", "Daft Punk")
.write("album", "Random Access Memories")
.write("year", 2013)
.writeStartArray("collaborators")
.writeStartObject()
.write("firstName", "Nile")
.write("lastName", "Rodgers")
.writeEnd()
.writeStartObject()
.write("firstName", "Giorgio")
.write("lastName", "Moroder")
.writeEnd()
.writeEnd()
.writeEnd();
}
System.out.printf("\n***** >>>>>>>>> swriter.toString=%s\n", swriter.toString());
String expected = "{\"artist\":\"Daft Punk\"," +
"\"album\":\"Random Access Memories\",\"year\":2013,\"" +
"collaborators\":[{\"firstName\":\"Nile\"," +
"\"lastName\":\"Rodgers\"},{\"firstName\":" +
"\"Giorgio\",\"lastName\":\"Moroder\"}]}";
assertThat(swriter.toString().length(), is(not(0)));
// assertThat(swriter.toString(), is(expected));
}
}