blob: 48a35b07c2b4589b607e5a3e1f6485fbb1eba327 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 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.mappings.xmlfragment;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.XMLUnmarshaller;
import org.eclipse.persistence.platform.xml.SAXDocumentBuilder;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.testing.oxm.OXTestCase;
/**
* Namespace qualified XMLFragmentMapping tests
*/
public class XMLFragmentNSAttributeTestCases extends OXTestCase {
private final static String XML_RESOURCE = "org/eclipse/persistence/testing/oxm/mappings/xmlfragment/employee_attribute_ns.xml";
private final static String XML_RESOURCE_DIFF_PFX = "org/eclipse/persistence/testing/oxm/mappings/xmlfragment/employee_attribute_ns_different_prefix.xml";
protected Document controlDocument;
protected XMLMarshaller xmlMarshaller;
protected XMLUnmarshaller xmlUnmarshaller;
protected XMLContext xmlContext;
public String resourceName;
protected DocumentBuilder parser;
public XMLFragmentNSAttributeTestCases(String name) throws Exception {
super(name);
setupParser();
}
protected void setupParser() {
try {
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
builderFactory.setIgnoringElementContentWhitespace(true);
parser = builderFactory.newDocumentBuilder();
} catch (Exception e) {
e.printStackTrace();
fail("An exception occurred during setup");
}
}
protected void setSession(String sessionName) {
xmlContext = getXMLContext(sessionName);
xmlMarshaller = xmlContext.createMarshaller();
xmlMarshaller.setFormattedOutput(false);
xmlUnmarshaller = xmlContext.createUnmarshaller();
}
protected void setProject(Project project) {
xmlContext = getXMLContext(project);
xmlMarshaller = xmlContext.createMarshaller();
xmlMarshaller.setFormattedOutput(false);
xmlUnmarshaller = xmlContext.createUnmarshaller();
}
protected Document getControlDocument() {
return controlDocument;
}
protected Document getWriteControlDocument() throws Exception {
return getControlDocument();
}
protected void setControlDocument(String xmlResource) throws Exception {
InputStream inputStream = ClassLoader.getSystemResourceAsStream(xmlResource);
resourceName = xmlResource;
controlDocument = parser.parse(inputStream);
removeEmptyTextNodes(controlDocument);
inputStream.close();
}
public Object getReadControlObject() {
return getControlObject();
}
public Object getWriteControlObject() {
return getControlObject();
}
protected Object getControlObject() {
Employee employee = new Employee();
employee.firstName = "Jane";
employee.lastName = "Doe";
return employee;
}
public Object getReadControlObject(String prefix, String uri) {
return getControlObject(prefix, uri);
}
public Object getWriteControlObject(String prefix, String uri) {
return getControlObject(prefix, uri);
}
protected Object getControlObject(String prefix, String uri) {
Employee emp = (Employee) getControlObject();
try {
Document doc = parser.newDocument();
Attr node = doc.createAttributeNS(uri, "attribute");
node.setValue("attributevalue");
node.setPrefix(prefix);
emp.xmlNode = node;
} catch(Exception ex) {}
return emp;
}
// ------------------------- TESTS ------------------------- //
/**
* Test NodeRecord - prefixes and uris match
*/
public void testObjectToXMLDocumentSamePrefixAndURI() throws Exception {
NamespaceResolver nsresolver = new NamespaceResolver();
nsresolver.put("ns1", "http://www.example.com/test-uri");
setProject(new XMLFragmentNSAttributeProject(nsresolver));
Document testDocument = xmlMarshaller.objectToXML(getWriteControlObject("ns1", "http://www.example.com/test-uri"));
objectToXMLDocumentTest(testDocument, XML_RESOURCE, "testObjectToXMLDocumentSamePrefixAndURI");
}
/**
* Test NodeRecord - prefixes don't match
*/
public void testObjectToXMLDocumentDifferentPrefix() throws Exception {
NamespaceResolver nsresolver = new NamespaceResolver();
nsresolver.put("ns1", "http://www.example.com/test-uri");
setProject(new XMLFragmentNSAttributeProject(nsresolver));
Document testDocument = xmlMarshaller.objectToXML(getWriteControlObject("nsx", "http://www.example.com/test-uri"));
objectToXMLDocumentTest(testDocument, XML_RESOURCE_DIFF_PFX, "testObjectToXMLDocumentDifferentPrefix");
}
/**
* Test ContentHandlerRecord - prefixes and uris match
*/
public void testObjectToContentHandlerSamePrefixAndURI() throws Exception {
setControlDocument(XML_RESOURCE);
NamespaceResolver nsresolver = new NamespaceResolver();
nsresolver.put("ns1", "http://www.example.com/test-uri");
setProject(new XMLFragmentNSAttributeProject(nsresolver));
SAXDocumentBuilder builder = new SAXDocumentBuilder();
xmlMarshaller.marshal(getWriteControlObject("ns1", "http://www.example.com/test-uri"), builder);
Document controlDocument = getWriteControlDocument();
Document testDocument = builder.getDocument();
log("\n**testObjectToContentHandlerSamePrefixAndURI**");
log("Expected:");
log(controlDocument);
log("\nActual:");
log(testDocument);
log("\n");
assertXMLIdentical(controlDocument, importNodeFix(testDocument));
}
/**
* Test ContentHandlerRecord - prefixes don't match
*/
public void testObjectToContentHandlerDifferentPrefix() throws Exception {
setControlDocument(XML_RESOURCE_DIFF_PFX);
NamespaceResolver nsresolver = new NamespaceResolver();
nsresolver.put("ns1", "http://www.example.com/test-uri");
setProject(new XMLFragmentNSAttributeProject(nsresolver));
SAXDocumentBuilder builder = new SAXDocumentBuilder();
xmlMarshaller.marshal(getWriteControlObject("nsx", "http://www.example.com/test-uri"), builder);
Document controlDocument = getWriteControlDocument();
Document testDocument = builder.getDocument();
log("\n**testObjectToContentHandlerDifferentPrefix**");
log("Expected:");
log(controlDocument);
log("\nActual:");
log(testDocument);
log("\n");
assertXMLIdentical(controlDocument, importNodeFix(testDocument));
}
/**
* Test WriterRecord - prefixes and uris match
*/
public void testObjectToXMLStringWriter() throws Exception {
NamespaceResolver nsresolver = new NamespaceResolver();
nsresolver.put("ns1", "http://www.example.com/test-uri");
setProject(new XMLFragmentNSAttributeProject(nsresolver));
StringWriter writer = new StringWriter();
xmlMarshaller.marshal(getWriteControlObject("ns1", "http://www.example.com/test-uri"), writer);
StringReader reader = new StringReader(writer.toString());
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
writer.close();
reader.close();
objectToXMLDocumentTest(testDocument, XML_RESOURCE, "testObjectToXMLStringWriter");
}
/**
* Test WriterRecord - prefixes don't match
*/
public void testObjectToXMLStringWriterDifferentPrefix() throws Exception {
NamespaceResolver nsresolver = new NamespaceResolver();
nsresolver.put("ns1", "http://www.example.com/test-uri");
setProject(new XMLFragmentNSAttributeProject(nsresolver));
StringWriter writer = new StringWriter();
xmlMarshaller.marshal(getWriteControlObject("nsx", "http://www.example.com/test-uri"), writer);
StringReader reader = new StringReader(writer.toString());
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
writer.close();
reader.close();
objectToXMLDocumentTest(testDocument, XML_RESOURCE_DIFF_PFX, "testObjectToXMLStringWriterDifferentPrefix");
}
/**
* Test FormattedWriterRecord - prefixes and uris match
*/
public void testObjectToFormattedXMLStringWriter() throws Exception {
NamespaceResolver nsresolver = new NamespaceResolver();
nsresolver.put("ns1", "http://www.example.com/test-uri");
setProject(new XMLFragmentNSAttributeProject(nsresolver));
StringWriter writer = new StringWriter();
xmlMarshaller.setFormattedOutput(true);
xmlMarshaller.marshal(getWriteControlObject("ns1", "http://www.example.com/test-uri"), writer);
StringReader reader = new StringReader(writer.toString());
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
writer.close();
reader.close();
InputStream inputStream = ClassLoader.getSystemResourceAsStream(XML_RESOURCE);
Document xdoc = parser.parse(inputStream);
inputStream.close();
log("\n**testObjectToFormattedXMLStringWriter**");
log("Expected:");
log(xdoc);
log("\nActual:");
log(testDocument);
log("\n");
assertXMLIdentical(xdoc, importNodeFix(testDocument));
}
/**
* Test FormattedWriterRecord - prefixes don't match
*/
public void testObjectToFormattedXMLStringWriterDifferentPrefix() throws Exception {
NamespaceResolver nsresolver = new NamespaceResolver();
nsresolver.put("ns1", "http://www.example.com/test-uri");
setProject(new XMLFragmentNSAttributeProject(nsresolver));
StringWriter writer = new StringWriter();
xmlMarshaller.setFormattedOutput(true);
xmlMarshaller.marshal(getWriteControlObject("nsx", "http://www.example.com/test-uri"), writer);
StringReader reader = new StringReader(writer.toString());
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
writer.close();
reader.close();
InputStream inputStream = ClassLoader.getSystemResourceAsStream(XML_RESOURCE_DIFF_PFX);
Document xdoc = parser.parse(inputStream);
inputStream.close();
log("\n**testObjectToFormattedXMLStringWriterDifferentPrefix**");
log("Expected:");
log(xdoc);
log("\nActual:");
log(testDocument);
log("\n");
assertXMLIdentical(xdoc, importNodeFix(testDocument));
}
// ------------------ CONVENIENCE METHODS ------------------ //
protected void objectToXMLDocumentTest(Document testDocument, String resource, String testCase) throws Exception {
setControlDocument(resource);
log("\n**"+testCase+"**");
log("Expected:");
log(getWriteControlDocument());
log("\nActual:");
log(testDocument);
log("\n");
assertXMLIdentical(getWriteControlDocument(), importNodeFix(testDocument));
}
protected void xmlToObjectTest(Object testObject) throws Exception {
log("\n**xmlToObjectTest**");
log("Expected:");
log(getReadControlObject().toString());
log("Actual:");
log(testObject.toString());
log("\n");
assertEquals(getReadControlObject(), testObject);
}
protected Document importNodeFix(Document testDocument) {
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(testDocument), new StreamResult(writer));
StringReader reader = new StringReader(writer.toString());
testDocument = parser.parse(new InputSource(reader));
writer.close();
reader.close();
} catch (Exception x) {}
return testDocument;
}
}