/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.wink.providers.jackson.internal;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.xml.bind.JAXBElement;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import org.apache.wink.common.model.atom.AtomEntry;
import org.apache.wink.providers.jackson.WinkJacksonJaxbJsonProvider;
import org.apache.wink.providers.jackson.internal.jaxb.Person;
import org.apache.wink.providers.json.JSONUtils;
import org.apache.wink.server.internal.servlet.MockServletInvocationTest;
import org.apache.wink.test.mock.MockRequestConstructor;
import org.json.JSONArray;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
public class JAXBCollectionJSONTest extends MockServletInvocationTest {
private static final String ENTRY_STR_1 =
"<entry xml:base=\"http://b216:8080/reporting/reports\" xmlns=\"http://www.w3.org/2005/Atom\">\n" + " <id>toptenvalidators</id>\n"
+ " <updated>2009-08-31T18:30:02Z</updated>\n"
+ " <title type=\"text\" xml:lang=\"en\">top ten validators 1</title>\n"
+ " <published>2009-08-31T18:30:02Z</published>\n"
+ " <link href=\"http://b216:8080/reporting/reports/toptenvalidators?alt=application/json\" type=\"application/json\" rel=\"alternate\"/>\n"
+ " <author>\n"
+ " <name>admin 1</name>\n"
+ " </author>\n"
+ " <category label=\"report definition\" scheme=\"urn:com:systinet:reporting:kind\" term=\"urn:com:systinet:reporting:kind:definition\"/>\n"
+ "</entry>";
private static final String ENTRY_STR_2 =
"<entry xml:base=\"http://b216:8080/reporting/reports\" xmlns=\"http://www.w3.org/2005/Atom\">\n" + " <id>toptenvalidators</id>\n"
+ " <updated>2009-08-31T18:30:02Z</updated>\n"
+ " <title type=\"text\" xml:lang=\"en\">top ten validators 2</title>\n"
+ " <published>2009-08-31T18:30:02Z</published>\n"
+ " <link href=\"http://b216:8080/reporting/reports/toptenvalidators?alt=application/json\" type=\"application/json\" rel=\"alternate\"/>\n"
+ " <author>\n"
+ " <name>admin 2</name>\n"
+ " </author>\n"
+ " <category label=\"report definition\" scheme=\"urn:com:systinet:reporting:kind\" term=\"urn:com:systinet:reporting:kind:definition\"/>\n"
+ "</entry>";
private static final String ENTRY_STR_JSON_1 =
"{\"base\":\"http://b216:8080/reporting/reports\"," + ""
+ "\"id\":\"toptenvalidators\","
+ "\"updated\":1251743402000,"
+ "\"title\":{\"lang\":\"en\",\"type\":\"text\"},"
+ "\"published\":1251743402000,"
+ "\"link\":[{\"rel\":\"alternate\",\"type\":\"application/json\",\"href\":\"http://b216:8080/reporting/reports/toptenvalidators?alt=application/json\"}],"
+ "\"author\":[{\"name\":\"admin 1\"}],"
+ "\"category\":[{\"term\":\"urn:com:systinet:reporting:kind:definition\",\"scheme\":\"urn:com:systinet:reporting:kind\",\"label\":\"report definition\"}]"
+ "}";
private static final String ENTRY_STR_JSON_2 =
"{\"base\":\"http://b216:8080/reporting/reports\"," + ""
+ "\"id\":\"toptenvalidators\","
+ "\"updated\":1251743402000,"
+ "\"title\":{\"lang\":\"en\",\"type\":\"text\"},"
+ "\"published\":1251743402000,"
+ "\"link\":[{\"rel\":\"alternate\",\"type\":\"application/json\",\"href\":\"http://b216:8080/reporting/reports/toptenvalidators?alt=application/json\"}],"
+ "\"author\":[{\"name\":\"admin 2\"}],"
+ "\"category\":[{\"term\":\"urn:com:systinet:reporting:kind:definition\",\"scheme\":\"urn:com:systinet:reporting:kind\",\"label\":\"report definition\"}]"
+ "}";
private static final String ENTRY_STR_JSON_GET =
"[{\"name\":\"{http://www.w3.org/2005/Atom}entry\"," + "\"declaredType\":\"org.apache.wink.common.model.atom.AtomEntry\","
+ "\"scope\":\"javax.xml.bind.JAXBElement$GlobalScope\","
+ "\"value\":"
+ ENTRY_STR_JSON_1
+ ",\"nil\":false, \"typeSubstituted\":false,\"globalScope\":true},"
+ "{\"name\":\"{http://www.w3.org/2005/Atom}entry\"," + "\"declaredType\":\"org.apache.wink.common.model.atom.AtomEntry\","
+ "\"scope\":\"javax.xml.bind.JAXBElement$GlobalScope\","
+ "\"value\":"
+ ENTRY_STR_JSON_2
+ ",\"nil\":false, \"typeSubstituted\":false,\"globalScope\":true}]";
private static final String ENTRY_JSON_1;
private static final String ENTRY_JSON_2;
static {
GregorianCalendar gCal = new GregorianCalendar();
XMLGregorianCalendar xmlGCal = null;
try {
xmlGCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCal);
} catch (DatatypeConfigurationException e) {
fail("could not construct XMLGregorianCalendar: " + e.getMessage());
e.printStackTrace();
}
String jsonTimeStr1 = "{";
jsonTimeStr1 += "\"eon\":" + xmlGCal.getEon() + ",";
jsonTimeStr1 += "\"year\":" + xmlGCal.getYear() + ",";
jsonTimeStr1 += "\"day\":" + xmlGCal.getDay() + ",";
jsonTimeStr1 += "\"timezone\":" + xmlGCal.getTimezone() + ",";
jsonTimeStr1 += "\"hour\":" + xmlGCal.getHour() + ",";
jsonTimeStr1 += "\"minute\":" + xmlGCal.getMinute() + ",";
jsonTimeStr1 += "\"second\":" + xmlGCal.getSecond() + ",";
jsonTimeStr1 += "\"millisecond\":" + xmlGCal.getMillisecond();
jsonTimeStr1 += "}";
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
String jsonTimeStr2 = "{";
jsonTimeStr2 += "\"eon\":" + xmlGCal.getEon() + ",";
jsonTimeStr2 += "\"year\":" + xmlGCal.getYear() + ",";
jsonTimeStr2 += "\"day\":" + xmlGCal.getDay() + ",";
jsonTimeStr2 += "\"timezone\":" + xmlGCal.getTimezone() + ",";
jsonTimeStr2 += "\"hour\":" + xmlGCal.getHour() + ",";
jsonTimeStr2 += "\"minute\":" + xmlGCal.getMinute() + ",";
jsonTimeStr2 += "\"second\":" + xmlGCal.getSecond() + ",";
jsonTimeStr2 += "\"millisecond\":" + xmlGCal.getMillisecond();
jsonTimeStr2 += "}";
ENTRY_JSON_1 = ENTRY_STR_JSON_1.replaceAll("@TIME_JSON@", jsonTimeStr1);
ENTRY_JSON_2 = ENTRY_STR_JSON_2.replaceAll("@TIME_JSON@", jsonTimeStr2);
}
@Override
protected Class<?>[] getClasses() {
return new Class<?>[] {TestResource.class, PersonResource.class};
}
@Override
protected Object[] getSingletons() {
return new Object[] {new WinkJacksonJaxbJsonProvider()};
}
@Path("/test/person")
public static class PersonResource {
@GET
@Path("collection")
public List<Person> getPeopleCollection() throws IOException {
List<Person> people = new ArrayList<Person>();
Person p = new Person();
p.setName("My Name");
p.setDesc("My desc");
p.setAge(20);
people.add(p);
p = new Person();
p.setName("My Name 2");
p.setDesc("My desc 2");
people.add(p);
p.setAge(22);
return people;
}
@GET
@Path("array")
public Person[] getPeopleArray() throws IOException {
return getPeopleCollection().toArray(new Person[] {});
}
@GET
@Path("jaxbelement")
public List<JAXBElement<Person>> getPeopleJAXBElementCollection() throws IOException {
List<Person> people = getPeopleCollection();
List<JAXBElement<Person>> ret = new ArrayList<JAXBElement<Person>>();
JAXBElement<Person> element = null;
for (Person p : people) {
element = new JAXBElement<Person>(new QName("", "person"), Person.class, p);
ret.add(element);
}
return ret;
}
@POST
@Path("collection")
public List<Person> postPeopleCollection(List<Person> p) {
return p;
}
@POST
@Path("array")
public Person[] postPeopleArray(Person[] p) {
return p;
}
}
@Path("test")
public static class TestResource {
@GET
@Path("atomentries/collection")
@Produces("application/json")
public List<AtomEntry> getAtomEntriesCollection() throws IOException {
List<AtomEntry> entries = new ArrayList<AtomEntry>();
AtomEntry entry1 = AtomEntry.unmarshal(new StringReader(ENTRY_STR_1));
AtomEntry entry2 = AtomEntry.unmarshal(new StringReader(ENTRY_STR_2));
entries.add(entry1);
entries.add(entry2);
return entries;
}
@GET
@Path("atomentries/array")
@Produces("application/json")
public AtomEntry[] getAtomEntriesArray() throws IOException {
return getAtomEntriesCollection().toArray(new AtomEntry[] {});
}
@GET
@Path("atomentryelements/collection")
@Produces("application/json")
public List<JAXBElement<AtomEntry>> getAtomEntryElementCollection() throws IOException {
List<JAXBElement<AtomEntry>> entries = new ArrayList<JAXBElement<AtomEntry>>();
AtomEntry entry1 = AtomEntry.unmarshal(new StringReader(ENTRY_STR_1));
AtomEntry entry2 = AtomEntry.unmarshal(new StringReader(ENTRY_STR_2));
org.apache.wink.common.model.atom.ObjectFactory of =
new org.apache.wink.common.model.atom.ObjectFactory();
entries.add(of.createEntry(entry1));
entries.add(of.createEntry(entry2));
return entries;
}
}
public void testGetPeople() throws Exception {
MockHttpServletRequest request =
MockRequestConstructor.constructMockRequest("GET",
"/test/person/collection",
"application/json");
MockHttpServletResponse response = invoke(request);
assertEquals(200, response.getStatus());
assertTrue(JSONUtils
.equals(new JSONArray(
"[{\"desc\":\"My desc\",\"name\":\"My Name\",\"age\":20},{\"desc\":\"My desc 2\",\"name\":\"My Name 2\",\"age\":22}]"),
new JSONArray(response.getContentAsString())));
request =
MockRequestConstructor.constructMockRequest("GET",
"/test/person/array",
"application/json");
response = invoke(request);
assertEquals(200, response.getStatus());
assertTrue(JSONUtils
.equals(new JSONArray(
"[{\"desc\":\"My desc\",\"name\":\"My Name\",\"age\":20},{\"desc\":\"My desc 2\",\"name\":\"My Name 2\",\"age\":22}]"),
new JSONArray(response.getContentAsString())));
request =
MockRequestConstructor.constructMockRequest("GET",
"/test/person/jaxbelement",
"application/json");
response = invoke(request);
assertEquals(200, response.getStatus());
assertTrue(JSONUtils
.equals(new JSONArray(
"[{\"name\":\"person\",\"declaredType\":\"org.apache.wink.providers.jackson.internal.jaxb.Person\",\"scope\":\"javax.xml.bind.JAXBElement$GlobalScope\",\"value\":{\"name\":\"My Name\",\"desc\":\"My desc\",\"age\":20},\"nil\":false, \"typeSubstituted\":false,\"globalScope\":true},{\"name\":\"person\",\"declaredType\":\"org.apache.wink.providers.jackson.internal.jaxb.Person\",\"scope\":\"javax.xml.bind.JAXBElement$GlobalScope\",\"value\":{\"name\":\"My Name 2\",\"desc\":\"My desc 2\",\"age\":22},\"nil\":false, \"typeSubstituted\":false,\"globalScope\":true}]"),
new JSONArray(response.getContentAsString())));
}
public void testPostPeople() throws Exception {
MockHttpServletRequest request =
MockRequestConstructor.constructMockRequest("POST",
"/test/person/collection",
"application/json");
request.setContentType("application/json");
request
.setContent("[{\"desc\":\"My desc 1\",\"name\":\"My Name 1\",\"age\":20},{\"desc\":\"My desc 2\",\"name\":\"My Name 2\",\"age\":22}]"
.getBytes());
MockHttpServletResponse response = invoke(request);
assertEquals(200, response.getStatus());
assertTrue(JSONUtils
.equals(new JSONArray(
"[{\"desc\":\"My desc 1\",\"name\":\"My Name 1\",\"age\":20},{\"desc\":\"My desc 2\",\"name\":\"My Name 2\",\"age\":22}]"),
new JSONArray(response.getContentAsString())));
request =
MockRequestConstructor.constructMockRequest("POST",
"/test/person/array",
"application/json");
request.setContentType("application/json");
request
.setContent("[{\"desc\":\"My desc 1\",\"name\":\"My Name 1\",\"age\":20},{\"desc\":\"My desc 2\",\"name\":\"My Name 2\",\"age\":22}]"
.getBytes());
response = invoke(request);
assertEquals(200, response.getStatus());
assertTrue(JSONUtils
.equals(new JSONArray(
"[{\"desc\":\"My desc 1\",\"name\":\"My Name 1\",\"age\":20},{\"desc\":\"My desc 2\",\"name\":\"My Name 2\",\"age\":22}]"),
new JSONArray(response.getContentAsString())));
}
public void testGetAtomEntries() throws Exception {
MockHttpServletRequest request =
MockRequestConstructor.constructMockRequest("GET",
"/test/atomentries/collection",
"application/json");
MockHttpServletResponse response = invoke(request);
assertEquals(200, response.getStatus());
assertTrue(JSONUtils.equals(new JSONArray("[" + ENTRY_JSON_1 + "," + ENTRY_JSON_2 + "]"),
new JSONArray(response.getContentAsString())));
request =
MockRequestConstructor.constructMockRequest("GET",
"/test/atomentries/array",
"application/json");
response = invoke(request);
assertEquals(200, response.getStatus());
assertTrue(JSONUtils.equals(new JSONArray("[" + ENTRY_JSON_1 + "," + ENTRY_JSON_2 + "]"),
new JSONArray(response.getContentAsString())));
}
public void testGetAtomEntryElements() throws Exception {
MockHttpServletRequest request =
MockRequestConstructor.constructMockRequest("GET",
"/test/atomentryelements/collection",
"application/json");
MockHttpServletResponse response = invoke(request);
assertEquals(200, response.getStatus());
assertTrue(JSONUtils.equals(new JSONArray(ENTRY_STR_JSON_GET), new JSONArray(response
.getContentAsString())));
}
}