blob: 33775a2a432b5a05141bc72f0b3459385a81e133 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.oxm.xmlmarshaller;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;
import junit.framework.TestCase;
import org.eclipse.persistence.exceptions.XMLMarshalException;
import org.eclipse.persistence.oxm.CharacterEscapeHandler;
import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.record.FormattedOutputStreamRecord;
import org.eclipse.persistence.platform.xml.SAXDocumentBuilder;
import org.eclipse.persistence.testing.oxm.OXTestCase;
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.DocumentType;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.Node;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import junit.textui.TestRunner;
/**
* Test marshalling the control object to each of the possible outputs
* Test attempting to marshal an unmapped object and an object which can not be a root element
*/
public class XMLMarshalTestCases extends OXTestCase {
private static final String tmpdir = System.getenv("T_WORK") == null
? System.getProperty("java.io.tmpdir") : System.getenv("T_WORK");
private final static int CONTROL_EMPLOYEE_ID = 123;
private final static String CONTROL_EMAIL_ADDRESS_USER_ID = "jane.doe";
private final static String CONTROL_EMAIL_ADDRESS_DOMAIN = "example.com";
private final static String XML_RESOURCE = "org/eclipse/persistence/testing/oxm/xmlmarshaller/Employee.xml";
private final static String MARSHAL_TO_NODE_RESOURCE = "org/eclipse/persistence/testing/oxm/xmlmarshaller/MarshalToNode.xml";
private final static String MARSHAL_TO_NODE_NS_RESOURCE = "org/eclipse/persistence/testing/oxm/xmlmarshaller/MarshalToNodeNS.xml";
private final static String MARSHAL_NON_ROOT_OBJECT_TO_NODE = "org/eclipse/persistence/testing/oxm/xmlmarshaller/MarshalNonRootObjectToNode.xml";
private Object controlObject;
private Document controlDocument;
private DocumentBuilder parser;
private XMLMarshaller marshaller;
private XMLContext context;
public XMLMarshalTestCases(String name) {
super(name);
}
public static void main(String[] args) {
String[] arguments = { "-c", "org.eclipse.persistence.testing.oxm.xmlmarshaller.XMLMarshalTestCases" };
TestRunner.main(arguments);
}
@Override
public void setUp() throws Exception {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
builderFactory.setIgnoringElementContentWhitespace(true);
parser = builderFactory.newDocumentBuilder();
context = getXMLContext(new XMLMarshallerTestProject());
marshaller = context.createMarshaller();
controlObject = setupControlObject();
controlDocument = setupControlDocument(XML_RESOURCE);
}
protected Document setupControlDocument(String xmlResource) throws Exception {
InputStream inputStream = ClassLoader.getSystemResourceAsStream(xmlResource);
Document document = parser.parse(inputStream);
removeEmptyTextNodes(document);
return document;
}
protected Employee setupControlObject() {
Employee employee = new Employee();
employee.setID(CONTROL_EMPLOYEE_ID);
EmailAddress emailAddress = new EmailAddress();
emailAddress.setUserID(CONTROL_EMAIL_ADDRESS_USER_ID);
emailAddress.setDomain(CONTROL_EMAIL_ADDRESS_DOMAIN);
employee.setEmailAddress(emailAddress);
return employee;
}
public void testMarshalObjectToWriterNoNamespace() throws Exception {
StringWriter writer = new StringWriter();
marshaller.setNoNamespaceSchemaLocation("sessions_10_0_3.xsd");
marshaller.marshal(controlObject, writer);
StringReader reader = new StringReader(writer.toString());
InputSource inputSource = new InputSource(reader);
parser.parse(inputSource);
}
public void testMarshalObjectToWriterSchemaLocation() throws Exception {
StringWriter writer = new StringWriter();
marshaller.setSchemaLocation("sessions_10_0_3.xsd");
marshaller.marshal(controlObject, writer);
StringReader reader = new StringReader(writer.toString());
InputSource inputSource = new InputSource(reader);
parser.parse(inputSource);
}
public void testMarshalObjectToWriter() throws Exception {
StringWriter writer = new StringWriter();
marshaller.marshal(controlObject, writer);
StringReader reader = new StringReader(writer.toString());
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
log(testDocument);
removeEmptyTextNodes(testDocument);
assertXMLIdentical(controlDocument, testDocument);
}
public void testMarshalObjectToElement() throws Exception {
Document marshalToNodeControl = setupControlDocument(MARSHAL_TO_NODE_RESOURCE);
Document document = parser.newDocument();
Element element = document.createElement("root");
marshaller.marshal(controlObject, element);
document.appendChild(element);
log(marshalToNodeControl);
log(document);
assertXMLIdentical(marshalToNodeControl, document);
}
public void testMarshalObjectToDocument() {
Document document = parser.newDocument();
marshaller.marshal(controlObject, document);
log(controlDocument);
log(document);
assertXMLIdentical(controlDocument, document);
}
public void testMarshalObjectToDocumentFragment() throws Exception {
Document marshalToNodeControl = setupControlDocument(MARSHAL_TO_NODE_RESOURCE);
Document document = parser.newDocument();
Element rootElement = document.createElement("root");
document.appendChild(rootElement);
DocumentFragment documentFragment = document.createDocumentFragment();
marshaller.marshal(controlObject, documentFragment);
rootElement.appendChild(documentFragment);
log(marshalToNodeControl);
log(document);
assertXMLIdentical(marshalToNodeControl, document);
}
public void testMarshalObjectToAttr() {
Document document = parser.newDocument();
Attr attr = document.createAttribute("name");
try {
marshaller.marshal(controlObject, attr);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.MARSHAL_EXCEPTION);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToCDATASection() {
Document document = parser.newDocument();
CDATASection cdataSection = document.createCDATASection("name");
try {
marshaller.marshal(controlObject, cdataSection);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.MARSHAL_EXCEPTION);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToComment() {
Document document = parser.newDocument();
Comment comment = document.createComment("name");
try {
marshaller.marshal(controlObject, comment);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.MARSHAL_EXCEPTION);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToDocumentType() {
DOMImplementation domImplementation = parser.getDOMImplementation();
DocumentType documentType = domImplementation.createDocumentType("A", "B", "C");
try {
marshaller.marshal(controlObject, documentType);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.MARSHAL_EXCEPTION);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToEntity() {
}
public void testMarshalObjectToEntityReference() {
Document document = parser.newDocument();
EntityReference entityReference = document.createEntityReference("name");
try {
marshaller.marshal(controlObject, entityReference);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.MARSHAL_EXCEPTION);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToNotation() {
}
public void testMarshalObjectToProcessingInstruction() {
Document document = parser.newDocument();
ProcessingInstruction processingInstruction = document.createProcessingInstruction("target", "data");
try {
marshaller.marshal(controlObject, processingInstruction);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.MARSHAL_EXCEPTION);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToText() {
Document document = parser.newDocument();
Text text = document.createTextNode("name");
try {
marshaller.marshal(controlObject, text);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.MARSHAL_EXCEPTION);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToOutputStream() throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
marshaller.marshal(controlObject, outStream);
StringReader reader = new StringReader(outStream.toString());
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
removeEmptyTextNodes(testDocument);
log(controlDocument);
log(testDocument);
assertXMLIdentical(controlDocument, testDocument);
}
public void testMarshalObjectToDOMResult() {
Document document = parser.newDocument();
DOMResult result = new DOMResult(document);
marshaller.marshal(controlObject, result);
log(controlDocument);
log(document);
assertXMLIdentical(controlDocument, document);
}
/**
* Tests marshalling to DOMResult with null node.
*/
public void testMarshalObjectToEmptyDOMResult() {
DOMResult result = new DOMResult();
marshaller.marshal(controlObject, result);
Document document = (Document) result.getNode();
log(controlDocument);
log(document);
assertXMLIdentical(controlDocument, document);
}
public void testMarshalObjectToSAXResult() {
SAXDocumentBuilder builder = new SAXDocumentBuilder();
SAXResult result = new SAXResult(builder);
marshaller.marshal(controlObject, result);
log(controlDocument);
log(builder.getDocument());
assertXMLIdentical(controlDocument, builder.getDocument());
}
public void testMarshalObjectToStreamResult() throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(outStream);
marshaller.marshal(controlObject, result);
StringReader reader = new StringReader(outStream.toString());
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
removeEmptyTextNodes(testDocument);
log(controlDocument);
log(testDocument);
assertXMLIdentical(controlDocument, testDocument);
}
public void testMarshalObjectToStreamResult2() throws Exception {
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
marshaller.marshal(controlObject, result);
StringReader reader = new StringReader(writer.toString());
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
removeEmptyTextNodes(testDocument);
log(controlDocument);
log(testDocument);
assertXMLIdentical(controlDocument, testDocument);
}
public void testMarshalObjectToStreamResult3() throws Exception {
File file = getOutputlog();
StreamResult result = new StreamResult(file);
marshaller.marshal(controlObject, result);
FileReader reader = new FileReader(file);
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
removeEmptyTextNodes(testDocument);
log(controlDocument);
log(testDocument);
assertXMLIdentical(controlDocument, testDocument);
}
public void testMarshalObjectToStreamResult4() throws Exception {
File file = getOutputlog();
StreamResult result = new StreamResult(file.toURI().toURL().toString());
marshaller.marshal(controlObject, result);
FileReader reader = new FileReader(file);
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
removeEmptyTextNodes(testDocument);
log(controlDocument);
log(testDocument);
assertXMLIdentical(controlDocument, testDocument);
}
public void testMarshalObjectToContentHandler() {
SAXDocumentBuilder builder = new SAXDocumentBuilder();
marshaller.marshal(controlObject, builder);
log(controlDocument);
log(builder.getDocument());
assertXMLIdentical(controlDocument, builder.getDocument());
}
public void testMarshalNonRootObjectToNode() throws Exception {
Document testDocument = parser.newDocument();
Element rootElement = testDocument.createElement("root");
testDocument.appendChild(rootElement);
EmailAddress emailAddress = new EmailAddress();
emailAddress.setDomain("domain");
emailAddress.setUserID("user");
marshaller.marshal(emailAddress, rootElement);
Document controlDocument = setupControlDocument(MARSHAL_NON_ROOT_OBJECT_TO_NODE);
assertXMLIdentical(controlDocument, testDocument);
}
/**
* We should throw an exception if users try to marshal an object which is
* not an element that has a defaultrootelement specified on its descriptor
*/
public void testMarshalNonRootObjectToWriter() {
StringWriter writer = new StringWriter();
EmailAddress emailAddress = new EmailAddress();
emailAddress.setDomain("domain");
emailAddress.setUserID("user");
marshaller.setFormattedOutput(false);
marshaller.setFragment(true);
marshaller.marshal(emailAddress, writer);
assertEquals("<user-id>user</user-id><domain>domain</domain>", writer.toString());
}
/**
* Test for custom CharacterEscapeHandler and FormattedOutputStreamRecord with custom ByteArrayOutputStream output.
*/
public void testMarshalWithCharacterEscapeHandlerToFormattedOutputStreamRecord() {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
FormattedOutputStreamRecord record = new FormattedOutputStreamRecord();
record.setOutputStream(byteArrayOutputStream);
EmailAddress emailAddress = new EmailAddress();
emailAddress.setDomain("%domain%%%");
emailAddress.setUserID("%user%%%");
marshaller.setFormattedOutput(false);
marshaller.setFragment(true);
CharacterEscapeHandler characterEscapeHandler = new CustomCharacterEscapeHandler();
marshaller.setCharacterEscapeHandler(characterEscapeHandler);
marshaller.marshal(emailAddress, record);
assertEquals("<user-id>*user***</user-id><domain>*domain***</domain>", removeWhiteSpaceFromString(byteArrayOutputStream.toString()));
}
//Null Test Cases=========================================================================================
public void testMarshalObjectToNullContentHandler() {
SAXDocumentBuilder output = null;
try {
marshaller.marshal(controlObject, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalNullObjectToContentHandler() {
SAXDocumentBuilder output = new SAXDocumentBuilder();
try {
marshaller.marshal(null, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToNullNode() {
Node output = null;
try {
marshaller.marshal(controlObject, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalNullObjectToNode() {
Node output = parser.newDocument();
try {
marshaller.marshal(null, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToNullOutputStream() {
OutputStream output = null;
try {
marshaller.marshal(controlObject, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalNullObjectToOutputStream() {
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
marshaller.marshal(null, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToNullResult() {
DOMResult output = null;
try {
marshaller.marshal(controlObject, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalNullObjectToResult() {
DOMResult output = new DOMResult(parser.newDocument());
try {
marshaller.marshal(null, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalObjectToNullWriter() {
Writer output = null;
try {
marshaller.marshal(controlObject, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalNullObjectToWriter() {
StringWriter output = new StringWriter();
try {
marshaller.marshal(null, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NULL_ARGUMENT);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalWithNoNamespaceResolver() {
XMLDescriptor descriptor = ((XMLDescriptor)context.getSession(0).getProject().getDescriptor(Employee.class));
String rootElement = descriptor.getDefaultRootElement();
descriptor.setDefaultRootElement("thens:" + rootElement);
DefaultHandler output = new DefaultHandler();
try {
marshaller.marshal(controlObject, output);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NAMESPACE_RESOLVER_NOT_SPECIFIED);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
public void testMarshalToElementWithNoNamespaceResolver() {
XMLDescriptor descriptor = ((XMLDescriptor)context.getSession(0).getProject().getDescriptor(Employee.class));
String rootElement = descriptor.getDefaultRootElement();
descriptor.setDefaultRootElement("thens:" + rootElement);
try {
Document document = parser.newDocument();
Element element = document.createElement("root");
document.appendChild(element);
marshaller.marshal(controlObject, element);
} catch (XMLMarshalException exception) {
assertTrue("An unexpected XMLMarshalException was caught.", exception.getErrorCode() == XMLMarshalException.NAMESPACE_RESOLVER_NOT_SPECIFIED);
return;
}
assertTrue("An XMLValidation should have been caught but wasn't.", false);
}
private File getOutputlog() {
return new File(tmpdir, "output.txt");
}
}