package org.apache.wink.providers.jackson.internal; /******************************************************************************* * 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. * *******************************************************************************/ import java.io.IOException; import java.io.StringReader; import java.util.GregorianCalendar; import javax.ws.rs.Consumes; 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 org.apache.wink.common.model.atom.AtomEntry; import org.apache.wink.common.model.synd.SyndEntry; 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.JSONObject; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; /** * Tests the Jackson provider. */ public class JacksonJAXBTest extends MockServletInvocationTest { @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 public Person getPerson() throws IOException { Person p = new Person(); p.setName("My Name"); p.setDesc("My desc"); p.setAge(100); return p; } @POST public Person postPerson(Person p) { return p; } } @Path("test") public static class TestResource { @GET @Path("atomentry") @Produces("application/json") public AtomEntry getAtomEntry() throws IOException { AtomEntry entry = AtomEntry.unmarshal(new StringReader(ENTRY_STR)); return entry; } @GET @Path("atomentryelement") @Produces("application/json") public JAXBElement<AtomEntry> getAtomEntryElement() throws IOException { AtomEntry entry = AtomEntry.unmarshal(new StringReader(ENTRY_STR)); org.apache.wink.common.model.atom.ObjectFactory of = new org.apache.wink.common.model.atom.ObjectFactory(); return of.createEntry(entry); } @GET @Path("atomsyndentry") @Produces("application/json") public SyndEntry getSyndEntry() throws IOException { AtomEntry entry = AtomEntry.unmarshal(new StringReader(ENTRY_STR)); return entry.toSynd(new SyndEntry()); } @POST @Path("atomentry") @Produces("application/json") @Consumes("application/json") public AtomEntry postAtomEntry(AtomEntry entry) throws IOException { return entry; } @POST @Path("atomentryelement") @Produces("application/json") @Consumes("application/json") public JAXBElement<AtomEntry> postAtomEntryElement(JAXBElement<AtomEntry> entry) { return entry; } @POST @Path("atomsyndentry") @Produces("application/json") @Consumes("application/json") public SyndEntry postAtomSyndEntry(SyndEntry entry) { return entry; } } /** * Tests a simple single JAXB Object to write. * * @throws Exception */ public void testGetPerson() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("GET", "/test/person", "application/json"); MockHttpServletResponse response = invoke(request); assertEquals(200, response.getStatus()); assertTrue(JSONUtils.equals(new JSONObject("{\"desc\":\"My desc\",\"name\":\"My Name\",\"age\":100}"), new JSONObject(response.getContentAsString()))); } /** * Tests a simple single JAXB Object to both read and write. * * @throws Exception */ public void testPostPerson() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("POST", "/test/person", "application/json"); request.setContentType("application/json"); request.setContent("{\"desc\":\"My desc\",\"name\":\"My Name\",\"age\":100}".getBytes()); MockHttpServletResponse response = invoke(request); assertEquals(200, response.getStatus()); assertTrue(JSONUtils.equals(new JSONObject("{\"desc\":\"My desc\",\"name\":\"My Name\",\"age\":100}"), new JSONObject(response.getContentAsString()))); } public void testGetAtomEntry() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("GET", "/test/atomentry", "application/json"); MockHttpServletResponse response = invoke(request); assertEquals(200, response.getStatus()); System.out.println(JSONUtils.objectForString(ENTRY_JSON)); System.out.println(JSONUtils .objectForString(response.getContentAsString())); assertTrue(JSONUtils.equals(JSONUtils.objectForString(ENTRY_JSON), JSONUtils .objectForString(response.getContentAsString()))); } public void testGetAtomEntryElement() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("GET", "/test/atomentryelement", "application/json"); MockHttpServletResponse response = invoke(request); assertEquals(200, response.getStatus()); assertTrue(JSONUtils.equals(JSONUtils.objectForString(ENTRY_STR_JSON_GET), JSONUtils .objectForString(response.getContentAsString()))); } /* * NOTE: this test is currently disabled, as the Jackson-supplied provider * cannot tolerate org.w3c.dom.Element fields in the various Atom* objects */ public void _testPostAtomEntry() throws Exception { MockHttpServletRequest request = MockRequestConstructor.constructMockRequest("POST", "/test/atomentry", "application/json"); request.setContentType("application/json"); request.setContent(ENTRY_JSON_POST.getBytes()); MockHttpServletResponse response = invoke(request); assertEquals(200, response.getStatus()); assertTrue(JSONUtils.equals(JSONUtils.objectForString(ENTRY_JSON_POST), JSONUtils .objectForString(response.getContentAsString()))); } private static final String ENTRY_STR = "<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</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</name>\n" + " </author>\n" + " <category label=\"report definition\" scheme=\"urn:com:systinet:reporting:kind\" term=\"urn:com:systinet:reporting:kind:definition\"/>\n" + "</entry>\n"; private static final String ENTRY_STR_JSON_POST = "{" + "\"id\":\"top ten validators\",\"updated\":@TIME_JSON@,\"title\":{\"lang\":\"en\",\"any\":[\"top ten validators\"],\"type\":\"text\"}" + "}"; private static final String ENTRY_STR_JSON = "{\"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\"}]," + "\"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 + ",\"nil\":false, \"typeSubstituted\":false,\"globalScope\":true}"; private static final String ENTRY_JSON; private static final String ENTRY_JSON_POST; static { ENTRY_JSON = ENTRY_STR_JSON; ENTRY_JSON_POST = ENTRY_STR_JSON_POST; } }