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; | |
} | |
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; | |
} | |
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { | |
return null; | |
} | |
} | |
} |