blob: 86cc90e1162ac5d4995edb1327a52e6f30744136 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 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:
// Mike Norman - May 2008, created DBWS test package
package dbws.testing.oracleobjecttype;
//javase imports
import java.io.ByteArrayInputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Struct;
import java.sql.Types;
import java.util.Vector;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
//java eXtension imports
//JUnit4 imports
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
//EclipseLink imports
import org.eclipse.persistence.dbws.DBWSModel;
import org.eclipse.persistence.dbws.DBWSModelProject;
import org.eclipse.persistence.internal.descriptors.TransformerBasedFieldTransformation;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.internal.sessions.factories.ObjectPersistenceWorkbenchXMLProject;
import org.eclipse.persistence.internal.xr.Invocation;
import org.eclipse.persistence.internal.xr.Operation;
import org.eclipse.persistence.internal.xr.XRServiceAdapter;
import org.eclipse.persistence.internal.xr.XRServiceFactory;
import org.eclipse.persistence.mappings.DirectToFieldMapping;
import org.eclipse.persistence.mappings.structures.ObjectRelationalDataTypeDescriptor;
import org.eclipse.persistence.mappings.structures.StructureMapping;
import org.eclipse.persistence.mappings.transformers.ConstantTransformer;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.XMLField;
import org.eclipse.persistence.oxm.XMLLogin;
import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.XMLUnmarshaller;
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
import org.eclipse.persistence.oxm.mappings.XMLTransformationMapping;
import org.eclipse.persistence.oxm.platform.DOMPlatform;
import org.eclipse.persistence.oxm.schema.XMLSchemaReference;
import org.eclipse.persistence.oxm.schema.XMLSchemaURLReference;
import org.eclipse.persistence.platform.database.oracle.Oracle11Platform;
import org.eclipse.persistence.platform.xml.XMLComparer;
import org.eclipse.persistence.platform.xml.XMLParser;
import org.eclipse.persistence.platform.xml.XMLPlatform;
import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.StoredProcedureCall;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.sessions.Session;
import org.eclipse.persistence.sessions.factories.XMLProjectReader;
import dbws.testing.AllTests;
import static org.eclipse.persistence.oxm.XMLConstants.INT_QNAME;
import static org.eclipse.persistence.oxm.XMLConstants.STRING_QNAME;
import static dbws.testing.DBWSTestHelper.CONSTANT_PROJECT_BUILD_VERSION;
import static dbws.testing.DBWSTestHelper.DATABASE_DDL_CREATE_KEY;
import static dbws.testing.DBWSTestHelper.DATABASE_DDL_DEBUG_KEY;
import static dbws.testing.DBWSTestHelper.DATABASE_DDL_DROP_KEY;
import static dbws.testing.DBWSTestHelper.DEFAULT_DATABASE_DDL_CREATE;
import static dbws.testing.DBWSTestHelper.DEFAULT_DATABASE_DDL_DEBUG;
import static dbws.testing.DBWSTestHelper.DEFAULT_DATABASE_DDL_DROP;
public class OracleObjecttypeTestSuite {
static final String CREATE_DDL =
"CREATE TYPE XR_ADDRESS_TYPE AS OBJECT (" +
" STREET VARCHAR2(40)," +
" CITY VARCHAR2(40)," +
" PROV VARCHAR2(40)" +
")|" +
"CREATE TABLE XR_EMP_ADDR (" +
" EMPNO NUMBER(4) NOT NULL," +
" FNAME VARCHAR2(40)," +
" LNAME VARCHAR2(40)," +
" ADDRESS XR_ADDRESS_TYPE," +
" PRIMARY KEY (EMPNO)" +
")|" +
"CREATE PROCEDURE GET_EMPLOYEES_BY_PROV(X IN XR_ADDRESS_TYPE, Y OUT SYS_REFCURSOR) AS" +
" BEGIN" +
" OPEN Y FOR SELECT * FROM XR_EMP_ADDR xrea WHERE xrea.ADDRESS.PROV LIKE X.PROV;" +
" END;" +
"|" +
"INSERT INTO XR_EMP_ADDR (EMPNO, FNAME, LNAME, ADDRESS) VALUES (1, 'Mike', 'Norman', XR_ADDRESS_TYPE('Pinetrail','Nepean','Ont'))|" +
"INSERT INTO XR_EMP_ADDR (EMPNO, FNAME, LNAME, ADDRESS) VALUES (2, 'Rick', 'Barkhouse', XR_ADDRESS_TYPE('Davis Side Rd','Carleton Place','Ont'))|" +
"INSERT INTO XR_EMP_ADDR (EMPNO, FNAME, LNAME, ADDRESS) VALUES (3, 'Merrick', 'Schincariol', XR_ADDRESS_TYPE('do','not','know'))|";
static final String DROP_DDL =
"DROP TABLE XR_EMP_ADDR|" +
"DROP TYPE XR_ADDRESS_TYPE|" +
"DROP PROCEDURE GET_EMPLOYEES_BY_PROV|";
static final String DATABASE_USERNAME_KEY = "db.user";
static final String DATABASE_PASSWORD_KEY = "db.pwd";
static final String DATABASE_URL_KEY = "db.url";
static final String DATABASE_DRIVER_KEY = "db.driver";
static final String OBJECTTYPE_SCHEMA =
"<?xml version='1.0' encoding='UTF-8'?>\n" +
"<xsd:schema\n" +
" targetNamespace=\"urn:oracleobjecttype\" xmlns=\"urn:oracleobjecttype\" elementFormDefault=\"qualified\"\n" +
" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" +
" >\n" +
" <xsd:complexType name=\"addressType\">\n" +
" <xsd:sequence>\n" +
" <xsd:element name=\"street\" type=\"xsd:string\" />\n" +
" <xsd:element name=\"city\" type=\"xsd:string\" />\n" +
" <xsd:element name=\"province\" type=\"xsd:string\" />\n" +
" </xsd:sequence>\n" +
" </xsd:complexType>\n" +
" <xsd:complexType name=\"employeeType\">\n" +
" <xsd:sequence>\n" +
" <xsd:element name=\"id\" type=\"xsd:int\" />\n" +
" <xsd:element name=\"first-name\" type=\"xsd:string\" />\n" +
" <xsd:element name=\"last-name\" type=\"xsd:string\" />\n" +
" <xsd:element name=\"address\" type=\"addressType\" />\n" +
" </xsd:sequence>\n" +
" </xsd:complexType>\n" +
"</xsd:schema>";
static final String OBJECTTYPE_XRMODEL =
"<?xml version='1.0' encoding='UTF-8'?>\n" +
"<dbws\n" +
" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
" xmlns:ns1=\"urn:oracleobjecttype\"\n" +
" >\n" +
" <name>oracleobjecttype</name>\n" +
" <query>\n" +
" <name>getEmployeesByProv</name>\n" +
" <parameter>\n" +
" <name>X</name>\n" +
" <type>ns1:addressType</type>\n" +
" </parameter>\n" +
" <result isCollection=\"true\">\n" +
" <type>ns1:employeeType</type>\n" +
" </result>\n" +
" <named-query>\n" +
" <name>getEmployeesByProv</name>\n" +
" <descriptor>employee</descriptor>\n" +
" </named-query>\n" +
" </query>\n" +
"</dbws>";
static final String OBJECTTYPE_OR_PROJECT =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<object-persistence version=\"" + CONSTANT_PROJECT_BUILD_VERSION + "\" xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:eclipselink=\"http://www.eclipse.org/eclipselink/xsds/persistence\">" +
"<name>or-oracleobjecttype</name>" +
"<class-mapping-descriptors>" +
"<class-mapping-descriptor xsi:type=\"object-relational-class-mapping-descriptor\">" +
"<class>dbws.testing.oracleobjecttype.Address</class>" +
"<alias>address</alias>" +
"<events/>" +
"<querying/>" +
"<attribute-mappings>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>street</attribute-name>" +
"<field name=\"STREET\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>city</attribute-name>" +
"<field name=\"CITY\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>province</attribute-name>" +
"<field name=\"PROV\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"</attribute-mappings>" +
"<descriptor-type>aggregate</descriptor-type>" +
"<caching>" +
"<cache-size>-1</cache-size>" +
"</caching>" +
"<remote-caching>" +
"<cache-size>-1</cache-size>" +
"</remote-caching>" +
"<instantiation/>" +
"<copying xsi:type=\"instantiation-copy-policy\"/>" +
"<structure>XR_ADDRESS_TYPE</structure>" +
"<field-order>" +
"<field name=\"STREET\" xsi:type=\"column\"/>" +
"<field name=\"CITY\" xsi:type=\"column\"/>" +
"<field name=\"PROV\" xsi:type=\"column\"/>" +
"</field-order>" +
"</class-mapping-descriptor>" +
"<class-mapping-descriptor xsi:type=\"object-relational-class-mapping-descriptor\">" +
"<class>dbws.testing.oracleobjecttype.EmployeeWithAddress</class>" +
"<alias>employee</alias>" +
"<primary-key>" +
"<field table=\"XR_EMP_ADDR\" name=\"EMPNO\" xsi:type=\"column\"/>" +
"</primary-key>" +
"<events/>" +
"<querying>" +
"<queries>" +
"<query name=\"getEmployeesByProv\" xsi:type=\"read-all-query\">" +
"<arguments>" +
"<argument name=\"X\">" +
"<type>java.lang.Object</type>" +
"</argument>" +
"</arguments>" +
"<call xsi:type=\"stored-procedure-call\">" +
"<procedure-name>GET_EMPLOYEES_BY_PROV</procedure-name>" +
"<cursor-output-procedure>true</cursor-output-procedure>" +
"<arguments>" +
"<argument>" +
"<procedure-argument-name>X</procedure-argument-name>" +
"<argument-name>X</argument-name>" +
"<procedure-argument-sqltype>2002</procedure-argument-sqltype>" +
"<procedure-argument-sqltype-name>XR_ADDRESS_TYPE</procedure-argument-sqltype-name>" +
"</argument>" +
"<argument xsi:type=\"procedure-output-cursor-argument\">" +
"<procedure-argument-name>Y</procedure-argument-name>" +
"<argument-name>Y</argument-name>" +
"</argument>" +
"</arguments>" +
"</call>" +
"<reference-class>dbws.testing.oracleobjecttype.EmployeeWithAddress</reference-class>" +
"<container xsi:type=\"list-container-policy\">" +
"<collection-type>java.util.Vector</collection-type>" +
"</container>" +
"</query>" +
"</queries>" +
"</querying>" +
"<attribute-mappings>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>id</attribute-name>" +
"<field table=\"XR_EMP_ADDR\" name=\"EMPNO\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>firstName</attribute-name>" +
"<field table=\"XR_EMP_ADDR\" name=\"FNAME\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>lastName</attribute-name>" +
"<field table=\"XR_EMP_ADDR\" name=\"LNAME\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"structure-mapping\">" +
"<attribute-name>address</attribute-name>" +
"<reference-class>dbws.testing.oracleobjecttype.Address</reference-class>" +
"<field name=\"ADDRESS\" xsi:type=\"object-relational-field\"/>" +
"</attribute-mapping>" +
"</attribute-mappings>" +
"<descriptor-type>independent</descriptor-type>" +
"<caching>" +
"<cache-size>-1</cache-size>" +
"</caching>" +
"<remote-caching>" +
"<cache-size>-1</cache-size>" +
"</remote-caching>" +
"<instantiation/>" +
"<copying xsi:type=\"instantiation-copy-policy\"/>" +
"<tables>" +
"<table name=\"XR_EMP_ADDR\"/>" +
"</tables>" +
"</class-mapping-descriptor>" +
"</class-mapping-descriptors>" +
"</object-persistence>";
static final String OBJECTTYPE_OX_PROJECT =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<object-persistence version=\"" + CONSTANT_PROJECT_BUILD_VERSION + "\" xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:eclipselink=\"http://www.eclipse.org/eclipselink/xsds/persistence\">" +
"<name>ox-oracleobjecttype</name>" +
"<class-mapping-descriptors>" +
"<class-mapping-descriptor xsi:type=\"xml-class-mapping-descriptor\">" +
"<class>dbws.testing.oracleobjecttype.Address</class>" +
"<alias>address</alias>" +
"<events/>" +
"<querying/>" +
"<attribute-mappings>" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">" +
"<attribute-name>street</attribute-name>" +
"<field name=\"street/text()\" xsi:type=\"node\">" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}string</schema-type>" +
"</field>" +
"<null-policy xsi:type=\"null-policy\">" +
"<empty-node-represents-null>true</empty-node-represents-null>" +
"<null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>" +
"</null-policy>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">" +
"<attribute-name>city</attribute-name>" +
"<field name=\"city/text()\" xsi:type=\"node\">" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}string</schema-type>" +
"</field>" +
"<null-policy xsi:type=\"null-policy\">" +
"<empty-node-represents-null>true</empty-node-represents-null>" +
"<null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>" +
"</null-policy>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">" +
"<attribute-name>province</attribute-name>" +
"<field name=\"province/text()\" xsi:type=\"node\">" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}string</schema-type>" +
"</field>" +
"<null-policy xsi:type=\"null-policy\">" +
"<empty-node-represents-null>true</empty-node-represents-null>" +
"<null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>" +
"</null-policy>" +
"</attribute-mapping>" +
"</attribute-mappings>" +
"<descriptor-type>aggregate</descriptor-type>" +
"<caching>" +
"<cache-size>-1</cache-size>" +
"</caching>" +
"<remote-caching>" +
"<cache-size>-1</cache-size>" +
"</remote-caching>" +
"<instantiation/>" +
"<copying xsi:type=\"instantiation-copy-policy\"/>" +
"<default-root-element>address</default-root-element>" +
"<default-root-element-field name=\"address\"/>" +
"<namespace-resolver>" +
"<default-namespace-uri>urn:oracleobjecttype</default-namespace-uri>" +
"</namespace-resolver>" +
"<schema xsi:type=\"schema-url-reference\">" +
"<schema-context>/addressType</schema-context>" +
"<node-type>complex-type</node-type>" +
"</schema>" +
"</class-mapping-descriptor>" +
"<class-mapping-descriptor xsi:type=\"xml-class-mapping-descriptor\">" +
"<class>dbws.testing.oracleobjecttype.EmployeeWithAddress</class>" +
"<alias>employee</alias>" +
"<events/>" +
"<querying/>" +
"<attribute-mappings>" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">" +
"<attribute-name>id</attribute-name>" +
"<field name=\"id/text()\" xsi:type=\"node\">" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}int</schema-type>" +
"</field>" +
"<null-policy xsi:type=\"null-policy\">" +
"<empty-node-represents-null>true</empty-node-represents-null>" +
"<null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>" +
"</null-policy>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">" +
"<attribute-name>firstName</attribute-name>" +
"<field name=\"first-name/text()\" xsi:type=\"node\">" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}string</schema-type>" +
"</field>" +
"<null-policy xsi:type=\"null-policy\">" +
"<empty-node-represents-null>true</empty-node-represents-null>" +
"<null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>" +
"</null-policy>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">" +
"<attribute-name>lastName</attribute-name>" +
"<field name=\"last-name/text()\" xsi:type=\"node\">" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}string</schema-type>" +
"</field>" +
"<null-policy xsi:type=\"null-policy\">" +
"<empty-node-represents-null>true</empty-node-represents-null>" +
"<null-representation-for-xml>ABSENT_NODE</null-representation-for-xml>" +
"</null-policy>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"xml-composite-object-mapping\">" +
"<attribute-name>address</attribute-name>" +
"<reference-class>dbws.testing.oracleobjecttype.Address</reference-class>" +
"<field name=\"address\" xsi:type=\"node\"/>" +
"</attribute-mapping>" +
"</attribute-mappings>" +
"<descriptor-type>aggregate</descriptor-type>" +
"<caching>" +
"<cache-size>-1</cache-size>" +
"</caching>" +
"<remote-caching>" +
"<cache-size>-1</cache-size>" +
"</remote-caching>" +
"<instantiation/>" +
"<copying xsi:type=\"instantiation-copy-policy\"/>" +
"<default-root-element>employee</default-root-element>" +
"<default-root-element-field name=\"employee\"/>" +
"<namespace-resolver>" +
"<default-namespace-uri>urn:oracleobjecttype</default-namespace-uri>" +
"</namespace-resolver>" +
"<schema xsi:type=\"schema-url-reference\">" +
"<schema-context>/employeeType</schema-context>" +
"<node-type>complex-type</node-type>" +
"</schema>" +
"</class-mapping-descriptor>" +
"</class-mapping-descriptors>" +
"<login xsi:type=\"xml-login\">" +
"<platform-class>org.eclipse.persistence.oxm.platform.DOMPlatform</platform-class>" +
"</login>" +
"</object-persistence>";
// test fixtures
public static XMLComparer comparer = new XMLComparer();
public static XMLPlatform xmlPlatform = XMLPlatformFactory.getInstance().getXMLPlatform();
public static XMLParser xmlParser = xmlPlatform.newXMLParser();
public static XRServiceAdapter xrService = null;
static boolean ddlCreate = false;
static boolean ddlDrop = false;
static boolean ddlDebug = false;
@BeforeClass
public static void setUp() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
final String ddlCreateProp = System.getProperty(DATABASE_DDL_CREATE_KEY, DEFAULT_DATABASE_DDL_CREATE);
if ("true".equalsIgnoreCase(ddlCreateProp)) {
ddlCreate = true;
}
final String ddlDropProp = System.getProperty(DATABASE_DDL_DROP_KEY, DEFAULT_DATABASE_DDL_DROP);
if ("true".equalsIgnoreCase(ddlDropProp)) {
ddlDrop = true;
}
final String ddlDebugProp = System.getProperty(DATABASE_DDL_DEBUG_KEY, DEFAULT_DATABASE_DDL_DEBUG);
if ("true".equalsIgnoreCase(ddlDebugProp)) {
ddlDebug = true;
}
final String username = System.getProperty(DATABASE_USERNAME_KEY);
if (username == null) {
fail("error retrieving database username");
}
final String password = System.getProperty(DATABASE_PASSWORD_KEY);
if (password == null) {
fail("error retrieving database password");
}
final String url = System.getProperty(DATABASE_URL_KEY);
if (url == null) {
fail("error retrieving database url");
}
final String driver = System.getProperty(DATABASE_DRIVER_KEY);
if (driver == null) {
fail("error retrieving database driver");
}
Project orProject = new Project();
orProject.setName("or-oracleobjecttype");
ObjectRelationalDataTypeDescriptor addressORDescriptor =
new ObjectRelationalDataTypeDescriptor();
addressORDescriptor.setAlias("address");
addressORDescriptor.useSoftCacheWeakIdentityMap();
addressORDescriptor.setJavaClass(Address.class);
addressORDescriptor.descriptorIsAggregate();
addressORDescriptor.setStructureName("XR_ADDRESS_TYPE");
addressORDescriptor.addFieldOrdering("STREET");
addressORDescriptor.addFieldOrdering("CITY");
addressORDescriptor.addFieldOrdering("PROV");
addressORDescriptor.addDirectMapping("street", "STREET");
addressORDescriptor.addDirectMapping("city", "CITY");
addressORDescriptor.addDirectMapping("province", "PROV");
orProject.addDescriptor(addressORDescriptor);
ObjectRelationalDataTypeDescriptor employeeORDescriptor =
new ObjectRelationalDataTypeDescriptor();
employeeORDescriptor.useSoftCacheWeakIdentityMap();
employeeORDescriptor.getQueryManager().checkCacheForDoesExist();
employeeORDescriptor.setAlias("employee");
employeeORDescriptor.setJavaClass(EmployeeWithAddress.class);
employeeORDescriptor.addTableName("XR_EMP_ADDR");
employeeORDescriptor.addPrimaryKeyFieldName("XR_EMP_ADDR.EMPNO");
orProject.addDescriptor(employeeORDescriptor);
DirectToFieldMapping idMapping = new DirectToFieldMapping();
idMapping.setAttributeName("id");
idMapping.setFieldName("XR_EMP_ADDR.EMPNO");
employeeORDescriptor.addMapping(idMapping);
DirectToFieldMapping firstNameMapping = new DirectToFieldMapping();
firstNameMapping.setAttributeName("firstName");
firstNameMapping.setFieldName("XR_EMP_ADDR.FNAME");
employeeORDescriptor.addMapping(firstNameMapping);
DirectToFieldMapping lastNameMapping = new DirectToFieldMapping();
lastNameMapping.setAttributeName("lastName");
lastNameMapping.setFieldName("XR_EMP_ADDR.LNAME");
employeeORDescriptor.addMapping(lastNameMapping);
StructureMapping addressMapping = new StructureMapping();
addressMapping.setAttributeName("address");
addressMapping.setReferenceClass(Address.class);
addressMapping.setFieldName("ADDRESS");
employeeORDescriptor.addMapping(addressMapping);
ReadAllQuery readQuery = new ReadAllQuery(EmployeeWithAddress.class);
readQuery.setName("getEmployeesByProv");
readQuery.addArgument("X");
StoredProcedureCall spCall = new StoredProcedureCall();
spCall.setProcedureName("GET_EMPLOYEES_BY_PROV");
spCall.addNamedArgument("X", "X", Types.STRUCT, "XR_ADDRESS_TYPE");
spCall.useNamedCursorOutputAsResultSet("Y");
readQuery.setCall(spCall);
employeeORDescriptor.getQueryManager().addQuery("getEmployeesByProv", readQuery);
ObjectPersistenceWorkbenchXMLProject runtimeProject =
new ObjectPersistenceWorkbenchXMLProject();
XMLTransformationMapping versionMapping =
(XMLTransformationMapping)runtimeProject.getDescriptor(Project.class).
getMappings().firstElement();
TransformerBasedFieldTransformation versionTransformer =
(TransformerBasedFieldTransformation)versionMapping.getFieldTransformations().get(0);
Field transformerField =
TransformerBasedFieldTransformation.class.getDeclaredField("transformer");
transformerField.setAccessible(true);
ConstantTransformer constantTransformer =
(ConstantTransformer)transformerField.get(versionTransformer);
constantTransformer.setValue(CONSTANT_PROJECT_BUILD_VERSION);
XMLContext context = new XMLContext(runtimeProject);
XMLMarshaller marshaller = context.createMarshaller();
Document orProjectDoc = xmlPlatform.createDocument();
marshaller.marshal(orProject, orProjectDoc);
Document orProjectXMLDoc = xmlParser.parse(new StringReader(OBJECTTYPE_OR_PROJECT));
assertTrue("OracleObjecttype java-built OR project not same as XML-built OR project. Expected:\n" + documentToString(orProjectXMLDoc) + "\nActual:\n" + documentToString(orProjectDoc), comparer.isNodeEqual(orProjectXMLDoc, orProjectDoc));
NamespaceResolver ns = new NamespaceResolver();
ns.setDefaultNamespaceURI("urn:oracleobjecttype");
Project oxProject = new Project();
oxProject.setName("ox-oracleobjecttype");
XMLLogin xmlLogin = new XMLLogin();
xmlLogin.setPlatform(new DOMPlatform());
xmlLogin.getProperties().remove("user");
xmlLogin.getProperties().remove("password");
oxProject.setLogin(xmlLogin);
XMLDescriptor addressOXDescriptor = new XMLDescriptor();
addressOXDescriptor.setAlias("address");
addressOXDescriptor.setJavaClass(Address.class);
addressOXDescriptor.setDefaultRootElement("address");
addressOXDescriptor.setNamespaceResolver(ns);
XMLSchemaURLReference schemaReference = new XMLSchemaURLReference();
schemaReference.setSchemaContext("/addressType");
schemaReference.setType(XMLSchemaReference.COMPLEX_TYPE);
addressOXDescriptor.setSchemaReference(schemaReference);
XMLDirectMapping streetMapping = new XMLDirectMapping();
streetMapping.setAttributeName("street");
XMLField streetField = new XMLField();
streetField.setName("street/text()");
streetField.setSchemaType(STRING_QNAME);
streetMapping.setField(streetField);
addressOXDescriptor.addMapping(streetMapping);
XMLDirectMapping cityMapping = new XMLDirectMapping();
cityMapping.setAttributeName("city");
XMLField cityField = new XMLField();
cityField.setName("city/text()");
cityField.setSchemaType(STRING_QNAME);
cityMapping.setField(cityField);
addressOXDescriptor.addMapping(cityMapping);
XMLDirectMapping provinceMapping = new XMLDirectMapping();
provinceMapping.setAttributeName("province");
XMLField provinceField = new XMLField();
provinceField.setName("province/text()");
provinceField.setSchemaType(STRING_QNAME);
provinceMapping.setField(provinceField);
addressOXDescriptor.addMapping(provinceMapping);
oxProject.addDescriptor(addressOXDescriptor);
XMLDescriptor employeeOXDescriptor = new XMLDescriptor();
employeeOXDescriptor.setAlias("employee");
employeeOXDescriptor.setJavaClass(EmployeeWithAddress.class);
employeeOXDescriptor.setDefaultRootElement("employee");
employeeOXDescriptor.setNamespaceResolver(ns);
schemaReference = new XMLSchemaURLReference();
schemaReference.setSchemaContext("/employeeType");
schemaReference.setType(XMLSchemaReference.COMPLEX_TYPE);
employeeOXDescriptor.setSchemaReference(schemaReference);
XMLDirectMapping xmlIdMapping = new XMLDirectMapping();
xmlIdMapping.setAttributeName("id");
XMLField idField = new XMLField();
idField.setName("id/text()");
idField.setSchemaType(INT_QNAME);
xmlIdMapping.setField(idField);
employeeOXDescriptor.addMapping(xmlIdMapping);
XMLDirectMapping xmlFirstNameMapping = new XMLDirectMapping();
xmlFirstNameMapping.setAttributeName("firstName");
XMLField firstNameField = new XMLField();
firstNameField.setName("first-name/text()");
firstNameField.setSchemaType(STRING_QNAME);
xmlFirstNameMapping.setField(firstNameField);
employeeOXDescriptor.addMapping(xmlFirstNameMapping);
XMLDirectMapping xmlLastNameMapping = new XMLDirectMapping();
xmlLastNameMapping.setAttributeName("lastName");
XMLField lastNameField = new XMLField();
lastNameField.setName("last-name/text()");
lastNameField.setSchemaType(STRING_QNAME);
xmlLastNameMapping.setField(lastNameField);
employeeOXDescriptor.addMapping(xmlLastNameMapping);
XMLCompositeObjectMapping xmlAddressMapping = new XMLCompositeObjectMapping();
xmlAddressMapping.setAttributeName("address");
xmlAddressMapping.setReferenceClass(Address.class);
xmlAddressMapping.setXPath("address");
employeeOXDescriptor.addMapping(xmlAddressMapping);
oxProject.addDescriptor(employeeOXDescriptor);
Document oxProjectDoc = xmlPlatform.createDocument();
marshaller.marshal(oxProject, oxProjectDoc);
Document oxProjectXMLDoc = xmlParser.parse(new StringReader(OBJECTTYPE_OX_PROJECT));
assertTrue("OracleObjecttype java-built OX project not same as XML-built OX project. Expected:\n" + documentToString(oxProjectXMLDoc) + "\nActual:\n" + documentToString(oxProjectDoc), comparer.isNodeEqual(oxProjectXMLDoc, oxProjectDoc));
XRServiceFactory factory = new XRServiceFactory() {
XRServiceFactory init() {
parentClassLoader = ClassLoader.getSystemClassLoader();
xrSchemaStream = new ByteArrayInputStream(OBJECTTYPE_SCHEMA.getBytes());
return this;
}
@Override
public void buildSessions() {
Project orProject = XMLProjectReader.read(
new StringReader(OBJECTTYPE_OR_PROJECT), parentClassLoader);
DatabaseLogin login = new DatabaseLogin();
login.setUserName(username);
login.setPassword(password);
login.setConnectionString(url);
login.setDriverClassName(driver);
login.setDatasourcePlatform(new Oracle11Platform());
login.bindAllParameters();
orProject.setDatasourceLogin(login);
DatabaseSession ds = orProject.createDatabaseSession();
ds.dontLogMessages();
xrService.setORSession(ds);
Project oxProject = XMLProjectReader.read(
new StringReader(OBJECTTYPE_OX_PROJECT), parentClassLoader);
xrService.setXMLContext(new XMLContext(oxProject));
xrService.setOXSession(xrService.getXMLContext().getSession(0));
}
}.init();
context = new XMLContext(new DBWSModelProject());
XMLUnmarshaller unmarshaller = context.createUnmarshaller();
DBWSModel model = (DBWSModel)unmarshaller.unmarshal(new StringReader(OBJECTTYPE_XRMODEL));
xrService = factory.buildService(model);
if (ddlCreate) {
try {
AllTests.runDdl(CREATE_DDL, ddlDebug);
} catch (Exception e) {
// e.printStackTrace();
}
}
}
@AfterClass
public static void tearDown() {
if (ddlDrop) {
try {
AllTests.runDdl(DROP_DDL, ddlDebug);
} catch (Exception e) {
// e.printStackTrace();
}
}
}
@SuppressWarnings("rawtypes")
@Test
public void getEmployeesByProvWithAddress() throws SQLException {
Invocation invocation = new Invocation("getEmployeesByProv");
Operation op = xrService.getOperation(invocation.getName());
Address a = new Address();
a.province = "Ont%";
invocation.setParameter("X", a);
Object result = op.invoke(xrService, invocation);
assertNotNull("result is null", result);
XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
Document doc = xmlPlatform.createDocument();
Element ec = doc.createElement("employee-collection");
doc.appendChild(ec);
for (Object r : (Vector)result) {
marshaller.marshal(r, ec);
}
Document controlDoc = xmlParser.parse(new StringReader(EMPLOYEE_COLLECTION_XML));
assertTrue("control document not same as XRService instance document",
comparer.isNodeEqual(controlDoc, doc));
}
@SuppressWarnings("rawtypes")
@Test
public void getEmployeesByProvWithStruct() throws SQLException {
Invocation invocation = new Invocation("getEmployeesByProv");
Operation op = xrService.getOperation(invocation.getName());
Object[] criteria = new Object[3];
criteria[2] = "Ont%";
Session orSession = xrService.getORSession();
Connection connection = ((AbstractSession)orSession).getAccessor().getConnection();
Struct struct = orSession.getPlatform().createStruct("XR_ADDRESS_TYPE", criteria,
(AbstractSession)orSession, connection);
invocation.setParameter("X", struct);
Object result = op.invoke(xrService, invocation);
assertNotNull("result is null", result);
XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
Document doc = xmlPlatform.createDocument();
Element ec = doc.createElement("employee-collection");
doc.appendChild(ec);
for (Object r : (Vector)result) {
marshaller.marshal(r, ec);
}
Document controlDoc = xmlParser.parse(new StringReader(EMPLOYEE_COLLECTION_XML));
assertTrue("control document not same as XRService instance document",
comparer.isNodeEqual(controlDoc, doc));
}
public static final String EMPLOYEE_COLLECTION_XML =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<employee-collection>" +
"<employee xmlns=\"urn:oracleobjecttype\">" +
"<id>1</id>" +
"<first-name>Mike</first-name>" +
"<last-name>Norman</last-name>" +
"<address>" +
"<street>Pinetrail</street>" +
"<city>Nepean</city>" +
"<province>Ont</province>" +
"</address>" +
"</employee>" +
"<employee xmlns=\"urn:oracleobjecttype\">" +
"<id>2</id>" +
"<first-name>Rick</first-name>" +
"<last-name>Barkhouse</last-name>" +
"<address>" +
"<street>Davis Side Rd</street>" +
"<city>Carleton Place</city>" +
"<province>Ont</province>" +
"</address>" +
"</employee>" +
"</employee-collection>";
/**
* Returns the given org.w3c.dom.Document as a String.
*
*/
public static String documentToString(Document doc) {
DOMSource domSource = new DOMSource(doc);
StringWriter stringWriter = new StringWriter();
StreamResult result = new StreamResult(stringWriter);
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty("indent", "yes");
transformer.transform(domSource, result);
return stringWriter.toString();
} catch (Exception e) {
// e.printStackTrace();
return "<empty/>";
}
}
}