blob: e6ea95c4103fb86c0a8de5cc3a2e1879aeaecaeb [file] [log] [blame]
/*
* Copyright (c) 2018, 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.sdo.helper.xmlhelper.loadandsave.nillable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import junit.textui.TestRunner;
import org.eclipse.persistence.sdo.SDOType;
import org.eclipse.persistence.sdo.helper.SDOXSDHelper;
import org.eclipse.persistence.sdo.helper.SchemaResolver;
import org.eclipse.persistence.testing.sdo.helper.xmlhelper.loadandsave.LoadAndSaveTestCases;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import commonj.sdo.DataObject;
import commonj.sdo.helper.HelperContext;
import commonj.sdo.helper.XMLDocument;
import commonj.sdo.impl.HelperProvider;
public class ListPropertyNillableElementTestCases extends LoadAndSaveTestCases {
static String SCHEMA_NAME = "./org/eclipse/persistence/testing/sdo/helper/xmlhelper/loadandsave/nillable/ListPropertyTest.xsd";
public ListPropertyNillableElementTestCases(String name) {
super(name);
}
public static void main(String[] args) {
String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.helper.xmlhelper.loadandsave.nillable.ListPropertyNillableElementTestCases" };
TestRunner.main(arguments);
}
@Override
protected String getRootInterfaceName() {
return "ListPropertyTestType";
}
@Override
protected String getControlFileName() {
return "./org/eclipse/persistence/testing/sdo/helper/xmlhelper/loadandsave/nillable/ListPropertyNillableElementTest.xml";
}
@Override
protected String getControlRootName() {
return "ListPropertyTest";
}
@Override
protected String getControlRootURI() {
return "http://www.example.org";
}
@Override
protected String getSchemaName() {
return SCHEMA_NAME;
}
@Override
protected String getNoSchemaControlWriteFileName() {
return "./org/eclipse/persistence/testing/sdo/helper/xmlhelper/loadandsave/nillable/ListPropertyNillableElementTestNoSchema.xml";
}
@Override
protected void registerTypes() {}
@Override
public void testClassGenerationLoadAndSave() throws Exception {}
// ====== CUSTOM TESTS DERIVED FROM THE SDO 2.1.1 TCK ====== //
/**
* 'child' property is nillable, so null is allowed
*/
public void testValidSetNullInList() throws Exception {
try {
Element[] schemas = new Element[1];
schemas[0] = getDOM(getSchemaName());
SDOElementResolver resolver = new SDOElementResolver(schemas);
List<SDOType> types = ((SDOXSDHelper) aHelperContext.getXSDHelper()).define(new DOMSource(schemas[0], getSchemaName()), resolver);
assertEquals(3, types.size());
XMLDocument doc = aHelperContext.getXMLHelper().load(new FileInputStream(new File(getControlFileName())));
DataObject rootObj = doc.getRootObject();
DataObject childDo = rootObj.getDataObject("childContain");
List listTest = childDo.getList("child");
assertNotNull(listTest);
assertEquals(2, listTest.size());
listTest.add(null);
assertEquals(3, listTest.size());
// DEBUGGING
//hc.getXMLHelper().save(doc.getRootObject(), doc.getRootElementURI(), doc.getRootElementName(), System.out);
String xml = aHelperContext.getXMLHelper().save(doc.getRootObject(), doc.getRootElementURI(), doc.getRootElementName());
assertTrue(xml.indexOf("xsi:nil=\"true\"") > 0);
} catch (Exception xxx) {
xxx.printStackTrace();
throw xxx;
}
}
/**
* 'kid' property is not nillable, so null is not allowed
*/
public void testInvalidSetNullInList() throws Exception {
try {
Element[] schemas = new Element[1];
schemas[0] = getDOM(getSchemaName());
SDOElementResolver resolver = new SDOElementResolver(schemas);
List<SDOType> types = ((SDOXSDHelper) aHelperContext.getXSDHelper()).define(new DOMSource(schemas[0], getSchemaName()), resolver);
assertEquals(3, types.size());
XMLDocument doc = aHelperContext.getXMLHelper().load(new FileInputStream(new File(getControlFileName())));
DataObject rootObj = doc.getRootObject();
DataObject childDo = rootObj.getDataObject("childContain");
List listTest = childDo.getList("kid");
assertNotNull(listTest);
assertEquals(2, listTest.size());
boolean exceptionOccurred = false;
try {
listTest.add(null);
} catch (UnsupportedOperationException uoe) {
exceptionOccurred = true;
}
assertTrue("An UnsupportedOperationException did not occur as expected (adding null to non-nillable list is not allowed)", exceptionOccurred);
assertEquals(2, listTest.size());
aHelperContext.getXMLHelper().save(doc.getRootObject(), doc.getRootElementURI(), doc.getRootElementName());
} catch (Exception xxx) {
xxx.printStackTrace();
throw xxx;
}
}
/**
* 'child' property is nillable, so a null entry in the collection to be
* added is allowed.
*/
public void testAddAllSetNullInList() throws Exception {
try {
Element[] schemas = new Element[1];
schemas[0] = getDOM(getSchemaName());
SDOElementResolver resolver = new SDOElementResolver(schemas);
List<SDOType> types = ((SDOXSDHelper) aHelperContext.getXSDHelper()).define(new DOMSource(schemas[0], getSchemaName()), resolver);
assertEquals(3, types.size());
XMLDocument doc = aHelperContext.getXMLHelper().load(new FileInputStream(new File(getControlFileName())));
DataObject rootObj = doc.getRootObject();
DataObject childDo = rootObj.getDataObject("childContain");
List listTest = childDo.getList("child");
Collection kids = new ArrayList();
kids.add(listTest.get(0));
kids.add(null);
kids.add(listTest.get(1));
boolean exceptionOccurred = false;
try {
listTest.addAll(kids);
} catch (UnsupportedOperationException uoe) {
exceptionOccurred = true;
}
assertFalse("An unexpected UnsupportedOperationException occurred", exceptionOccurred);
aHelperContext.getXMLHelper().save(doc.getRootObject(), doc.getRootElementURI(), doc.getRootElementName());
} catch (Exception xxx) {
xxx.printStackTrace();
throw xxx;
}
}
/**
* 'kid' property is not nillable, so a null entry in the collection to be
* added is not allowed.
*/
public void testInvalidAddAllSetNullInList() throws Exception {
try {
Element[] schemas = new Element[1];
schemas[0] = getDOM(getSchemaName());
SDOElementResolver resolver = new SDOElementResolver(schemas);
List<SDOType> types = ((SDOXSDHelper) aHelperContext.getXSDHelper()).define(new DOMSource(schemas[0], getSchemaName()), resolver);
assertEquals(3, types.size());
XMLDocument doc = aHelperContext.getXMLHelper().load(new FileInputStream(new File(getControlFileName())));
DataObject rootObj = doc.getRootObject();
DataObject childDo = rootObj.getDataObject("childContain");
List listTest = childDo.getList("kid");
Collection kids = new ArrayList();
kids.add(listTest.get(0));
kids.add(null);
kids.add(listTest.get(1));
boolean exceptionOccurred = false;
try {
listTest.addAll(kids);
} catch (UnsupportedOperationException uoe) {
exceptionOccurred = true;
}
assertTrue("An UnsupportedOperationException did not occur as expected (adding a collection with a null entry to non-nillable list property is not allowed)", exceptionOccurred);
aHelperContext.getXMLHelper().save(doc.getRootObject(), doc.getRootElementURI(), doc.getRootElementName());
} catch (Exception xxx) {
xxx.printStackTrace();
throw xxx;
}
}
// ====== CONVENIENCE METHODS & CLASSES ====== //
static Element getDOM(String fileLoc) throws Exception {
FileInputStream is = new FileInputStream(fileLoc);
try {
DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
fac.setNamespaceAware(true);
Document doc = fac.newDocumentBuilder().parse(is);
return doc.getDocumentElement();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
static class SDOElementResolver implements SchemaResolver {
Element[] schemas = null;
SDOElementResolver(Element[] schemas) {
this.schemas = schemas;
}
@Override
public Source resolveSchema(Source sourceXSD, String namespace, String schemaLocation) {
if (namespace.equals("http://www.example.org")) {
return new DOMSource(schemas[0], SCHEMA_NAME);
}
return null;
}
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
return null;
}
}
}