| /* |
| * 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/>"; |
| } |
| } |
| |
| } |