blob: 7b1d527bdadad72952e5ff05044fa9cce02370d4 [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
*/
package org.eclipse.persistence.testing.jaxb.jaxbcontext;
import java.io.InputStream;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.*;
import jakarta.xml.bind.*;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.persistence.exceptions.SessionLoaderException;
import org.eclipse.persistence.exceptions.ValidationException;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.jaxb.TypeMappingInfo;
import org.eclipse.persistence.jaxb.javamodel.reflection.JavaClassImpl;
import org.eclipse.persistence.testing.oxm.classloader.JARClassLoader;
import org.w3c.dom.Document;
public class JaxbContextCreationTests extends junit.framework.TestCase {
@Override
public String getName() {
return "JAXB Context Creation Tests: " + super.getName();
}
public void testCreateContextWithObjectFactory() throws Exception {
JAXBContext context = JAXBContextFactory.createContext("org.eclipse.persistence.testing.jaxb.jaxbcontext", Thread.currentThread().getContextClassLoader());
}
public void testCreateContextNoClassesOrSessions() throws Exception {
try {
JAXBContext context = JAXBContextFactory.createContext("org.eclipse.persistence.testing.jaxb.jaxbcontext.fake", Thread.currentThread().getContextClassLoader());
} catch(JAXBException ex) {
assertTrue(((org.eclipse.persistence.exceptions.JAXBException)ex.getLinkedException()).getErrorCode() == org.eclipse.persistence.exceptions.JAXBException.NO_OBJECT_FACTORY_OR_JAXB_INDEX_IN_PATH);
assertTrue(((org.eclipse.persistence.exceptions.JAXBException)ex.getLinkedException()).getInternalException() instanceof ValidationException);
}
}
public void testCreateContextUnrelatedSessionsXml() throws Exception {
JAXBContext context = JAXBContextFactory.createContext("org.eclipse.persistence.testing.jaxb.jaxbcontext", new ClassLoader() {
@Override
public URL getResource(String resourceName) {
if(resourceName.equals("sessions.xml")) {
return getParent().getResource("org/eclipse/persistence/testing/jaxb/jaxbcontext/sessions.xml");
}
return this.getParent().getResource(resourceName);
}
});
}
public void testCreateContextUnrelatedSessionsXmlInvalidPath() throws Exception {
try {
JAXBContext context = JAXBContextFactory.createContext("org.eclipse.persistence.testing.jaxb.jaxbcontext.fake", new ClassLoader() {
@Override
public URL getResource(String resourceName) {
if(resourceName.equals("sessions.xml")) {
return getParent().getResource("org/eclipse/persistence/testing/jaxb/jaxbcontext/sessions.xml");
}
return this.getParent().getResource(resourceName);
}
});
} catch(JAXBException ex) {
assertTrue(((org.eclipse.persistence.exceptions.JAXBException)ex.getLinkedException()).getErrorCode() == org.eclipse.persistence.exceptions.JAXBException.NO_OBJECT_FACTORY_OR_JAXB_INDEX_IN_PATH);
assertTrue(((org.eclipse.persistence.exceptions.JAXBException)ex.getLinkedException()).getInternalException() instanceof SessionLoaderException);
}
}
public void testCreateContextWithStringClass() throws JAXBException {
Class[] classes = new Class[1];
classes[0] = String.class;
JAXBContextFactory.createContext(classes, null);
}
public void testCreateContextWithIntArrayClass() throws JAXBException {
Class[] classes = new Class[1];
int[] ints = new int[1];
classes[0] = ints.getClass();
JAXBContextFactory.createContext(classes, null);
}
public void testCreateContextWith_ClassArray_NullClassLoader() throws JAXBException {
Class[] classes = new Class[1];
int[] ints = new int[1];
classes[0] = ints.getClass();
JAXBContextFactory.createContext(classes, null);
}
public void testCreateContextWith_ClassArray_Map_NullClassLoader_Map() throws JAXBException {
Class[] classes = new Class[1];
int[] ints = new int[1];
classes[0] = ints.getClass();
JAXBContextFactory.createContext(classes, null, null);
}
public void testCreateContextWith_String_NullClassLoader() throws JAXBException {
JAXBContextFactory.createContext("org.eclipse.persistence.testing.jaxb.jaxbcontext", null);
}
public void testCreateContextWith_String_NullClassLoader_Map() throws JAXBException {
JAXBContextFactory.createContext("org.eclipse.persistence.testing.jaxb.jaxbcontext", null, null);
}
public void testCreateContextWith_TypeArray_Map_NullClassLoader() throws JAXBException {
Type[] types = new Type[1];
types[0] = List.class;
JAXBContextFactory.createContext(types, null, null);
}
public void testCreateContextWith_TypeMappingInfoArray_Map_NullClassLoader() throws JAXBException {
TypeMappingInfo[] typeMappingInfos = new TypeMappingInfo[1];
TypeMappingInfo listTMI = new TypeMappingInfo();
listTMI.setType(List.class);
listTMI.setXmlTagName(new QName("urn:example", "my-list"));
typeMappingInfos[0] = listTMI;
JAXBContextFactory.createContext(typeMappingInfos, null, null);
}
public void testCreateAbstractClassWithMultiArgConstructor() throws JAXBException {
Class[] classes = new Class[1];
classes[0] = AbstractClassWithMultiArgConstructor.class;
JAXBContextFactory.createContext(classes, null);
}
public void testCreateConcreteClassWithMultiArgConstructor() throws JAXBException {
try {
Class[] classes = new Class[1];
classes[0] = ConcreteClassWithMultiArgConstructor.class;
JAXBContextFactory.createContext(classes, null);
} catch(JAXBException e) {
org.eclipse.persistence.exceptions.JAXBException je = (org.eclipse.persistence.exceptions.JAXBException) e.getLinkedException();
assertEquals(org.eclipse.persistence.exceptions.JAXBException.FACTORY_METHOD_OR_ZERO_ARG_CONST_REQ, je.getErrorCode());
return;
}
fail();
}
public void testCreateContextWithGenerics() throws JAXBException {
Class[] classes = new Class[1];
classes[0] = ConcreteClassWithGenerics.class;
JAXBContextFactory.createContext(classes, null);
}
public void testCreateContextWithPathAndBindings() throws Exception {
String oxmString = "org/eclipse/persistence/testing/jaxb/jaxbcontext/eclipselink-oxm.xml";
InputStream oxm = ClassLoader.getSystemClassLoader().getResourceAsStream(oxmString);
Map<String, Object> props = new HashMap<String, Object>();
props.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, oxm);
// Specify some other, unrelated context path -- we want to ensure that we don't fail
// due to lack of ObjectFactory/jaxb.index
JAXBContext ctx = JAXBContext.newInstance("org.eclipse.persistence.testing.oxm.jaxb",
ClassLoader.getSystemClassLoader(), props);
Employee e = new Employee();
e.id = 6;
e.name = "Jeeves Sobs";
e.put("tag", "tag-value");
Document marshalDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Marshaller m = ctx.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(e, marshalDoc);
// Make sure OXM was picked up, "tag" property should have been added.
Employee e2 = (Employee) ctx.createUnmarshaller().unmarshal(marshalDoc);
assertEquals("OXM file was not processed during context creation.", e.get("tag"), e2.get("tag"));
}
public void testCreateContextXmlAnyAttributeSubTypeMap() throws Exception {
JAXBContextFactory.createContext(new Class[]{XmlAnyAttributeSubTypeMapModel.class}, null);
}
public void testJavaClassImplWildcard() throws Exception{
ParameterizedType pType = (ParameterizedType) WildCardTest.class.getField("testField").getGenericType();
JavaClassImpl javaClass = new JavaClassImpl(pType, java.util.List.class, null);
boolean hasArgs = javaClass.hasActualTypeArguments();
Collection getArgs = javaClass.getActualTypeArguments();
assertFalse(hasArgs);
assertTrue(getArgs.size()== 0);
}
/**
* Test creating a context with classes generated from the GML/XLink schemas. Tests
* that a class with both ns0:title and @ns0:title mappings is interpreted properly.
*/
public void testCreateContextXLink() throws Exception {
JAXBContext context = JAXBContext.newInstance(this.getClass().getPackage().getName() + ".xlink");
assertNotNull(context);
}
}