blob: f558504c513d8073667ba7663788d5c3f7374712 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020 Payara Services Ltd.
*
* 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.relationships;
//testing imports
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.DATABASE_DRIVER_KEY;
import static dbws.testing.DBWSTestHelper.DATABASE_PASSWORD_KEY;
import static dbws.testing.DBWSTestHelper.DATABASE_URL_KEY;
import static dbws.testing.DBWSTestHelper.DATABASE_USERNAME_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;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
//javase imports
import java.io.ByteArrayInputStream;
import java.io.StringReader;
import java.util.TimeZone;
import java.util.Vector;
//EclipseLink imports
import org.eclipse.persistence.dbws.DBWSModel;
import org.eclipse.persistence.dbws.DBWSModelProject;
import org.eclipse.persistence.internal.databaseaccess.Platform;
import org.eclipse.persistence.internal.sessions.factories.EclipseLinkObjectPersistenceRuntimeXMLProject;
import org.eclipse.persistence.internal.xr.Invocation;
import org.eclipse.persistence.internal.xr.Operation;
import org.eclipse.persistence.internal.xr.ProjectHelper;
import org.eclipse.persistence.internal.xr.XRDynamicEntity_CollectionWrapper;
import org.eclipse.persistence.internal.xr.XRServiceAdapter;
import org.eclipse.persistence.internal.xr.XRServiceFactory;
import org.eclipse.persistence.internal.xr.XRServiceModel;
import org.eclipse.persistence.oxm.XMLContext;
import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.XMLUnmarshaller;
import org.eclipse.persistence.platform.database.MySQLPlatform;
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.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.DatasourceLogin;
import org.eclipse.persistence.sessions.Project;
//JUnit4 imports
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.w3c.dom.Document;
import dbws.testing.AllTests;
import dbws.testing.DBWSTestHelper;
import java.time.Instant;
public class RelationshipsTestSuite {
private static final String TIMEZONE_OFFSET;
static {
int offsetInMillis = TimeZone.getDefault().getOffset(Instant.now().getEpochSecond());
if (offsetInMillis != 0) {
String offset = String.format("%02d:%02d",
Math.abs(offsetInMillis / 3600000),
Math.abs((offsetInMillis / 60000) % 60)
);
TIMEZONE_OFFSET = (offsetInMillis >= 0 ? "+" : "-") + offset;
} else {
TIMEZONE_OFFSET = "Z";
}
}
static final String CREATE_DDL =
"CREATE TABLE IF NOT EXISTS XR_ADDRESS (" +
" ADDRESS_ID NUMERIC(15) NOT NULL," +
" COUNTRY VARCHAR(80)," +
" CITY VARCHAR(80)," +
" PROVINCE VARCHAR(80)," +
" STREET VARCHAR(80)," +
" P_CODE VARCHAR(20)," +
" PRIMARY KEY (ADDRESS_ID)" +
")|" +
"CREATE TABLE IF NOT EXISTS XR_EMPLOYEE (" +
" EMP_ID NUMERIC(15) NOT NULL," +
" F_NAME VARCHAR(40)," +
" L_NAME VARCHAR(40)," +
" VERSION NUMERIC(15)," +
" START_DATE DATE," +
" END_TIME TIME," +
" GENDER VARCHAR(1)," +
" END_DATE DATE," +
" START_TIME TIME," +
" ADDR_ID NUMERIC(15)," +
" PRIMARY KEY (EMP_ID)," +
" CONSTRAINT XR_EMPLOYEE_ADDRESS FOREIGN KEY (ADDR_ID) REFERENCES XR_ADDRESS (ADDRESS_ID)" +
")|" +
"CREATE TABLE IF NOT EXISTS XR_RESPONS (" +
" EMP_ID NUMERIC(15) NOT NULL," +
" DESCRIP VARCHAR(200) NOT NULL," +
" PRIMARY KEY (EMP_ID, DESCRIP)," +
" CONSTRAINT XR_RESPONS_EMPLOYEE FOREIGN KEY (EMP_ID) REFERENCES XR_EMPLOYEE (EMP_ID)" +
")|" +
"CREATE TABLE IF NOT EXISTS XR_SALARY (" +
" EMP_ID NUMERIC(15) NOT NULL," +
" SALARY NUMERIC(15)," +
" PRIMARY KEY (EMP_ID)," +
" CONSTRAINT XR_EMPLOYEE_SALARY FOREIGN KEY (EMP_ID) REFERENCES XR_EMPLOYEE (EMP_ID)" +
")|" +
"CREATE TABLE IF NOT EXISTS XR_PHONE (" +
" EMP_ID NUMERIC(15) NOT NULL," +
" TYPE VARCHAR(15) NOT NULL," +
" P_NUMBER VARCHAR(7)," +
" AREA_CODE VARCHAR(3)," +
" PRIMARY KEY (EMP_ID, TYPE)," +
" CONSTRAINT XR_PHONE_EMPLOYEE FOREIGN KEY (EMP_ID) REFERENCES XR_EMPLOYEE (EMP_ID)" +
")|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (52,'Ottawa','Canada','K5J2B5','ONT','12 Merival Rd., suite 5')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (55,'Arnprior','Canada','W1A2B5','ONT','1 Nowhere Drive')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (61,'Calgary','Canada','J5J2B5','ALB','1111 Moose Rd.')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (60,'Yellow Knife','Canada','Y5J2N5','YK','1112 Gold Rush rd.')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (62,'Metcalfe','Canada','Y4F7V6','ONT','2 Anderson Rd.')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (53,'Vancouver','Canada','N5J2N5','BC','1111 Mountain Blvd. Floor 53, suite 6')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (63,'Victoria','Canada','Z5J2N5','BC','382 Hyde Park')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (54,'Ottawa','Canada','K5J2B5','ONT','12 Merival Rd., suite 5')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (57,'Toronto','Canada','L5J2B5','ONT','1450 Acme Cr., suite 4')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (58,'Perth','Canada','Y3Q2N9','ONT','234 I''m Lost Lane')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (59,'Montreal','Canada','Q2S5Z5','QUE','1 Habs Place')|" +
"INSERT INTO XR_ADDRESS(ADDRESS_ID,CITY,COUNTRY,P_CODE,PROVINCE,STREET) VALUES (56,'Smith Falls','Canada','C6C6C6','ONT','1 Chocolate Drive')|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (61,58,'2006-08-31','00:00:00','Jill','F','May','1991-11-11','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (60,63,'2001-12-31','00:00:00','Jim-bob','M','Jefferson','1995-01-12','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (54,62,'2006-08-31','00:00:00','John','M','Way','1991-11-11','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (57,61,'1996-01-01','00:00:00','Bob','M','Smith','1993-01-01','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (63,60,'2001-12-31','00:00:00','Fred','M','Jones','1995-01-01','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (55,56,'1996-01-01','00:00:00','Sarah-loo','F','Smitty','1993-01-01','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (62,57,'1996-01-01','00:00:00','Nancy','F','White','1993-01-01','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (53,54,'2001-12-31','00:00:00','Emanual','M','Smith','1995-01-01','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (52,53,'2001-07-31','00:00:00','Sarah','F','Way','1995-05-01','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (58,55,'2001-12-31','00:00:00','Marcus','M','Saunders','1995-01-12','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (56,52,'2001-12-31','00:00:00','Betty','F','Jones','1995-01-01','00:00:00',1)|" +
"INSERT INTO XR_EMPLOYEE(ADDR_ID,EMP_ID,END_DATE,END_TIME,F_NAME,GENDER,L_NAME,START_DATE,START_TIME,VERSION) values (59,59,'2001-12-31','00:00:00','Charles','M','Chanley','1995-01-01','00:00:00',1)|" +
"INSERT INTO XR_RESPONS(DESCRIP,EMP_ID) values ('Clean the kitchen.',61)|" +
"INSERT INTO XR_RESPONS(DESCRIP,EMP_ID) values ('Fire people for goofing off.',62)|" +
"INSERT INTO XR_RESPONS(DESCRIP,EMP_ID) values ('Have to fix the Database problem.',54)|" +
"INSERT INTO XR_RESPONS(DESCRIP,EMP_ID) values ('Hire people when more people are required.',62)|" +
"INSERT INTO XR_RESPONS(DESCRIP,EMP_ID) values ('Make the coffee.',61)|" +
"INSERT INTO XR_RESPONS(DESCRIP,EMP_ID) values ('Write code documentation.',53)|" +
"INSERT INTO XR_RESPONS(DESCRIP,EMP_ID) values ('Write lots of Java code.',59)|" +
"INSERT INTO XR_RESPONS(DESCRIP,EMP_ID) values ('Write user specifications.',55)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (58,56232)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (63,50000)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (62,53000)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (61,35000)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (60,500000)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (56,75000)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (57,31000)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (54,49631)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (53,87000)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (55,54300)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (52,500001)|" +
"INSERT INTO XR_SALARY(EMP_ID,SALARY) values (59,43000)|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('416',63,'5551111','Cellular')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',63,'5551234','Home')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('416',56,'5551111','Cellular')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('416',60,'5551111','Cellular')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('905',60,'5553691','ISDN')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('976',59,'5556666','Pager')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',58,'2258812','Work')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('905',55,'5553691','ISDN')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',55,'2258812','Work')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',62,'2258812','Work')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',54,'2255943','Work Fax')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('905',62,'5553691','ISDN')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',61,'2258812','Work')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('976',54,'5556666','Pager')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('416',54,'5551111','Cellular')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('905',54,'5553691','ISDN')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',52,'2258812','Work')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',56,'2255943','Work Fax')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('905',53,'5553691','ISDN')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('905',59,'5553691','ISDN')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',53,'5551234','Home')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',56,'5551234','Home')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',57,'5551234','Home')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('905',52,'5553691','ISDN')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',58,'2255943','Work Fax')|" +
"INSERT INTO XR_PHONE(AREA_CODE,EMP_ID,P_NUMBER,TYPE) values ('613',53,'2258812','Work')|" ;
static final String DROP_DDL =
"DROP TABLE XR_RESPONS|" +
"DROP TABLE XR_SALARY|" +
"DROP TABLE XR_PHONE|" +
"DROP TABLE XR_EMPLOYEE|" +
"DROP TABLE XR_ADDRESS|" ;
static final String RELATIONSHIPS_SCHEMA =
"<?xml version='1.0' encoding='UTF-8'?>\n" +
"<xsd:schema\n" +
"targetNamespace=\"urn:relationships\" xmlns=\"urn:relationships\" elementFormDefault=\"qualified\"\n" +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" +
">\n" +
"<xsd:complexType name=\"phone\">\n" +
"<xsd:sequence>\n" +
"<xsd:element name=\"area-code\" type=\"xsd:string\" />\n" +
"<xsd:element name=\"phonenumber\" type=\"xsd:string\" />\n" +
"<xsd:element name=\"type\" type=\"xsd:string\" />\n" +
"</xsd:sequence>\n" +
"</xsd:complexType>\n" +
"<xsd:element name=\"phone\" type=\"phone\"/>\n" +
"<xsd:complexType name=\"address\">\n" +
"<xsd:sequence>\n" +
"<xsd:element name=\"id\" type=\"xsd:int\" />\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:element name=\"postal-code\" type=\"xsd:string\" />\n" +
"<xsd:element name=\"country\" type=\"xsd:string\" />\n" +
"</xsd:sequence>\n" +
"</xsd:complexType>\n" +
"<xsd:element name=\"address\" type=\"address\"/>\n" +
"<xsd:complexType name=\"employee\">\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=\"address\" minOccurs=\"0\" />\n" +
"<xsd:sequence>\n" +
"<xsd:element name=\"phones\" type=\"phone\" minOccurs=\"0\" />\n" +
"</xsd:sequence>\n" +
"<xsd:sequence>\n" +
"<xsd:element name=\"responsibilities\" type=\"xsd:string\" minOccurs=\"0\" />\n" +
"</xsd:sequence>\n" +
"<xsd:element name=\"start-time\" type=\"xsd:time\" />\n" +
"<xsd:element name=\"end-time\" type=\"xsd:time\" />\n" +
"<xsd:element name=\"start-date\" type=\"xsd:date\" />\n" +
"<xsd:element name=\"end-date\" type=\"xsd:date\" />\n" +
"<xsd:element name=\"gender\" type=\"xsd:string\" />\n" +
"<xsd:element name=\"salary\" type=\"xsd:decimal\" />\n" +
"<xsd:element name=\"version\" type=\"xsd:int\"/>\n" +
"</xsd:sequence>\n" +
"</xsd:complexType>\n" +
"<xsd:element name=\"employee\" type=\"employee\"/>\n" +
"</xsd:schema>";
static final String RELATIONSHIPS_DBWS =
"<?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:relationships\"\n" +
">\n" +
"<name>relationships</name>\n" +
"<query>\n" +
"<name>getAllEmployees</name>\n" +
"<result isCollection=\"true\">\n" +
"<type>ns1:employee</type>\n" +
"</result>\n" +
"<named-query>\n" +
"<name>getAllEmployees</name>\n" +
"<descriptor>employee</descriptor>\n" +
"</named-query>\n" +
"</query>\n" +
"</dbws>";
public static final String RELATIONSHIPS_OR_PROJECT =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<object-persistence version=\"Eclipse Persistence Services - @VERSION@ (Build @BUILD_NUMBER@)\"\n" +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
"xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence\"\n" +
">\n" +
"<name>relationships</name>" +
"<class-mapping-descriptors>" +
"<class-mapping-descriptor xsi:type=\"relational-class-mapping-descriptor\">" +
"<class>dbws.testing.relationships.RelationshipsAddress</class>" +
"<alias>address</alias>" +
"<primary-key>" +
"<field table=\"XR_ADDRESS\" name=\"ADDRESS_ID\" xsi:type=\"column\"/>" +
"</primary-key>" +
"<events xsi:type=\"event-policy\"/>" +
"<querying xsi:type=\"query-policy\"/>" +
"<attribute-mappings>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>addressId</attribute-name>" +
"<field table=\"XR_ADDRESS\" name=\"ADDRESS_ID\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>city</attribute-name>" +
"<field table=\"XR_ADDRESS\" name=\"CITY\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>country</attribute-name>" +
"<field table=\"XR_ADDRESS\" name=\"COUNTRY\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>postalCode</attribute-name>" +
"<field table=\"XR_ADDRESS\" name=\"P_CODE\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>province</attribute-name>" +
"<field table=\"XR_ADDRESS\" name=\"PROVINCE\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>street</attribute-name>" +
"<field table=\"XR_ADDRESS\" name=\"STREET\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"</attribute-mappings>" +
"<descriptor-type>independent</descriptor-type>" +
"<instantiation/>" +
"<copying xsi:type=\"instantiation-copy-policy\"/>" +
"<change-policy xsi:type=\"deferred-detection-change-policy\"/>" +
"<tables>" +
"<table name=\"XR_ADDRESS\"/>" +
"</tables>" +
"</class-mapping-descriptor>" +
"<class-mapping-descriptor xsi:type=\"relational-class-mapping-descriptor\">" +
"<class>dbws.testing.relationships.RelationshipsEmployee</class>" +
"<alias>employee</alias>" +
"<primary-key>" +
"<field table=\"XR_EMPLOYEE\" name=\"EMP_ID\" xsi:type=\"column\"/>" +
"</primary-key>" +
"<events xsi:type=\"event-policy\"/>" +
"<querying xsi:type=\"query-policy\">" +
"<queries>" +
"<query name=\"getAllEmployees\" xsi:type=\"read-all-query\">" +
"<reference-class>dbws.testing.relationships.RelationshipsEmployee</reference-class>" +
"<outer-join-subclasses>false</outer-join-subclasses>" +
"<container xsi:type=\"list-container-policy\">" +
"<collection-type>java.util.Vector</collection-type>" +
"</container>" +
"<order-by-expressions>" +
"<expression function=\"ascending\" xsi:type=\"function-expression\">" +
"<arguments>" +
"<argument name=\"empId\" xsi:type=\"query-key-expression\">" +
"<base xsi:type=\"base-expression\"/>" +
"</argument>" +
"</arguments>" +
"</expression>" +
"</order-by-expressions>" +
"</query>" +
"</queries>" +
"</querying>" +
"<attribute-mappings>" +
"<attribute-mapping xsi:type=\"one-to-one-mapping\">" +
"<attribute-name>address</attribute-name>" +
"<reference-class>dbws.testing.relationships.RelationshipsAddress</reference-class>" +
"<private-owned>true</private-owned>" +
"<foreign-key>" +
"<field-reference>" +
"<source-field table=\"XR_EMPLOYEE\" name=\"ADDR_ID\" xsi:type=\"column\"/>" +
"<target-field table=\"XR_ADDRESS\" name=\"ADDRESS_ID\" xsi:type=\"column\"/>" +
"</field-reference>" +
"</foreign-key>" +
"<foreign-key-fields>" +
"<field table=\"XR_EMPLOYEE\" name=\"ADDR_ID\" xsi:type=\"column\"/>" +
"</foreign-key-fields>" +
"<selection-query xsi:type=\"read-object-query\"/>" +
"<join-fetch>inner-join</join-fetch>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>empId</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"EMP_ID\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>endDate</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"END_DATE\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>endTime</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"END_TIME\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>firstName</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"F_NAME\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>gender</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"GENDER\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>lastName</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"L_NAME\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"one-to-many-mapping\">" +
"<attribute-name>phones</attribute-name>" +
"<reference-class>dbws.testing.relationships.RelationshipsPhone</reference-class>" +
"<private-owned>true</private-owned>" +
"<target-foreign-key>" +
"<field-reference>" +
"<source-field table=\"XR_PHONE\" name=\"EMP_ID\" xsi:type=\"column\"/>" +
"<target-field table=\"XR_EMPLOYEE\" name=\"EMP_ID\" xsi:type=\"column\"/>" +
"</field-reference>" +
"</target-foreign-key>" +
"<batch-reading>true</batch-reading>" +
"<container xsi:type=\"container-policy\">" +
"<collection-type>java.util.ArrayList</collection-type>" +
"</container>" +
"<selection-query xsi:type=\"read-all-query\">" +
"<container xsi:type=\"container-policy\">" +
"<collection-type>java.util.ArrayList</collection-type>" +
"</container>" +
"<order-by-expressions>" +
"<expression function=\"ascending\" xsi:type=\"function-expression\">" +
"<arguments>" +
"<argument name=\"type\" xsi:type=\"query-key-expression\">" +
"<base xsi:type=\"base-expression\"/>" +
"</argument>" +
"</arguments>" +
"</expression>" +
"</order-by-expressions>" +
"</selection-query>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-collection-mapping\">" +
"<attribute-name>responsibilities</attribute-name>" +
"<batch-reading>true</batch-reading>" +
"<container xsi:type=\"container-policy\">" +
"<collection-type>java.util.ArrayList</collection-type>" +
"</container>" +
"<selection-query xsi:type=\"direct-read-query\">" +
"<maintain-cache>false</maintain-cache>" +
"<container xsi:type=\"container-policy\">" +
"<collection-type>java.util.ArrayList</collection-type>" +
"</container>" +
"</selection-query>" +
"<reference-table>XR_RESPONS</reference-table>" +
"<direct-field table=\"XR_RESPONS\" name=\"DESCRIP\" xsi:type=\"column\"/>" +
"<reference-foreign-key>" +
"<field-reference>" +
"<source-field table=\"XR_RESPONS\" name=\"EMP_ID\" xsi:type=\"column\"/>" +
"<target-field table=\"XR_EMPLOYEE\" name=\"EMP_ID\" xsi:type=\"column\"/>" +
"</field-reference>" +
"</reference-foreign-key>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>salary</attribute-name>" +
"<field table=\"XR_SALARY\" name=\"SALARY\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>startDate</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"START_DATE\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>startTime</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"START_TIME\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>version</attribute-name>" +
"<field table=\"XR_EMPLOYEE\" name=\"VERSION\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"</attribute-mappings>" +
"<descriptor-type>independent</descriptor-type>" +
"<instantiation/>" +
"<copying xsi:type=\"instantiation-copy-policy\"/>" +
"<change-policy xsi:type=\"deferred-detection-change-policy\"/>" +
"<tables>" +
"<table name=\"XR_EMPLOYEE\"/>" +
"<table name=\"XR_SALARY\"/>" +
"</tables>" +
"</class-mapping-descriptor>" +
"<class-mapping-descriptor xsi:type=\"relational-class-mapping-descriptor\">" +
"<class>dbws.testing.relationships.RelationshipsPhone</class>" +
"<alias>phone</alias>" +
"<primary-key>" +
"<field table=\"XR_PHONE\" name=\"EMP_ID\" xsi:type=\"column\"/>" +
"<field table=\"XR_PHONE\" name=\"TYPE\" xsi:type=\"column\"/>" +
"</primary-key>" +
"<events xsi:type=\"event-policy\"/>" +
"<querying xsi:type=\"query-policy\"/>" +
"<attribute-mappings>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>areaCode</attribute-name>" +
"<field table=\"XR_PHONE\" name=\"AREA_CODE\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>empId</attribute-name>" +
"<field table=\"XR_PHONE\" name=\"EMP_ID\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>phonenumber</attribute-name>" +
"<field table=\"XR_PHONE\" name=\"P_NUMBER\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"<attribute-mapping xsi:type=\"direct-mapping\">" +
"<attribute-name>type</attribute-name>" +
"<field table=\"XR_PHONE\" name=\"TYPE\" xsi:type=\"column\"/>" +
"</attribute-mapping>" +
"</attribute-mappings>" +
"<descriptor-type>independent</descriptor-type>" +
"<instantiation/>" +
"<copying xsi:type=\"instantiation-copy-policy\"/>" +
"<change-policy xsi:type=\"deferred-detection-change-policy\"/>" +
"<tables>" +
"<table name=\"XR_PHONE\"/>" +
"</tables>" +
"</class-mapping-descriptor>" +
"<class-mapping-descriptor xsi:type=\"class-mapping-descriptor\">" +
"<class>org.eclipse.persistence.internal.xr.XRDynamicEntity_CollectionWrapper</class>" +
"<alias>XRDynamicEntity_CollectionWrapper</alias>" +
"<events xsi:type=\"event-policy\"/>" +
"<querying xsi:type=\"query-policy\"/>" +
"<attribute-mappings>" +
"<attribute-mapping xsi:type=\"aggregate-collection-mapping\">" +
"<attribute-name>items</attribute-name>" +
"<private-owned>true</private-owned>" +
"<cascade-persist>true</cascade-persist>" +
"<cascade-merge>true</cascade-merge>" +
"<cascade-refresh>true</cascade-refresh>" +
"<cascade-remove>true</cascade-remove>" +
"<container xsi:type=\"list-container-policy\">" +
"<collection-type>java.util.ArrayList</collection-type>" +
"</container>" +
"<selection-query xsi:type=\"read-all-query\">" +
"<container xsi:type=\"list-container-policy\">" +
"<collection-type>java.util.ArrayList</collection-type>" +
"</container>" +
"</selection-query>" +
"</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\"/>" +
"</class-mapping-descriptor>" +
"</class-mapping-descriptors>" +
"<login xsi:type=\"database-login\">\n" +
"<bind-all-parameters>true</bind-all-parameters>\n" +
"</login>\n" +
"</object-persistence>";
static final String RELATIONSHIPS_OX_PROJECT =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<object-persistence version=\"Eclipse Persistence Services - @VERSION@ (Build @BUILD_NUMBER@)\"\n" +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
"xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence\"\n" +
">\n" +
"<name>relationships</name>\n" +
"<class-mapping-descriptors>\n" +
"<class-mapping-descriptor xsi:type=\"xml-class-mapping-descriptor\">\n" +
"<class>dbws.testing.relationships.RelationshipsAddress</class>\n" +
"<alias>address</alias>\n" +
"<events xsi:type=\"event-policy\"/>\n" +
"<querying xsi:type=\"query-policy\"/>\n" +
"<attribute-mappings>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>addressId</attribute-name>\n" +
"<field name=\"@address-id/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>street</attribute-name>\n" +
"<field name=\"street/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>city</attribute-name>\n" +
"<field name=\"city/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>province</attribute-name>\n" +
"<field name=\"province/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>postalCode</attribute-name>\n" +
"<field name=\"postal-code/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>country</attribute-name>\n" +
"<field name=\"country/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"</attribute-mappings>\n" +
"<descriptor-type>aggregate</descriptor-type>\n" +
"<default-root-element>address</default-root-element>\n" +
"<namespace-resolver>" +
"<default-namespace-uri>urn:relationships</default-namespace-uri>" +
"</namespace-resolver>" +
"<schema xsi:type=\"schema-url-reference\">" +
"<resource></resource>" +
"<schema-context>/address</schema-context>" +
"<node-type>complex-type</node-type>" +
"</schema>" +
"</class-mapping-descriptor>\n" +
"<class-mapping-descriptor xsi:type=\"xml-class-mapping-descriptor\">\n" +
"<class>dbws.testing.relationships.RelationshipsEmployee</class>\n" +
"<alias>employee</alias>\n" +
"<events xsi:type=\"event-policy\"/>\n" +
"<querying xsi:type=\"query-policy\"/>\n" +
"<attribute-mappings>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>empId</attribute-name>\n" +
"<field name=\"@emp-id/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>firstName</attribute-name>\n" +
"<field name=\"first-name/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>lastName</attribute-name>\n" +
"<field name=\"last-name/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-composite-object-mapping\">\n" +
"<attribute-name>address</attribute-name>\n" +
"<reference-class>dbws.testing.relationships.RelationshipsAddress</reference-class>\n" +
"<field name=\"address\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-composite-collection-mapping\">\n" +
"<attribute-name>phones</attribute-name>\n" +
"<reference-class>dbws.testing.relationships.RelationshipsPhone</reference-class>\n" +
"<field name=\"phones/phone\" xsi:type=\"node\"/>\n" +
"<container xsi:type=\"container-policy\">\n" +
"<collection-type>java.util.Vector</collection-type>\n" +
"</container>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-composite-direct-collection-mapping\">\n" +
"<attribute-name>responsibilities</attribute-name>\n" +
"<field name=\"responsibilities/responsibility/text()\" xsi:type=\"node\"/>\n" +
"<container xsi:type=\"container-policy\">\n" +
"<collection-type>java.util.Vector</collection-type>\n" +
"</container>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>startTime</attribute-name>\n" +
"<field name=\"start-time/text()\" xsi:type=\"node\">\n" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}time</schema-type>\n" +
"</field>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>startDate</attribute-name>\n" +
"<field name=\"start-date/text()\" xsi:type=\"node\">\n" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}date</schema-type>\n" +
"</field>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>endDate</attribute-name>\n" +
"<field name=\"end-date/text()\" xsi:type=\"node\">\n" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}date</schema-type>\n" +
"</field>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>endTime</attribute-name>\n" +
"<field name=\"end-time/text()\" xsi:type=\"node\">\n" +
"<schema-type>{http://www.w3.org/2001/XMLSchema}time</schema-type>\n" +
"</field>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>gender</attribute-name>\n" +
"<field name=\"gender/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>salary</attribute-name>\n" +
"<field name=\"salary/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>version</attribute-name>\n" +
"<field name=\"version/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"</attribute-mappings>\n" +
"<descriptor-type>aggregate</descriptor-type>\n" +
"<default-root-element>employee</default-root-element>\n" +
"<namespace-resolver>" +
"<default-namespace-uri>urn:relationships</default-namespace-uri>" +
"</namespace-resolver>" +
"<schema xsi:type=\"schema-url-reference\">" +
"<resource></resource>" +
"<schema-context>/employee</schema-context>" +
"<node-type>complex-type</node-type>" +
"</schema>" +
"</class-mapping-descriptor>\n" +
"<class-mapping-descriptor xsi:type=\"xml-class-mapping-descriptor\">\n" +
"<class>dbws.testing.relationships.RelationshipsPhone</class>\n" +
"<alias>phone</alias>\n" +
"<events xsi:type=\"event-policy\"/>\n" +
"<querying xsi:type=\"query-policy\"/>\n" +
"<attribute-mappings>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>areaCode</attribute-name>\n" +
"<field name=\"area-code/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>phonenumber</attribute-name>\n" +
"<field name=\"phonenumber/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"<attribute-mapping xsi:type=\"xml-direct-mapping\">\n" +
"<attribute-name>type</attribute-name>\n" +
"<field name=\"type/text()\" xsi:type=\"node\"/>\n" +
"</attribute-mapping>\n" +
"</attribute-mappings>\n" +
"<descriptor-type>aggregate</descriptor-type>\n" +
"<default-root-element>phone</default-root-element>\n" +
"<namespace-resolver>" +
"<default-namespace-uri>urn:relationships</default-namespace-uri>" +
"</namespace-resolver>" +
"<schema xsi:type=\"schema-url-reference\">" +
"<resource></resource>" +
"<schema-context>/phone</schema-context>" +
"<node-type>complex-type</node-type>" +
"</schema>" +
"</class-mapping-descriptor>\n" +
"<class-mapping-descriptor xsi:type=\"xml-class-mapping-descriptor\">\n" +
"<class>org.eclipse.persistence.internal.xr.XRDynamicEntity_CollectionWrapper</class>\n" +
"<alias>XRDynamicEntity_CollectionWrapper</alias>\n" +
"<events xsi:type=\"event-policy\"/>\n" +
"<querying xsi:type=\"query-policy\"/>\n" +
"<attribute-mappings>\n" +
"<attribute-mapping xsi:type=\"xml-any-collection-mapping\">\n" +
"<attribute-name>items</attribute-name>\n" +
"<container xsi:type=\"list-container-policy\">\n" +
"<collection-type>java.util.ArrayList</collection-type>\n" +
"</container>\n" +
"<keep-as-element-policy>KEEP_NONE_AS_ELEMENT</keep-as-element-policy>\n" +
"</attribute-mapping>\n" +
"</attribute-mappings>\n" +
"<descriptor-type>aggregate</descriptor-type>\n" +
"<instantiation/>\n" +
"<copying xsi:type=\"instantiation-copy-policy\"/>\n" +
"<change-policy xsi:type=\"deferred-detection-change-policy\"/>\n" +
"<default-root-element>employee-collection</default-root-element>\n" +
"<namespace-resolver>" +
"<namespaces>\n" +
"<namespace>\n" +
"<prefix>xsd</prefix>\n" +
"<namespace-uri>http://www.w3.org/2001/XMLSchema</namespace-uri>\n" +
"</namespace>\n" +
"<namespace>\n" +
"<prefix>xsi</prefix>\n" +
"<namespace-uri>http://www.w3.org/2001/XMLSchema-instance</namespace-uri>\n" +
"</namespace>\n" +
"</namespaces>\n" +
"<default-namespace-uri>urn:relationships</default-namespace-uri>" +
"</namespace-resolver>" +
"</class-mapping-descriptor>\n" +
"</class-mapping-descriptors>\n" +
"<login xsi:type=\"xml-login\">\n" +
"<platform-class>org.eclipse.persistence.oxm.platform.DOMPlatform</platform-class>\n" +
"</login>\n" +
"</object-persistence>";
// test fixtures
public static final XMLComparer comparer = new XMLComparer();
public static final XMLPlatform xmlPlatform = XMLPlatformFactory.getInstance().getXMLPlatform();
public static final 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() {
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");
}
XRServiceFactory factory = new XRServiceFactory() {
@Override
public XRServiceAdapter buildService(XRServiceModel xrServiceModel) {
parentClassLoader = this.getClass().getClassLoader();
xrSchemaStream = new ByteArrayInputStream(RELATIONSHIPS_SCHEMA.getBytes());
return super.buildService(xrServiceModel);
}
@Override
public void buildSessions() {
XMLContext context = new XMLContext(
new EclipseLinkObjectPersistenceRuntimeXMLProject());
XMLUnmarshaller unmarshaller = context.createUnmarshaller();
Project orProject = (Project)unmarshaller.unmarshal(
new StringReader(RELATIONSHIPS_OR_PROJECT));
DatabaseLogin login = new DatabaseLogin();
login.setUserName(username);
login.setPassword(password);
login.setConnectionString(url);
login.setDriverClassName(driver);
Platform platform = new MySQLPlatform();
login.setDatasourcePlatform(platform);
login.bindAllParameters();
orProject.setDatasourceLogin(login);
Project oxProject = (Project)unmarshaller.unmarshal(
new StringReader(RELATIONSHIPS_OX_PROJECT));
ProjectHelper.fixOROXAccessors(orProject, oxProject);
xrService.setORSession(orProject.createDatabaseSession());
xrService.getORSession().dontLogMessages();
xrService.setXMLContext(new XMLContext(oxProject));
xrService.setOXSession(xrService.getXMLContext().getSession(0));
}
};
XMLContext context = new XMLContext(new DBWSModelProject());
XMLUnmarshaller unmarshaller = context.createUnmarshaller();
DBWSModel model = (DBWSModel)unmarshaller.unmarshal(new StringReader(RELATIONSHIPS_DBWS));
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("unchecked")
@Test
public void getAllEmployees() {
Invocation invocation = new Invocation("getAllEmployees");
Operation op = xrService.getOperation(invocation.getName());
Object result = op.invoke(xrService, invocation);
assertNotNull("result is null", result);
Vector<RelationshipsEmployee> resultVector = (Vector<RelationshipsEmployee>)result;
XRDynamicEntity_CollectionWrapper xrDynamicEntityCol = new XRDynamicEntity_CollectionWrapper();
for (RelationshipsEmployee employee : resultVector) {
xrDynamicEntityCol.add(employee);
}
Document doc = xmlPlatform.createDocument();
XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
marshaller.marshal(xrDynamicEntityCol, doc);
Document controlDoc = xmlParser.parse(new StringReader(EMPLOYEE_COLLECTION_XML));
assertTrue(
"control document: \n" + DBWSTestHelper.documentToString(controlDoc) +
"\n not same as XRService instance document: " + DBWSTestHelper.documentToString(doc),
comparer.isNodeEqual(controlDoc, doc)
);
}
public static final String EMPLOYEE_COLLECTION_XML =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<employee-collection xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"urn:relationships\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
"<employee emp-id=\"52\">" +
"<first-name>Betty</first-name>" +
"<last-name>Jones</last-name>" +
"<address address-id=\"56\">" +
"<street>1 Chocolate Drive</street>" +
"<city>Smith Falls</city>" +
"<province>ONT</province>" +
"<postal-code>C6C6C6</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>905</area-code>" +
"<phonenumber>5553691</phonenumber>" +
"<type>ISDN</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2258812</phonenumber>" +
"<type>Work</type>" +
"</phone>" +
"</phones>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1995-01-01</start-date>" +
"<end-date>2001-12-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>F</gender>" +
"<salary>500001</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"53\">" +
"<first-name>Sarah</first-name>" +
"<last-name>Way</last-name>" +
"<address address-id=\"52\">" +
"<street>12 Merival Rd., suite 5</street>" +
"<city>Ottawa</city>" +
"<province>ONT</province>" +
"<postal-code>K5J2B5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>5551234</phonenumber>" +
"<type>Home</type>" +
"</phone>" +
"<phone>" +
"<area-code>905</area-code>" +
"<phonenumber>5553691</phonenumber>" +
"<type>ISDN</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2258812</phonenumber>" +
"<type>Work</type>" +
"</phone>" +
"</phones>" +
"<responsibilities>" +
"<responsibility>Write code documentation.</responsibility>" +
"</responsibilities>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1995-05-01</start-date>" +
"<end-date>2001-07-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>F</gender>" +
"<salary>87000</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"54\">" +
"<first-name>Emanual</first-name>" +
"<last-name>Smith</last-name>" +
"<address address-id=\"53\">" +
"<street>1111 Mountain Blvd. Floor 53, suite 6</street>" +
"<city>Vancouver</city>" +
"<province>BC</province>" +
"<postal-code>N5J2N5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>416</area-code>" +
"<phonenumber>5551111</phonenumber>" +
"<type>Cellular</type>" +
"</phone>" +
"<phone>" +
"<area-code>905</area-code>" +
"<phonenumber>5553691</phonenumber>" +
"<type>ISDN</type>" +
"</phone>" +
"<phone>" +
"<area-code>976</area-code>" +
"<phonenumber>5556666</phonenumber>" +
"<type>Pager</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2255943</phonenumber>" +
"<type>Work Fax</type>" +
"</phone>" +
"</phones>" +
"<responsibilities>" +
"<responsibility>Have to fix the Database problem.</responsibility>" +
"</responsibilities>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1995-01-01</start-date>" +
"<end-date>2001-12-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>M</gender>" +
"<salary>49631</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"55\">" +
"<first-name>Marcus</first-name>" +
"<last-name>Saunders</last-name>" +
"<address address-id=\"58\">" +
"<street>234 I'm Lost Lane</street>" +
"<city>Perth</city>" +
"<province>ONT</province>" +
"<postal-code>Y3Q2N9</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>905</area-code>" +
"<phonenumber>5553691</phonenumber>" +
"<type>ISDN</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2258812</phonenumber>" +
"<type>Work</type>" +
"</phone>" +
"</phones>" +
"<responsibilities>" +
"<responsibility>Write user specifications.</responsibility>" +
"</responsibilities>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1995-01-12</start-date>" +
"<end-date>2001-12-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>M</gender>" +
"<salary>54300</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"56\">" +
"<first-name>Sarah-loo</first-name>" +
"<last-name>Smitty</last-name>" +
"<address address-id=\"55\">" +
"<street>1 Nowhere Drive</street>" +
"<city>Arnprior</city>" +
"<province>ONT</province>" +
"<postal-code>W1A2B5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>416</area-code>" +
"<phonenumber>5551111</phonenumber>" +
"<type>Cellular</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>5551234</phonenumber>" +
"<type>Home</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2255943</phonenumber>" +
"<type>Work Fax</type>" +
"</phone>" +
"</phones>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1993-01-01</start-date>" +
"<end-date>1996-01-01</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>F</gender>" +
"<salary>75000</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"57\">" +
"<first-name>Nancy</first-name>" +
"<last-name>White</last-name>" +
"<address address-id=\"62\">" +
"<street>2 Anderson Rd.</street>" +
"<city>Metcalfe</city>" +
"<province>ONT</province>" +
"<postal-code>Y4F7V6</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>5551234</phonenumber>" +
"<type>Home</type>" +
"</phone>" +
"</phones>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1993-01-01</start-date>" +
"<end-date>1996-01-01</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>F</gender>" +
"<salary>31000</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"58\">" +
"<first-name>Jill</first-name>" +
"<last-name>May</last-name>" +
"<address address-id=\"61\">" +
"<street>1111 Moose Rd.</street>" +
"<city>Calgary</city>" +
"<province>ALB</province>" +
"<postal-code>J5J2B5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2258812</phonenumber>" +
"<type>Work</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2255943</phonenumber>" +
"<type>Work Fax</type>" +
"</phone>" +
"</phones>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1991-11-11</start-date>" +
"<end-date>2006-08-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>F</gender>" +
"<salary>56232</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"59\">" +
"<first-name>Charles</first-name>" +
"<last-name>Chanley</last-name>" +
"<address address-id=\"59\">" +
"<street>1 Habs Place</street>" +
"<city>Montreal</city>" +
"<province>QUE</province>" +
"<postal-code>Q2S5Z5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>905</area-code>" +
"<phonenumber>5553691</phonenumber>" +
"<type>ISDN</type>" +
"</phone>" +
"<phone>" +
"<area-code>976</area-code>" +
"<phonenumber>5556666</phonenumber>" +
"<type>Pager</type>" +
"</phone>" +
"</phones>" +
"<responsibilities>" +
"<responsibility>Write lots of Java code.</responsibility>" +
"</responsibilities>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1995-01-01</start-date>" +
"<end-date>2001-12-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>M</gender>" +
"<salary>43000</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"60\">" +
"<first-name>Fred</first-name>" +
"<last-name>Jones</last-name>" +
"<address address-id=\"63\">" +
"<street>382 Hyde Park</street>" +
"<city>Victoria</city>" +
"<province>BC</province>" +
"<postal-code>Z5J2N5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>416</area-code>" +
"<phonenumber>5551111</phonenumber>" +
"<type>Cellular</type>" +
"</phone>" +
"<phone>" +
"<area-code>905</area-code>" +
"<phonenumber>5553691</phonenumber>" +
"<type>ISDN</type>" +
"</phone>" +
"</phones>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1995-01-01</start-date>" +
"<end-date>2001-12-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>M</gender>" +
"<salary>500000</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"61\">" +
"<first-name>Bob</first-name>" +
"<last-name>Smith</last-name>" +
"<address address-id=\"57\">" +
"<street>1450 Acme Cr., suite 4</street>" +
"<city>Toronto</city>" +
"<province>ONT</province>" +
"<postal-code>L5J2B5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2258812</phonenumber>" +
"<type>Work</type>" +
"</phone>" +
"</phones>" +
"<responsibilities>" +
"<responsibility>Clean the kitchen.</responsibility>" +
"<responsibility>Make the coffee.</responsibility>" +
"</responsibilities>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1993-01-01</start-date>" +
"<end-date>1996-01-01</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>M</gender>" +
"<salary>35000</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"62\">" +
"<first-name>John</first-name>" +
"<last-name>Way</last-name>" +
"<address address-id=\"54\">" +
"<street>12 Merival Rd., suite 5</street>" +
"<city>Ottawa</city>" +
"<province>ONT</province>" +
"<postal-code>K5J2B5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>905</area-code>" +
"<phonenumber>5553691</phonenumber>" +
"<type>ISDN</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>2258812</phonenumber>" +
"<type>Work</type>" +
"</phone>" +
"</phones>" +
"<responsibilities>" +
"<responsibility>Fire people for goofing off.</responsibility>" +
"<responsibility>Hire people when more people are required.</responsibility>" +
"</responsibilities>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1991-11-11</start-date>" +
"<end-date>2006-08-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>M</gender>" +
"<salary>53000</salary>" +
"<version>1</version>" +
"</employee>" +
"<employee emp-id=\"63\">" +
"<first-name>Jim-bob</first-name>" +
"<last-name>Jefferson</last-name>" +
"<address address-id=\"60\">" +
"<street>1112 Gold Rush rd.</street>" +
"<city>Yellow Knife</city>" +
"<province>YK</province>" +
"<postal-code>Y5J2N5</postal-code>" +
"<country>Canada</country>" +
"</address>" +
"<phones>" +
"<phone>" +
"<area-code>416</area-code>" +
"<phonenumber>5551111</phonenumber>" +
"<type>Cellular</type>" +
"</phone>" +
"<phone>" +
"<area-code>613</area-code>" +
"<phonenumber>5551234</phonenumber>" +
"<type>Home</type>" +
"</phone>" +
"</phones>" +
"<start-time>00:00:00"+TIMEZONE_OFFSET+"</start-time>" +
"<start-date>1995-01-12</start-date>" +
"<end-date>2001-12-31</end-date>" +
"<end-time>00:00:00"+TIMEZONE_OFFSET+"</end-time>" +
"<gender>M</gender>" +
"<salary>50000</salary>" +
"<version>1</version>" +
"</employee>" +
"</employee-collection>";
}