blob: a9184220c9375336fa3b9948e4f7a960b95d7166 [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.sdo.helper.xmlhelper.loadandsave;
import commonj.sdo.Type;
import commonj.sdo.helper.XMLDocument;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.testing.sdo.helper.xmlhelper.SDOXMLHelperTestCases;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDOType;
import org.eclipse.persistence.sdo.helper.SDOXMLHelper;
import org.eclipse.persistence.sdo.helper.extension.SDOUtil;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
public abstract class LoadAndSaveWithOptionsTestCases extends SDOXMLHelperTestCases {
public LoadAndSaveWithOptionsTestCases(String name) {
super(name);
}
protected String getNoSchemaControlFileName() {
return getControlFileName();
}
protected String getNoSchemaControlWriteFileName() {
return getNoSchemaControlFileName();
}
protected String getControlDataObjectFileName() {
return getControlWriteFileName();
}
protected String getUnrelatedSchemaName() {
return "./org/eclipse/persistence/testing/sdo/helper/xmlhelper/PurchaseOrder.xsd";
}
abstract protected String getSchemaName();
abstract protected String getControlFileName();
abstract protected void registerTypes();
abstract protected String getControlRootName();
protected String getControlWriteFileName() {
return getControlFileName();
}
protected String getControlRootURI() {
return NON_DEFAULT_URI;
}
public String getFullClassPackageName(Type aType) {
StringBuffer className = new StringBuffer(SDOUtil.getPackageNameFromURI(aType.getURI()));
className.append(SDOConstants.JAVA_PACKAGE_NAME_SEPARATOR);
className.append(aType.getName().substring(0,1).toUpperCase());
className.append(aType.getName().substring(1));
return className.toString();
}
public void verifyPackageNameGeneratedFromURI(String uri, String typeName) {
Type aType = typeHelper.getType(uri, typeName);
String className = ((SDOType)aType).getInstanceClassName();
String mangledClassName = getFullClassPackageName(aType);
assertEquals(mangledClassName, className);
}
// Override package generation based on the JAXB 2.0 algorithm in SDOUtil.java
protected List<String> getPackages() {
List<String> packages = new ArrayList<String>();
packages.add(NON_DEFAULT_JAVA_PACKAGE_DIR);
return packages;
}
public void testLoadFromInputStreamSaveDocumentToOutputStream() throws Exception {
defineTypes();
FileInputStream inputStream = new FileInputStream(getControlFileName());
XMLDocument document = xmlHelper.load(inputStream, null, getOptions());
verifyAfterLoad(document);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
xmlHelper.save(document, outputStream, null);
compareXML(getControlWriteFileName(), outputStream.toString());
}
//
public void testNoSchemaLoadFromInputStreamSaveDataObjectToString() throws Exception {
registerTypes();
FileInputStream inputStream = new FileInputStream(getNoSchemaControlFileName());
XMLDocument document = xmlHelper.load(inputStream, null, getOptions());
verifyAfterLoad(document);
StringWriter writer = new StringWriter();
xmlHelper.save(document, writer, null);
// Nodes will not be the same but XML output is
compareXML(getNoSchemaControlWriteFileName(), writer.toString());//, false);
}
//
public void testLoadFromInputStreamWithURIAndOptionsSaveDataObjectToOutputStream() throws Exception {
defineTypes();
FileInputStream inputStream = new FileInputStream(getControlFileName());
XMLDocument document = xmlHelper.load(inputStream, null, getOptions());// xsi:type will be written out
verifyAfterLoad(document);
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
xmlHelper.save(document.getRootObject(), getControlRootURI(), getControlRootName(), outstream);
compareXML(getControlDataObjectFileName(), outstream.toString());
}
//
// xpaths/doms null
public void testLoadFromFileReaderWithURIAndOptionsStreamSaveDataObjectToWriter() throws Exception {
defineTypes();
FileReader reader = new FileReader(getControlFileName());
XMLDocument document = xmlHelper.load(reader, null, getOptions());
verifyAfterLoad(document);
String s = xmlHelper.save(document.getRootObject(), getControlRootURI(), getControlRootName());
compareXML(getControlDataObjectFileName(), s);
}
// okay except will set isDirty=true which will clear marshalledObject in xmlMarshaller
public void testLoadFromAndSaveAfterDefineMultipleSchemas() throws Exception {
defineTypes();
xsdHelper.define(getSchema(getUnrelatedSchemaName()));
FileInputStream inputStream = new FileInputStream(getControlFileName());
XMLDocument document = xmlHelper.load(inputStream, null, getOptions());// xsi:type will be written out
verifyAfterLoad(document);
String s = xmlHelper.save(document.getRootObject(), getControlRootURI(), getControlRootName());
compareXML(getControlDataObjectFileName(), s);
}
public void testLoadFromInputStreamWithURIAndOptionsSaveDataObjectToStreamResult() throws Exception {
DocumentBuilderFactory factory;
DocumentBuilder builder;
Document document1 = null;
//DOMSource source = null;
defineTypes();
factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);
builder = factory.newDocumentBuilder();
document1 = builder.parse(new File(getControlFileName()));
document1.toString();
//source = new DOMSource(document1);
XMLDocument document = xmlHelper.load(new FileInputStream(getControlFileName()), null, getOptions());
verifyAfterLoad(document);
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(outstream);
xmlHelper.save(document, result, null);
compareXML(getControlWriteFileName(), result.getOutputStream().toString());
}
public void testLoadFromDomSourceWithURIAndOptionsSaveDataObjectToStreamResult() throws Exception {
DocumentBuilderFactory factory;
DocumentBuilder builder;
Document document1 = null;
DOMSource source = null;
defineTypes();
factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);
builder = factory.newDocumentBuilder();
document1 = builder.parse(new File(getControlFileName()));
source = new DOMSource(document1);
XMLDocument document = xmlHelper.load(source, null, getOptions());
verifyAfterLoad(document);
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(outstream);
xmlHelper.save(document, result, null);
compareXML(getControlWriteFileName(), result.getOutputStream().toString());
}
public void testLoadFromSAXSourceWithURIAndOptionsSaveDataObjectToStreamResult() throws Exception {
SAXSource source = null;
defineTypes();
FileInputStream inputStream = new FileInputStream(getControlFileName());
source = new SAXSource(new InputSource(inputStream));
XMLDocument document = xmlHelper.load(source, null, getOptions());
verifyAfterLoad(document);
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(outstream);
xmlHelper.save(document, result, null);
compareXML(getControlWriteFileName(), result.getOutputStream().toString());
}
public void testLoadFromStreamSourceWithURIAndOptionsSaveDataObjectToStreamResult() throws Exception {
StreamSource source = null;
defineTypes();
FileInputStream inputStream = new FileInputStream(getControlFileName());
source = new StreamSource(inputStream);
XMLDocument document = xmlHelper.load(source, null, getOptions());
verifyAfterLoad(document);
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(outstream);
xmlHelper.save(document, result, null);
compareXML(getControlWriteFileName(), result.getOutputStream().toString());
}
protected void compareXML(String controlFileName, String testString) throws Exception {
compareXML(controlFileName, testString, true);
}
protected void compareXML(String controlFileName, String testString, boolean compareNodes) throws Exception {
String controlString = removeCopyrightFromString(getControlString(controlFileName));
log("Expected:" + controlString);
log("Actual :" + testString);
StringReader reader = new StringReader(testString);
InputSource inputSource = new InputSource(reader);
Document testDocument = parser.parse(inputSource);
reader.close();
if (compareNodes) {
Document controlDocument = getDocument(controlFileName);
removeCopyrightNode(controlDocument);
assertXMLIdentical(controlDocument, testDocument);
}
}
protected String getControlString(String fileName) {
try {
FileInputStream inputStream = new FileInputStream(fileName);
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
return new String(bytes);
} catch (Exception e) {
e.printStackTrace();
fail("An error occurred loading the control document");
return null;
}
}
protected void verifyAfterLoad(XMLDocument document) {
assertNotNull(document);
assertNotNull(document.getRootObject());
assertNull(document.getRootObject().getContainer());
}
protected List defineTypes() {
return xsdHelper.define(getSchema(getSchemaName()));
}
protected String getSchemaLocation() {
return "";
}
protected Object getOptions() {
return null;
}
}