blob: 1174455dbad077ec6c5f53aa1cbc47abc521a3d2 [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;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Constructor;
import java.util.Collection;
import java.util.Iterator;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.exceptions.ValidationException;
import org.eclipse.persistence.internal.helper.ConversionManager;
import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.oxm.XMLLogin;
import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.platform.DOMPlatform;
import org.eclipse.persistence.oxm.platform.SAXPlatform;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
import org.eclipse.persistence.internal.sessions.factories.MissingDescriptorListener;
import org.eclipse.persistence.internal.sessions.factories.ObjectPersistenceRuntimeXMLProject_11_1_1;
import org.eclipse.persistence.sessions.factories.SessionManager;
import org.eclipse.persistence.sessions.factories.XMLProjectReader;
import org.eclipse.persistence.sessions.factories.XMLProjectWriter;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public abstract class OXTestCase extends XMLTestCase {
protected static XMLInputFactory XML_INPUT_FACTORY;
protected static XMLOutputFactory XML_OUTPUT_FACTORY;
protected static Class staxResultClass;
protected static String staxResultClassName = "javax.xml.transform.stax.StAXResult";
protected static Class staxSourceClass;
protected static String staxSourceClassName = "javax.xml.transform.stax.StAXSource";
protected static Constructor staxResultStreamWriterConstructor;
protected static Constructor staxResultEventWriterConstructor;
protected static Constructor staxSourceStreamReaderConstructor;
protected static Constructor staxSourceEventReaderConstructor;
static {
try {
XML_INPUT_FACTORY = XMLInputFactory.newInstance();
XML_OUTPUT_FACTORY = XMLOutputFactory.newInstance();
} catch(javax.xml.stream.FactoryConfigurationError error){
XML_INPUT_FACTORY = null;
XML_OUTPUT_FACTORY = null;
}
try {
staxResultClass = PrivilegedAccessHelper.getClassForName(staxResultClassName);
staxResultStreamWriterConstructor = PrivilegedAccessHelper.getConstructorFor(staxResultClass, new Class[]{XMLStreamWriter.class}, true);
staxResultEventWriterConstructor = PrivilegedAccessHelper.getConstructorFor(staxResultClass, new Class[]{XMLEventWriter.class}, true);
} catch(Exception ex) {
staxResultClass = null;
}
try {
staxSourceClass = PrivilegedAccessHelper.getClassForName(staxSourceClassName);
staxSourceStreamReaderConstructor = PrivilegedAccessHelper.getConstructorFor(staxSourceClass, new Class[]{XMLStreamReader.class}, true);
staxSourceEventReaderConstructor = PrivilegedAccessHelper.getConstructorFor(staxSourceClass, new Class[]{XMLEventReader.class}, true);
} catch(Exception ex) {
staxSourceClass = null;
}
}
public boolean useLogging = false;
public static enum Platform { DOM, SAX, DOC_PRES };
public static enum Metadata { JAVA, XML_TOPLINK, XML_ECLIPSELINK };
public static Platform platform;;
public static Metadata metadata;
// Constants
public static final String PLATFORM_KEY = "platformType";
public static final String PLATFORM_DOM = "DOM";
public static final String PLATFORM_DOC_PRES = "DOC_PRES";
public static final String PLATFORM_SAX = "SAX";
public static final String METADATA_KEY = "metadataType";
public static final String METADATA_JAVA = "JAVA";
public static final String METADATA_TOPLINK = "XML_TOPLINK";
public static final String METADATA_XML_ECLIPSELINK = "XML_ECLIPSELINK";
public OXTestCase(String name) {
super(name);
useLogging = Boolean.getBoolean("useLogging");
platform = getPlatform();
metadata = getMetadata();
}
public XMLContext getXMLContext(String name) {
Session session = SessionManager.getManager().getSession(name, false);
Project project = session.getProject();
return getXMLContext(project);
}
public XMLContext getXMLContext(Project project) {
if (platform == Platform.DOC_PRES) {
Collection<ClassDescriptor> descriptors = project.getDescriptors().values();
Iterator<ClassDescriptor> iter = descriptors.iterator();
while (iter.hasNext()) {
ClassDescriptor nextDesc = iter.next();
if (nextDesc instanceof org.eclipse.persistence.oxm.XMLDescriptor) {
((org.eclipse.persistence.oxm.XMLDescriptor)nextDesc).setShouldPreserveDocument(true);
}
}
}
Project newProject = this.getNewProject(project, null);
return new XMLContext(newProject);
}
public XMLContext getXMLContext(Project project, ClassLoader classLoader) {
ConversionManager.getDefaultManager().setLoader(classLoader);
Project newProject = this.getNewProject(project, classLoader);
newProject.getDatasourceLogin().getDatasourcePlatform().getConversionManager().setLoader(classLoader);
return new XMLContext(newProject);
}
public Project getNewProject(Project originalProject) {
return getNewProject(originalProject, null);
}
public Project getNewProject(Project originalProject, ClassLoader classLoader) {
Project newProject = originalProject;
switch (metadata) {
case JAVA:
break;
default:
try {
// Write the deployment XML file to deploymentXML-file.xml
String fileName = "deploymentXML-file.xml";
FileWriter fWriter = new FileWriter(fileName);
write(originalProject, fWriter);
fWriter.close();
// Also write the deployment XML file to a stringwriter for logging
if (useLogging) {
StringWriter stringWriter = new StringWriter();
write(originalProject, stringWriter);
log("DEPLOYMENT XML " + stringWriter.toString());
}
// Read the deploymentXML-file.xml back in with XMLProjectReader
FileInputStream inStream = new FileInputStream(fileName);
FileReader fileReader = new FileReader(fileName);
newProject = XMLProjectReader.read(fileReader, classLoader);
inStream.close();
fileReader.close();
File f = new File(fileName);
f.delete();
} catch (Exception e) {
e.printStackTrace();
StringWriter stringWriter = new StringWriter();
write(originalProject, stringWriter);
StringReader reader = new StringReader(stringWriter.toString());
log("DEPLOYMENT XML" + stringWriter.toString());
newProject = XMLProjectReader.read(reader, classLoader);
}
}
if ((newProject.getDatasourceLogin() == null) || (!(newProject.getDatasourceLogin() instanceof XMLLogin))) {
newProject.setDatasourceLogin(new XMLLogin());
}
switch (platform) {
case SAX:
newProject.getDatasourceLogin().setPlatform(new SAXPlatform());
break;
default:
newProject.getDatasourceLogin().setPlatform(new DOMPlatform());
}
return newProject;
}
protected void log(Document document) {
if (!useLogging) {
return;
}
try {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void log(String string) {
if (useLogging) {
System.out.println(string);
}
}
protected void log(byte[] bytes) {
if (useLogging) {
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i]);
}
}
}
@Override
public String getName() {
String longClassName = this.getClass().getName();
String shortClassName = longClassName.substring(longClassName.lastIndexOf(".") + 1, longClassName.length() - 1);
String description = "";
switch (metadata) {
case XML_ECLIPSELINK:
description = "Deployment XML w/";
break;
case XML_TOPLINK:
description = "TL Deployment XML w/";
break;
default:
description = "Java Project Source w/";
}
switch (platform) {
case DOC_PRES:
description += "Doc Pres: ";
break;
case DOM:
description += "DOM Parsing: ";
break;
default:
description += "SAX Parsing: ";
}
return description + shortClassName + ": " + super.getName();
}
public static void removeEmptyTextNodes(Node node) {
NodeList nodeList = node.getChildNodes();
Node childNode;
for (int x = nodeList.getLength() - 1; x >= 0; x--) {
childNode = nodeList.item(x);
if (childNode.getNodeType() == Node.TEXT_NODE) {
if (childNode.getNodeValue().trim().equals("")) {
node.removeChild(childNode);
}
} else if (childNode.getNodeType() == Node.ELEMENT_NODE) {
removeEmptyTextNodes(childNode);
}
}
}
public static String removeWhiteSpaceFromString(String s) {
String returnString = s.replaceAll(" ", "");
returnString = returnString.replaceAll("\n", "");
returnString = returnString.replaceAll("\t", "");
returnString = returnString.replaceAll("\r", "");
return returnString;
}
/**
* Return the Platform to be used based on the "platformType"
* System property
*
* @see Platform
*/
public Platform getPlatform() {
String platformStr = System.getProperty(PLATFORM_KEY, PLATFORM_SAX);
if (platformStr.equals(PLATFORM_SAX)) {
return Platform.SAX;
}
if (platformStr.equals(PLATFORM_DOM)) {
return Platform.DOM;
}
return Platform.DOC_PRES;
}
/**
* Return the Metadata type based on the "metadataType"
* System property
*
* @see Metadata
*/
public Metadata getMetadata() {
String metadataStr = System.getProperty(METADATA_KEY, METADATA_JAVA);
if (metadataStr.equals(METADATA_JAVA)) {
return Metadata.JAVA;
}
if (metadataStr.equals(METADATA_XML_ECLIPSELINK)) {
return Metadata.XML_ECLIPSELINK;
}
return Metadata.XML_TOPLINK;
}
// Write out deployment XML
public void write(Project project, Writer writer) {
// Write out EclipseLink deployment XML
if (metadata == Metadata.XML_ECLIPSELINK) {
XMLProjectWriter.write(project, writer);
return;
}
// Write out TL deployment XML
XMLContext context = new XMLContext(new ObjectPersistenceRuntimeXMLProject_11_1_1());
context.getSession(project).getEventManager().addListener(new MissingDescriptorListener());
XMLMarshaller marshaller = context.createMarshaller();
marshaller.marshal(project, writer);
try {
writer.flush();
} catch (IOException exception) {
throw ValidationException.fileError(exception);
}
}
protected String loadFileToString(String fileName){
StringBuffer sb = new StringBuffer();
String lineSep = System.getProperty("line.separator");
try {
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str;
//Don't add teh lineSep the first time
if(bufferedReader.ready()){
sb.append(bufferedReader.readLine());
}
while (bufferedReader.ready()) {
sb.append(lineSep);
sb.append(bufferedReader.readLine());
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
fail();
}
return sb.toString();
}
}