/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed 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 *******************************************************************************/ /** * */ package org.ebayopensource.turmeric.runtime.tests.parser.objectnode; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.Iterator; import java.util.List; import javax.xml.bind.UnmarshalException; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.ebayopensource.turmeric.runtime.binding.BindingConstants; import org.ebayopensource.turmeric.runtime.binding.impl.parser.objectnode.ObjectNodeStreamReader; import org.ebayopensource.turmeric.runtime.binding.impl.parser.objectnode.StreamableObjectNodeImpl; import org.ebayopensource.turmeric.runtime.binding.objectnode.ObjectNode; import org.ebayopensource.turmeric.runtime.binding.objectnode.impl.ObjectNodeImpl; import org.ebayopensource.turmeric.runtime.common.binding.DataBindingDesc; import org.ebayopensource.turmeric.runtime.common.binding.Deserializer; import org.ebayopensource.turmeric.runtime.common.exceptions.ServiceException; import org.ebayopensource.turmeric.runtime.common.impl.binding.jaxb.xml.JAXBXMLDeserializerFactory; import org.ebayopensource.turmeric.runtime.common.impl.binding.jaxb.xml.JAXBXMLSerializerFactory; import org.ebayopensource.turmeric.runtime.common.pipeline.InboundMessage; import org.ebayopensource.turmeric.runtime.common.pipeline.MessageContext; import org.ebayopensource.turmeric.runtime.common.types.SOAConstants; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.ebayopensource.turmeric.runtime.errorlibrary.ErrorDataCollection; import org.ebayopensource.turmeric.runtime.sif.impl.internal.config.ClientConfigManager; import org.ebayopensource.turmeric.runtime.spf.impl.internal.config.ServiceConfigManager; import org.ebayopensource.turmeric.runtime.tests.binding.jaxb.BaseSerDeserTest; import org.ebayopensource.turmeric.runtime.tests.binding.jaxb.JAXBTestBuilder; import org.ebayopensource.turmeric.runtime.tests.common.util.TestUtils; import org.ebayopensource.turmeric.runtime.tests.service1.sample.types1.MyMessage; /** * @author wdeng * */ public class ObjectNodeStreamReaderTest extends BaseSerDeserTest { public ObjectNodeStreamReaderTest() { super(); } @Before public void setUpConfig() throws Exception { ClientConfigManager.getInstance().setConfigTestCase("config"); ServiceConfigManager.getInstance().setConfigTestCase("config"); } @Before public void setUpFactories() throws Exception { m_serFactory = new JAXBXMLSerializerFactory(); m_deserFactory = new JAXBXMLDeserializerFactory(); super.setUp(); } @Test public void testObjectNodeStreamReaderBasic() throws Exception { MyMessage msg = TestUtils.createTestMessage(1); msg.setError(null); DataBindingDesc xmlDbDesc = new DataBindingDesc(BindingConstants.PAYLOAD_XML, SOAConstants.MIME_XML, m_serFactory, m_deserFactory, null, null, null, null); JAXBTestBuilder jaxbtest = new JAXBTestBuilder(); jaxbtest.setTestServer(jetty); jaxbtest.setOrdered(true); jaxbtest.setSymmetricDBDesc(xmlDbDesc); jaxbtest.setSerializerFactory(m_serFactory); jaxbtest.setDeserializerFactory(m_deserFactory); MessageContext ctx = jaxbtest.createTestMessageContext(); String xml1 = jaxbtest.createOnWireString(msg); System.out.println(xml1); jaxbtest.setPayload(xml1, ctx.getEffectiveCharset()); Deserializer deser = m_deserFactory.getDeserializer(); ctx = jaxbtest.createTestMessageContext(); InboundMessage reqMsg = (InboundMessage)ctx.getRequestMessage(); XMLStreamReader rawReader = reqMsg.getXMLStreamReader(); ObjectNodeStreamReader objectNodeFactory = (ObjectNodeStreamReader) rawReader; ObjectNode node = objectNodeFactory.getObjectNode(); // Get one child Iterator<ObjectNode> childIter = node.getChildrenIterator(); ObjectNode child = childIter.next(); Assert.assertEquals("MyMessage", child.getNodeName().getLocalPart()); // Get one grand child Iterator<ObjectNode> grandChildIter = child.getChildrenIterator(); ObjectNode grandChild = grandChildIter.next(); Assert.assertEquals("body", grandChild.getNodeName().getLocalPart()); ObjectNode secondGrandChild = grandChildIter.next(); Assert.assertEquals("recipients", secondGrandChild.getNodeName().getLocalPart()); // Get one grand grand child Iterator<ObjectNode> ggChildIter = secondGrandChild.getChildrenIterator(); ObjectNode ggChild = ggChildIter.next(); Assert.assertEquals("entry", ggChild.getNodeName().getLocalPart()); if (node.hasChildNodes()) { node.getChildNodesSize(); node.cloneNode(); if (node instanceof ObjectNodeImpl) { ObjectNodeImpl oniInst = (ObjectNodeImpl) node; List<ObjectNode> childNodes = oniInst.getChildNodes(child.getNodeName()); Assert.assertTrue(childNodes.size() > 0); Assert.assertFalse("Should contain only one childNode", oniInst.hasChildNode(child.getNodeName(), Integer.MAX_VALUE)); } } MyMessage msg1 = (MyMessage) deser.deserialize(reqMsg, MyMessage.class); Assert.assertEquals(msg,msg1); } @Test public void testObjectNodeStreamReaderWOGetNodeCall() throws Exception { MyMessage msg = TestUtils.createTestMessage(1); msg.setError(null); DataBindingDesc xmlDbDesc = new DataBindingDesc(BindingConstants.PAYLOAD_XML, SOAConstants.MIME_XML, m_serFactory, m_deserFactory, null, null, null, null); JAXBTestBuilder jaxbtest = new JAXBTestBuilder(); jaxbtest.setTestServer(jetty); jaxbtest.setOrdered(true); jaxbtest.setSymmetricDBDesc(xmlDbDesc); jaxbtest.setSerializerFactory(m_serFactory); jaxbtest.setDeserializerFactory(m_deserFactory); MessageContext ctx = jaxbtest.createTestMessageContext(); String xml1 = jaxbtest.createOnWireString(msg); System.out.println(xml1); jaxbtest.setPayload(xml1, ctx.getEffectiveCharset()); Deserializer deser = m_deserFactory.getDeserializer(); ctx = jaxbtest.createTestMessageContext(); InboundMessage reqMsg = (InboundMessage)ctx.getRequestMessage(); MyMessage msg1 = (MyMessage) deser.deserialize(reqMsg, MyMessage.class); Assert.assertEquals(msg,msg1); } @Test public void testObjectNodeStreamReaderJumpOverUnbuiltNode() throws Exception { MyMessage msg = TestUtils.createTestMessage(3); msg.setError(null); DataBindingDesc xmlDbDesc = new DataBindingDesc(BindingConstants.PAYLOAD_XML, SOAConstants.MIME_XML, m_serFactory, m_deserFactory, null, null, null, null); JAXBTestBuilder jaxbtest = new JAXBTestBuilder(); jaxbtest.setTestServer(jetty); jaxbtest.setOrdered(true); jaxbtest.setSymmetricDBDesc(xmlDbDesc); jaxbtest.setSerializerFactory(m_serFactory); jaxbtest.setDeserializerFactory(m_deserFactory); MessageContext ctx = jaxbtest.createTestMessageContext(); String xml1 = jaxbtest.createOnWireString(msg); System.out.println(xml1); jaxbtest.setPayload(xml1, ctx.getEffectiveCharset()); Deserializer deser = m_deserFactory.getDeserializer(); ctx = jaxbtest.createTestMessageContext(); InboundMessage reqMsg = (InboundMessage)ctx.getRequestMessage(); XMLStreamReader rawReader = reqMsg.getXMLStreamReader(); ObjectNodeStreamReader objectNodeFactory = (ObjectNodeStreamReader) rawReader; ObjectNode node = objectNodeFactory.getObjectNode(); // Get one child Iterator<ObjectNode> childIter = node.getChildrenIterator(); ObjectNode child = childIter.next(); Assert.assertEquals("MyMessage", child.getNodeName().getLocalPart()); // Gets to recipients childIter = child.getChildrenIterator(); ObjectNode grandChild = childIter.next(); Assert.assertEquals("body", grandChild.getNodeName().getLocalPart()); ObjectNode recipients = childIter.next(); Assert.assertEquals("recipients", recipients.getNodeName().getLocalPart()); // Get first address Iterator<ObjectNode> entryIter = recipients.getChildrenIterator(); nextAddress(entryIter); // Get first address nextAddress(entryIter); MyMessage msg1 = (MyMessage) deser.deserialize(reqMsg, MyMessage.class); Assert.assertEquals(msg,msg1); } private ObjectNode nextAddress(Iterator<ObjectNode> entryIter) throws XMLStreamException { ObjectNode entry1 = entryIter.next(); Assert.assertEquals("entry", entry1.getNodeName().getLocalPart()); Iterator<ObjectNode> keyvalueIter = entry1.getChildrenIterator(); ObjectNode key1 = keyvalueIter.next(); Assert.assertEquals("key", key1.getNodeName().getLocalPart()); ObjectNode value1 = keyvalueIter.next(); Assert.assertEquals("value", value1.getNodeName().getLocalPart()); Iterator<ObjectNode> addrIter1 = value1.getChildrenIterator(); ObjectNode city = addrIter1.next(); Assert.assertEquals("city", city.getNodeName().getLocalPart()); Assert.assertEquals("San Jose", city.getNodeValue()); return value1; } @Test public void testObjectNodeStreamReaderWithExtraEndTag() throws Exception { MyMessage msg = TestUtils.createTestMessage(1); DataBindingDesc xmlDbDesc = new DataBindingDesc(BindingConstants.PAYLOAD_XML, SOAConstants.MIME_XML, m_serFactory, m_deserFactory, null, null, null, null); JAXBTestBuilder jaxbtest = new JAXBTestBuilder(); jaxbtest.setTestServer(jetty); jaxbtest.setOrdered(true); jaxbtest.setSymmetricDBDesc(xmlDbDesc); jaxbtest.setSerializerFactory(m_serFactory); jaxbtest.setDeserializerFactory(m_deserFactory); MessageContext ctx = jaxbtest.createTestMessageContext(); String xml1 = jaxbtest.createOnWireStringWithExtraEndTag(msg); System.out.println(xml1); jaxbtest.setPayload(xml1, ctx.getEffectiveCharset()); Deserializer deser = m_deserFactory.getDeserializer(); ctx = jaxbtest.createTestMessageContext(); InboundMessage reqMsg = (InboundMessage)ctx.getRequestMessage(); XMLStreamReader rawReader = reqMsg.getXMLStreamReader(); ObjectNodeStreamReader objectNodeFactory = (ObjectNodeStreamReader) rawReader; ObjectNode node = objectNodeFactory.getObjectNode(); // Get one child Iterator<ObjectNode> childIter = node.getChildrenIterator(); ObjectNode child = childIter.next(); Assert.assertEquals("MyMessage", child.getNodeName().getLocalPart()); // Get one grand child Iterator<ObjectNode> grandChildIter = child.getChildrenIterator(); ObjectNode grandChild = grandChildIter.next(); Assert.assertEquals("body", grandChild.getNodeName().getLocalPart()); ObjectNode secondGrandChild = grandChildIter.next(); Assert.assertEquals("recipients", secondGrandChild.getNodeName().getLocalPart()); // Get one grand grand child Iterator<ObjectNode> ggChildIter = secondGrandChild.getChildrenIterator(); ObjectNode ggChild = ggChildIter.next(); Assert.assertEquals("entry", ggChild.getNodeName().getLocalPart()); try { deser.deserialize(reqMsg, MyMessage.class); Assert.assertFalse(true); } catch (Exception e) { Assert.assertTrue(ServiceException.class.isAssignableFrom(e.getClass())); Throwable cause = e.getCause(); Assert.assertEquals(UnmarshalException.class.getName(), cause.getClass().getName()); } } @Test public void testObjectNodeStreamReaderWOEndTagAndGetNodeCall() throws Exception { MyMessage msg = TestUtils.createTestMessage(1); DataBindingDesc xmlDbDesc = new DataBindingDesc(BindingConstants.PAYLOAD_XML, SOAConstants.MIME_XML, m_serFactory, m_deserFactory, null, null, null, null); JAXBTestBuilder jaxbtest = new JAXBTestBuilder(); jaxbtest.setTestServer(jetty); jaxbtest.setOrdered(true); jaxbtest.setSymmetricDBDesc(xmlDbDesc); jaxbtest.setSerializerFactory(m_serFactory); jaxbtest.setDeserializerFactory(m_deserFactory); MessageContext ctx = jaxbtest.createTestMessageContext(); String xml1 = jaxbtest.createOnWireStringWithMissingEndTag(msg); System.out.println(xml1); jaxbtest.setPayload(xml1, ctx.getEffectiveCharset()); Deserializer deser = m_deserFactory.getDeserializer(); ctx = jaxbtest.createTestMessageContext(); InboundMessage reqMsg = (InboundMessage)ctx.getRequestMessage(); XMLStreamReader rawReader = reqMsg.getXMLStreamReader(); Assert.assertTrue(rawReader instanceof ObjectNodeStreamReader); MyMessage msg1 = null; try { msg1 = (MyMessage) deser.deserialize(reqMsg, MyMessage.class); Assert.assertTrue("unexpected success", false); } catch (ServiceException e) { ByteArrayOutputStream out = new ByteArrayOutputStream(); if (null != msg1) { jaxbtest.serialize(ctx, out, msg1); String xml2 = out.toString(); System.out.println(xml2); Assert.assertNotSame(xml1,xml2); } List<Throwable> errors = ctx.getWarningList(); Assert.assertTrue(errors.size()>0); Throwable t = errors.get(0); ServiceException dve = (ServiceException)t; Assert.assertEquals(ErrorDataCollection.svc_data_validation_warning.getErrorId(), dve.getErrorMessage().getError().get(0).getErrorId()); dve.localizeMessage("en-US"); System.out.println(dve.toString()); } } @Test public void testWithNullMsgWithGetNodeCall() throws Exception { MyMessage msg = null; DataBindingDesc xmlDbDesc = new DataBindingDesc(BindingConstants.PAYLOAD_XML, SOAConstants.MIME_XML, m_serFactory, m_deserFactory, null, null, null, null); JAXBTestBuilder jaxbtest = new JAXBTestBuilder(); jaxbtest.setTestServer(jetty); jaxbtest.setOrdered(true); jaxbtest.setSymmetricDBDesc(xmlDbDesc); jaxbtest.setSerializerFactory(m_serFactory); jaxbtest.setDeserializerFactory(m_deserFactory); MessageContext ctx = jaxbtest.createTestMessageContext(); String xml1 = jaxbtest.createOnWireString(msg); System.out.println(xml1); jaxbtest.setPayload(xml1, ctx.getEffectiveCharset()); Deserializer deser = m_deserFactory.getDeserializer(); ctx = jaxbtest.createTestMessageContext(); InboundMessage reqMsg = (InboundMessage)ctx.getRequestMessage(); XMLStreamReader rawReader = reqMsg.getXMLStreamReader(); ObjectNodeStreamReader objectNodeFactory = (ObjectNodeStreamReader) rawReader; ObjectNode node = objectNodeFactory.getObjectNode(); Iterator<ObjectNode> childIter = node.getChildrenIterator(); ObjectNode child = childIter.next(); ObjectNode attribute = child.getAttribute(0); Assert.assertEquals("nil", attribute.getNodeName().getLocalPart()); Assert.assertEquals("xsi", attribute.getNodeName().getPrefix()); Assert.assertEquals("true", attribute.getNodeValue()); MyMessage msg1 = (MyMessage) deser.deserialize(reqMsg, MyMessage.class); Assert.assertEquals(msg,msg1); } @Test public void testWithNullMsg() throws Exception { MyMessage msg = null; DataBindingDesc xmlDbDesc = new DataBindingDesc(BindingConstants.PAYLOAD_XML, SOAConstants.MIME_XML, m_serFactory, m_deserFactory, null, null, null, null); JAXBTestBuilder jaxbtest = new JAXBTestBuilder(); jaxbtest.setTestServer(jetty); jaxbtest.setOrdered(true); jaxbtest.setSymmetricDBDesc(xmlDbDesc); jaxbtest.setSerializerFactory(m_serFactory); jaxbtest.setDeserializerFactory(m_deserFactory); MessageContext ctx = jaxbtest.createTestMessageContext(); String xml1 = jaxbtest.createOnWireString(msg); System.out.println(xml1); jaxbtest.setPayload(xml1, ctx.getEffectiveCharset()); Deserializer deser = m_deserFactory.getDeserializer(); ctx = jaxbtest.createTestMessageContext(); InboundMessage reqMsg = (InboundMessage)ctx.getRequestMessage(); XMLStreamReader rawReader = reqMsg.getXMLStreamReader(); Assert.assertTrue(rawReader instanceof ObjectNodeStreamReader); MyMessage msg1 = (MyMessage) deser.deserialize(reqMsg, MyMessage.class); Assert.assertEquals(msg,msg1); } @Test public void testConstructAttributeNode() throws Exception { String text = "<bookstore><book category=\"web\" cover=\"paperback\">" + "<title lang=\"en\">Learning XML</title>" + "<author>Erik T. Ray</author>" + "<year>2003</year>" + "<price>39.95</price>" + "</book></bookstore>"; InputStream inStream = new ByteArrayInputStream(text.getBytes("UTF-8")); XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inStream); ObjectNodeStreamReader oNodeReader = new ObjectNodeStreamReader(xmlStreamReader); StreamableObjectNodeImpl rootNode = new StreamableObjectNodeImpl(oNodeReader); ObjectNode attribNode = rootNode.nextChild().nextChild().getAttribute(0); System.out.println("Attrib Node : " +attribNode.getNodeName()); System.out.println("Attrib Node : " +attribNode.isAttribute()); Assert.assertEquals(attribNode.getNodeName().getLocalPart(), "category"); Assert.assertTrue(attribNode.isAttribute()); } }