/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2010-2012 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * http://glassfish.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package com.sun.jersey.json.impl; import java.io.StringReader; import java.io.StringWriter; import java.util.Collections; import java.util.Map; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.stream.XMLStreamReader; import com.sun.jersey.api.json.JSONConfiguration; import com.sun.jersey.json.impl.reader.JsonXmlStreamReader; import com.sun.jersey.json.impl.writer.Stax2JacksonWriter; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; import static com.sun.jersey.json.impl.util.JSONNormalizer.normalizeJsonString; import junit.framework.TestCase; /** * {@code JsonXmlStreamReader} roundtrip tests for JSON in the natural notation. * * @author Jakub Podlesak (jakub.podlesak at oracle.com) * @author Michal Gajdos (michal.gajdos at oracle.com) */ public class JsonXmlStreamReaderWriterNaturalNotationTest extends TestCase { private static final String PKG_NAME = "com/sun/jersey/json/impl/"; public JsonXmlStreamReaderWriterNaturalNotationTest(String testName) { super(testName); } @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void testAttrAndCharData() throws Exception { tryBean(AttrAndCharDataBean.class, "attrAndCharDataValue_natural.json", AttrAndCharDataBean.createTestInstance()); } public void testComplexBeanWithAttributes() throws Exception { tryBean(ComplexBeanWithAttributes.class, "complexBeanWithAttributes_natural.json", ComplexBeanWithAttributes.createTestInstance()); } public void testComplexBeanWithAttributes2() throws Exception { tryBean(ComplexBeanWithAttributes2.class, "complexBeanWithAttributes2_natural.json", ComplexBeanWithAttributes2.createTestInstance()); } public void testComplexBeanWithAttributes3() throws Exception { tryBean(ComplexBeanWithAttributes3.class, "complexBeanWithAttributes3_natural.json", ComplexBeanWithAttributes3.createTestInstance()); } public void testComplexBeanWithAttributes4() throws Exception { tryBean(ComplexBeanWithAttributes4.class, "complexBeanWithAttributes4_natural.json", ComplexBeanWithAttributes4.createTestInstance()); } public void testEncodedContentBean() throws Exception { tryBean(EncodedContentBean.class, "encodedContentBean_natural.json", EncodedContentBean.createTestInstance()); } public void testListAndNonListBean() throws Exception { tryBean(ListAndNonListBean.class, "listAndNonList_natural.json", ListAndNonListBean.createTestInstance()); } public void testListEmptyBean() throws Exception { tryBean(ListEmptyBean.class, "listEmptyBean_natural.json", ListEmptyBean.createTestInstance()); } public void testListNullElementBean() throws Exception { Map<String, Object> props = JSONHelper.createPropertiesForJaxbContext(Collections.<String, Object>emptyMap()); Class[] classes = new Class[]{ListNullElementBean.class}; JAXBContext jaxbContext = JAXBContext.newInstance(classes, props); tryReadingBean(ListNullElementBean.class, "listNullElementBean_natural.json", ListNullElementBean.createTestInstance(), jaxbContext, null); } public void testListWrapperBean() throws Exception { tryBean(ListWrapperBean.class, "listWrapperBean_natural.json", ListWrapperBean.createTestInstance()); } public void testPureCharDataBean() throws Exception { tryBean(PureCharDataBean.class, "pureCharDataBean_natural.json", PureCharDataBean.createTestInstance()); } public void testSimpleBean() throws Exception { tryBean(SimpleBean.class, "simpleBean_natural.json", SimpleBean.createTestInstance()); } public void testSimpleEmptyBean() throws Exception { tryBean(SimpleBean.class, "simpleBeanEmpty_natural.json", new SimpleBean()); } public void testSimpleBeanWithAttributes() throws Exception { tryBean(SimpleBeanWithAttributes.class, "simpleBeanWithAttributes_natural.json", SimpleBeanWithAttributes.createTestInstance()); } public void testSimpleBeanWithObjectAttributes() throws Exception { tryBean(SimpleBeanWithObjectAttributes.class, "simpleBeanWithObjectAttributes_natural.json", SimpleBeanWithObjectAttributes.createTestInstance()); } public void testSimpleBeanWithJustOneAttribute() throws Exception { tryBean(SimpleBeanWithJustOneAttribute.class, "simpleBeanWithJustOneAttribute_natural.json", SimpleBeanWithJustOneAttribute.createTestInstance()); } public void testSimpleBeanWithJustOneAttributeAndValue() throws Exception { tryBean(SimpleBeanWithJustOneAttributeAndValue.class, "simpleBeanWithJustOneAttributeAndValue_natural.json", SimpleBeanWithJustOneAttributeAndValue.createTestInstance()); } public void testTreeModelBean() throws Exception { tryBean(TreeModel.class, "treeModel_natural.json", TreeModel.createTestInstance()); } public void testTreeModelRootWithOneChild() throws Exception { tryBean(TreeModel.class, "treeModelRootWithOneChild_natural.json", TreeModel.createTestInstanceWithRootAndOneChildNode()); } public void testTreeModelRootWithMultipleChildren() throws Exception { tryBean(TreeModel.class, "treeModelRootWithMultipleChildren_natural.json", TreeModel.createTestInstanceWithRootAndMultipleChildNodes()); } public void testTwoListsWrapperBean() throws Exception { tryBean(TwoListsWrapperBean.class, "twoListsWrapperBean_natural.json", TwoListsWrapperBean.createTestInstance()); } public void testUser() throws Exception { tryBean(User.class, "user_natural.json", User.createTestInstance()); } public void testUserTable() throws Exception { tryBean(UserTable.class, "userTable_natural.json", UserTable.createTestInstance()); } public void testUserTable2() throws Exception { tryBean(UserTable.class, "userTable2_natural.json", UserTable.createTestInstance2()); } public void testJersey1199() throws Exception { Map<String, Object> props = JSONHelper.createPropertiesForJaxbContext(Collections.<String, Object>emptyMap()); Class[] classes = new Class[] {ColorHolder.class, Jersey1199List.class}; final JSONConfiguration.NaturalBuilder builder = JSONConfiguration.natural(); builder.usePrefixesAtNaturalAttributes(); builder.rootUnwrapping(false); final JSONConfiguration jsonConfiguration = builder.build(); final JAXBContext jaxbContext = JAXBContext.newInstance(classes, props); tryBean(Jersey1199List.class, "jersey1199_natural.json", Jersey1199List.createTestInstance(), jaxbContext, jsonConfiguration); } private void _testReadingBean(final Class<?> expectedType, final String jsonFileName, final Object testInstance) throws Exception { Map<String, Object> props = JSONHelper.createPropertiesForJaxbContext(Collections.<String, Object>emptyMap()); Class[] classes = new Class[] {expectedType}; JAXBContext jaxbContext = JAXBContext.newInstance(classes, props); tryReadingBean(expectedType, jsonFileName, testInstance, jaxbContext, null); } public void testListEmptyBeanVerbose() throws Exception { _testReadingBean(ListEmptyBean.class, "listEmptyBeanVerbose_natural.json", ListEmptyBean.createTestInstance()); } public void testMultipleArrayElements() throws Exception { _testReadingBean(UserTable.class, "userTableVerbose_natural.json", UserTable.createTestInstance()); } public void testMultipleArrayElementsAsArrays() throws Exception { _testReadingBean(UserTable.class, "userTableVerboseAsArrays_natural.json", UserTable.createTestInstance()); } public void testUserTableNullColumns() throws Exception { final UserTable testInstance = (UserTable) UserTable.createTestInstance(); testInstance.setColumns(null); _testReadingBean(UserTable.class, "userTableNullColumns_natural.json", testInstance); } public void testUserTableEmptyColumns() throws Exception { Map<String, Object> props = JSONHelper.createPropertiesForJaxbContext(Collections.<String, Object>emptyMap()); Class[] classes = new Class[] {UserTable.class}; JAXBContext jaxbContext = JAXBContext.newInstance(classes, props); final UserTable testInstance = (UserTable) UserTable.createTestInstance(); testInstance.setColumns(null); tryReadingBean(UserTable.class, "userTableEmptyColumns_natural.json", testInstance, jaxbContext, null); } private void tryBean(final Class clazz, final String jsonExprFilename, final Object jaxbBean) throws Exception { Map<String, Object> props = JSONHelper.createPropertiesForJaxbContext(Collections.<String, Object>emptyMap()); Class[] classes = new Class[]{clazz}; JAXBContext jaxbContext = JAXBContext.newInstance(classes, props); tryBean(clazz, jsonExprFilename, jaxbBean, jaxbContext, null); } private void tryBean(final Class clazz, final String jsonExprFilename, final Object jaxbBean, final JAXBContext jaxbContext, final JSONConfiguration configuration) throws Exception { tryWritingBean(clazz, jsonExprFilename, jaxbBean, jaxbContext, configuration); tryReadingBean(clazz, jsonExprFilename, jaxbBean, jaxbContext, configuration); } private void tryWritingBean(final Class clazz, final String jsonExprFilename, final Object jaxbBean, final JAXBContext jaxbContext, final JSONConfiguration configuration) throws Exception { String expectedJsonExpr = JSONTestHelper.getResourceAsString(PKG_NAME, jsonExprFilename); Marshaller marshaller = jaxbContext.createMarshaller(); StringWriter resultWriter = new StringWriter(); JsonFactory jsonFactory = new JsonFactory(); JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(resultWriter); final Stax2JacksonWriter writer = configuration != null ? new Stax2JacksonWriter(jsonGenerator, configuration, clazz, jaxbContext) : new Stax2JacksonWriter(jsonGenerator, clazz, jaxbContext); marshaller.marshal(jaxbBean, writer); System.out.println(String.format("Marshalled: %s", resultWriter.toString())); assertEquals("MISMATCH:\n" + expectedJsonExpr + "\n" + resultWriter.toString() + "\n", normalizeJsonString(expectedJsonExpr), normalizeJsonString(resultWriter.toString())); } private void tryReadingBean(final Class clazz, final String jsonExprFilename, final Object jaxbBean, final JAXBContext jaxbContext, JSONConfiguration configuration) throws Exception { Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); if (configuration == null) { configuration = JSONConfiguration.natural().rootUnwrapping(false).build(); } final XMLStreamReader xmlStreamReader = JsonXmlStreamReader.create( new StringReader(JSONTestHelper.getResourceAsString(PKG_NAME, jsonExprFilename)), configuration, null, clazz, jaxbContext, false); Object unmarshalledBean = unmarshaller.unmarshal(xmlStreamReader, clazz).getValue(); System.out.println(String.format("Unmarshalled: %s", unmarshalledBean)); assertEquals("MISMATCH:\n" + jaxbBean + "\n" + unmarshalledBean + "\n", jaxbBean, unmarshalledBean); } }