/*
 * Copyright (c) 2011, 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:
//     David McCann - October 24, 2011 - 2.4 - Initial implementation
package dbws.testing.objecttype;

//javase imports
import java.io.StringReader;
import java.sql.SQLException;
import java.sql.Statement;
import org.w3c.dom.Document;

//java eXtension imports
import javax.wsdl.WSDLException;

//JUnit4 imports
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

//EclipseLink imports
import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.internal.xr.Invocation;
import org.eclipse.persistence.internal.xr.Operation;
import org.eclipse.persistence.oxm.XMLMarshaller;
import org.eclipse.persistence.oxm.XMLUnmarshaller;
import org.eclipse.persistence.sessions.Project;

//test imports
import dbws.testing.DBWSTestSuite;

/**
 * Tests Oracle Object types.
 *
 */
public class ObjectTypeTestSuite extends DBWSTestSuite {
    static final String EMP_TYPE_ALIAS = "Dbws_emp_type";
    static final String EMP_TYPE_CLASSNAME = "objecttypetests.Dbws_emp_type";
    static final String PHONE_TYPE_ALIAS = "Dbws_phone_type";
    static final String PHONE_TYPE_CLASSNAME = "objecttypetests.Dbws_phone_type";

    //==============================================================================
    static final String CREATE_MYTYPE =
        "CREATE OR REPLACE TYPE MYTYPE_1 AS OBJECT (" +
            "\nid INTEGER," +
            "\nname VARCHAR2(30)" +
        "\n)";

    static final String CREATE_MYTYPE_ARRAY =
        "CREATE OR REPLACE TYPE MYTYPE_1_ARRAY AS VARRAY(10) OF MYTYPE_1;";

    static final String CREATE_MYTYPE_PKG =
        "CREATE OR REPLACE PACKAGE USERTYPEINOUT AS" +
            "\nPROCEDURE TEST_IN_AND_OUT(P1 IN MYTYPE_1, P2 OUT MYTYPE_1);" +
            "\nPROCEDURE TEST_OUT(P1 OUT MYTYPE_1);" +
            "\nPROCEDURE TEST_IN(P1 IN MYTYPE_1);" +
            "\nPROCEDURE TEST_INOUT(P1 IN OUT MYTYPE_1);" +
            "\nFUNCTION ECHO_MYTYPE_1_ARRAY(P1 MYTYPE_1_ARRAY) RETURN MYTYPE_1_ARRAY;" +
            "\nPROCEDURE TEST_MULTI_IN_AND_OUT(P1 IN MYTYPE_1, P2 IN VARCHAR2, P3 IN INTEGER, P4 OUT MYTYPE_1);" +
        "\nEND USERTYPEINOUT;";

    static final String CREATE_MYTYPE_PKG_BODY =
        "CREATE OR REPLACE PACKAGE BODY USERTYPEINOUT AS" +
            "\nPROCEDURE TEST_IN_AND_OUT(P1 IN MYTYPE_1, P2 OUT MYTYPE_1) AS" +
            "\nBEGIN" +
                "\nP2 := P1;" +
            "\nEND TEST_IN_AND_OUT; " +
            "\nPROCEDURE TEST_OUT(P1 OUT MYTYPE_1) AS" +
            "\nBEGIN" +
                "\nP1 := MYTYPE_1(66, 'Steve French');" +
            "\nEND TEST_OUT; " +
            "\nPROCEDURE TEST_IN(P1 IN MYTYPE_1) AS" +
            "\nBEGIN" +
                "\nNULL;" +
            "\nEND TEST_IN; " +
            "\nPROCEDURE TEST_INOUT(P1 IN OUT MYTYPE_1) AS" +
            "\nBEGIN" +
                "\nNULL;" +
            "\nEND TEST_INOUT; " +
            "\nFUNCTION ECHO_MYTYPE_1_ARRAY(P1 MYTYPE_1_ARRAY) RETURN MYTYPE_1_ARRAY AS" +
            "\nBEGIN" +
                "\nRETURN P1;" +
            "\nEND ECHO_MYTYPE_1_ARRAY;" +
            "\nPROCEDURE TEST_MULTI_IN_AND_OUT(P1 IN MYTYPE_1, P2 IN VARCHAR2, P3 IN INTEGER, P4 OUT MYTYPE_1) AS" +
            "\nBEGIN" +
                "\nP4 := MYTYPE_1(P1.id + P3, concat(P1.name, P2));" +
            "\nEND TEST_MULTI_IN_AND_OUT; " +
        "\nEND USERTYPEINOUT;";
    //==============================================================================

    static final String CREATE_PHONE_TYPE =
        "CREATE OR REPLACE TYPE DBWS_PHONE_TYPE AS OBJECT (" +
            "\nHOME VARCHAR2(20)," +
            "\nCELL VARCHAR2(20)" +
        "\n)";
    static final String CREATE_EMP_TYPE =
        "CREATE OR REPLACE TYPE DBWS_EMP_TYPE AS OBJECT (" +
            "\nID NUMBER," +
            "\nNAME VARCHAR2(20)," +
            "\nPHONE DBWS_PHONE_TYPE" +
        "\n)";
    static final String CREATE_EMP_TYPE_TABLE =
        "CREATE TABLE DBWS_EMP_TYPE_TABLE OF DBWS_EMP_TYPE";
    static final String[] POPULATE_EMP_TYPE_TABLE = new String[] {
        "INSERT INTO DBWS_EMP_TYPE_TABLE VALUES (" +
            "DBWS_EMP_TYPE(66, 'BUBBLES', DBWS_PHONE_TYPE('(613) 234-4567', '(613) 858-3434')))",
        "INSERT INTO DBWS_EMP_TYPE_TABLE VALUES (" +
            "DBWS_EMP_TYPE(69, 'RICKY', DBWS_PHONE_TYPE('(613) 344-1232', '(613) 823-2323')))",
        "INSERT INTO DBWS_EMP_TYPE_TABLE VALUES (" +
            "DBWS_EMP_TYPE(99, 'JULIAN', DBWS_PHONE_TYPE('(613) 424-0987', '(613) 555-8888')))"
        };
    static final String CREATE_GET_EMP_TYPE_BY_ID_PROC =
        "CREATE OR REPLACE PROCEDURE GET_EMP_TYPE_BY_ID(EID IN NUMBER, ETYPE OUT DBWS_EMP_TYPE) AS" +
        "\nBEGIN" +
            "\nSELECT VALUE(E) INTO ETYPE FROM DBWS_EMP_TYPE_TABLE E WHERE E.ID = EID;" +
        "\nEND GET_EMP_TYPE_BY_ID;";
    static final String CREATE_GET_EMP_TYPE_BY_ID_2_FUNC =
        "CREATE OR REPLACE FUNCTION GET_EMP_TYPE_BY_ID_2(EID IN NUMBER) RETURN DBWS_EMP_TYPE AS" +
        "\nETYPE DBWS_EMP_TYPE;" +
        "\nBEGIN" +
            "\nSELECT VALUE(E) INTO ETYPE FROM DBWS_EMP_TYPE_TABLE E WHERE E.ID = EID;" +
            "\nRETURN ETYPE;" +
        "\nEND GET_EMP_TYPE_BY_ID_2;";
    static final String CREATE_ADD_EMP_TYPE_PROC =
        "CREATE OR REPLACE PROCEDURE ADD_EMP_TYPE(ETYPE IN DBWS_EMP_TYPE, RESULT OUT DBWS_EMP_TYPE) AS" +
        "\nBEGIN" +
            "\nDELETE FROM DBWS_EMP_TYPE_TABLE WHERE ID = ETYPE.ID;" +
            "\nINSERT INTO DBWS_EMP_TYPE_TABLE VALUES (ETYPE);" +
            "\nSELECT VALUE(E) INTO RESULT FROM DBWS_EMP_TYPE_TABLE E WHERE E.ID = ETYPE.ID;" +
            "\nDELETE FROM DBWS_EMP_TYPE_TABLE WHERE ID = ETYPE.ID;" +
        "\nEND ADD_EMP_TYPE;";
    static final String CREATE_ADD_EMP_TYPE2_FUNC =
        "CREATE OR REPLACE FUNCTION ADD_EMP_TYPE2(ETYPE IN DBWS_EMP_TYPE) RETURN DBWS_EMP_TYPE AS" +
        "\nRESULT DBWS_EMP_TYPE;" +
        "\nBEGIN" +
            "\nADD_EMP_TYPE(ETYPE, RESULT);" +
            "\nRETURN RESULT;" +
        "\nEND ADD_EMP_TYPE2;";
    static final String DROP_PHONE_TYPE =
        "DROP TYPE DBWS_PHONE_TYPE FORCE";
    static final String DROP_EMP_TYPE =
        "DROP TYPE DBWS_EMP_TYPE FORCE";
    static final String DROP_EMP_TYPE_TABLE =
        "DROP TABLE DBWS_EMP_TYPE_TABLE FORCE";
    static final String DROP_GET_EMP_TYPE_BY_ID_PROC =
        "DROP PROCEDURE GET_EMP_TYPE_BY_ID";
    static final String DROP_GET_EMP_TYPE_BY_ID_2_FUNC =
        "DROP FUNCTION GET_EMP_TYPE_BY_ID_2";
    static final String DROP_ADD_EMP_TYPE_PROC =
        "DROP PROCEDURE ADD_EMP_TYPE";
    static final String DROP_ADD_EMP_TYPE2_FUNC =
        "DROP FUNCTION ADD_EMP_TYPE2";
    static final String DROP_TYPE_MYTYPE_1 =
        "DROP TYPE MYTYPE_1";
    static final String DROP_TYPE_MYTYPE_1_ARRAY =
        "DROP TYPE MYTYPE_1_ARRAY";
    static final String DROP_PACKAGE_USER_TYPE_INOUT =
        "DROP PACKAGE USERTYPEINOUT";
    static final String DROP_PACKAGE_BODY_USER_TYPE_INOUT =
        "DROP PACKAGE BODY USERTYPEINOUT";

    static boolean ddlCreate = false;
    static boolean ddlDrop = false;
    static boolean ddlDebug = false;

    @BeforeClass
    public static void setUp() throws WSDLException {
        if (conn == null) {
            try {
                conn = buildConnection();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        //because of behaviour of DBWS_EMP_TYPE_TABLE w.r.t. identity, force create/drop
        //no matter what the external properties say
        ddlCreate = true;
        ddlDrop = true;
        String ddlDebugProp = System.getProperty(DATABASE_DDL_DEBUG_KEY, DEFAULT_DATABASE_DDL_DEBUG);
        if ("true".equalsIgnoreCase(ddlDebugProp)) {
            ddlDebug = true;
        }
        if (ddlCreate) {
            runDdl(conn, CREATE_PHONE_TYPE, ddlDebug);
            runDdl(conn, CREATE_EMP_TYPE, ddlDebug);
            runDdl(conn, CREATE_EMP_TYPE_TABLE, ddlDebug);
            runDdl(conn, CREATE_GET_EMP_TYPE_BY_ID_PROC, ddlDebug);
            runDdl(conn, CREATE_GET_EMP_TYPE_BY_ID_2_FUNC, ddlDebug);
            runDdl(conn, CREATE_ADD_EMP_TYPE_PROC, ddlDebug);
            runDdl(conn, CREATE_ADD_EMP_TYPE2_FUNC, ddlDebug);
            runDdl(conn, CREATE_MYTYPE, ddlDebug);
            runDdl(conn, CREATE_MYTYPE_ARRAY, ddlDebug);
            runDdl(conn, CREATE_MYTYPE_PKG, ddlDebug);
            runDdl(conn, CREATE_MYTYPE_PKG_BODY, ddlDebug);
            try {
                Statement stmt = conn.createStatement();
                for (int i = 0; i < POPULATE_EMP_TYPE_TABLE.length; i++) {
                    stmt.addBatch(POPULATE_EMP_TYPE_TABLE[i]);
                }
                stmt.executeBatch();
            }
            catch (SQLException e) {
                if (ddlDebug) {
                    e.printStackTrace();
                }
            }
        }
        DBWS_BUILDER_XML_USERNAME =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
            "<dbws-builder xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
              "<properties>" +
                  "<property name=\"projectName\">ObjectTypeTests</property>" +
                  "<property name=\"logLevel\">off</property>" +
                  "<property name=\"username\">";
          DBWS_BUILDER_XML_PASSWORD =
                  "</property><property name=\"password\">";
          DBWS_BUILDER_XML_URL =
                  "</property><property name=\"url\">";
          DBWS_BUILDER_XML_DRIVER =
                  "</property><property name=\"driver\">";
          DBWS_BUILDER_XML_PLATFORM =
                  "</property><property name=\"platformClassname\">";
          DBWS_BUILDER_XML_MAIN =
                  "</property>" +
              "</properties>" +
              "<procedure " +
                  "name=\"GetEmpTypeByIdTest\" " +
                  "catalogPattern=\"TOPLEVEL\" " +
                  "procedurePattern=\"GET_EMP_TYPE_BY_ID\" " +
                  "isAdvancedJDBC=\"true\" " +
                  "returnType=\"dbws_emp_typeType\" " +
              "/>" +
              "<procedure " +
                  "name=\"GetEmpTypeByIdTest2\" " +
                  "catalogPattern=\"TOPLEVEL\" " +
                  "procedurePattern=\"GET_EMP_TYPE_BY_ID_2\" " +
                  "isAdvancedJDBC=\"true\" " +
                  "returnType=\"dbws_emp_typeType\" " +
              "/>" +
              "<procedure " +
                  "name=\"AddEmpTypeTest\" " +
                  "catalogPattern=\"TOPLEVEL\" " +
                  "procedurePattern=\"ADD_EMP_TYPE\" " +
                  "isAdvancedJDBC=\"true\" " +
                  "returnType=\"dbws_emp_typeType\" " +
              "/>" +
              "<procedure " +
                  "name=\"AddEmpTypeTest2\" " +
                  "catalogPattern=\"TOPLEVEL\" " +
                  "procedurePattern=\"ADD_EMP_TYPE2\" " +
                  "isAdvancedJDBC=\"true\" " +
                  "returnType=\"dbws_emp_typeType\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"TestIn\" " +
                  "catalogPattern=\"USERTYPEINOUT\" " +
                  "procedurePattern=\"TEST_IN\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"TestOut\" " +
                  "catalogPattern=\"USERTYPEINOUT\" " +
                  "procedurePattern=\"TEST_OUT\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"TestInAndOut\" " +
                  "catalogPattern=\"USERTYPEINOUT\" " +
                  "procedurePattern=\"TEST_IN_AND_OUT\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"TestInOut\" " +
                  "catalogPattern=\"USERTYPEINOUT\" " +
                  "procedurePattern=\"TEST_INOUT\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"TestEchoArray\" " +
                  "catalogPattern=\"USERTYPEINOUT\" " +
                  "procedurePattern=\"ECHO_MYTYPE_1_ARRAY\" " +
              "/>" +
              "<plsql-procedure " +
                  "name=\"TestMultiInAndOut\" " +
                  "catalogPattern=\"USERTYPEINOUT\" " +
                  "procedurePattern=\"TEST_MULTI_IN_AND_OUT\" " +
              "/>" +
            "</dbws-builder>";
          builder = null;
          DBWSTestSuite.setUp(".");
    }

    @AfterClass
    public static void tearDown() {
        if (ddlDrop) {
            runDdl(conn, DROP_EMP_TYPE_TABLE, ddlDebug);
            runDdl(conn, DROP_ADD_EMP_TYPE2_FUNC, ddlDebug);
            runDdl(conn, DROP_ADD_EMP_TYPE_PROC, ddlDebug);
            runDdl(conn, DROP_GET_EMP_TYPE_BY_ID_2_FUNC, ddlDebug);
            runDdl(conn, DROP_GET_EMP_TYPE_BY_ID_PROC, ddlDebug);
            runDdl(conn, DROP_EMP_TYPE, ddlDebug);
            runDdl(conn, DROP_PHONE_TYPE, ddlDebug);
            runDdl(conn, DROP_PACKAGE_BODY_USER_TYPE_INOUT, ddlDebug);
            runDdl(conn, DROP_PACKAGE_USER_TYPE_INOUT, ddlDebug);
            runDdl(conn, DROP_TYPE_MYTYPE_1_ARRAY, ddlDebug);
            runDdl(conn, DROP_TYPE_MYTYPE_1, ddlDebug);
        }
    }

    @Test
    public void getEmpTypeByIdTest() {
        Invocation invocation = new Invocation("GetEmpTypeByIdTest");
        invocation.setParameter("EID", 66);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(RESULT_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    static String RESULT_XML =
        REGULAR_XML_HEADER +
        "<dbws_emp_typeType xmlns=\"urn:ObjectTypeTests\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
            "<id>66</id>" +
            "<name>BUBBLES</name>" +
            "<phone>" +
                "<home>(613) 234-4567</home>" +
                "<cell>(613) 858-3434</cell>" +
            "</phone>" +
        "</dbws_emp_typeType>";

    @Test
    public void getEmpTypeByIdTest2() {
        Invocation invocation = new Invocation("GetEmpTypeByIdTest2");
        invocation.setParameter("EID", 69);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(RESULT2_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    static String RESULT2_XML =
        REGULAR_XML_HEADER +
        "<dbws_emp_typeType xmlns=\"urn:ObjectTypeTests\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
            "<id>69</id>" +
            "<name>RICKY</name>" +
            "<phone>" +
                "<home>(613) 344-1232</home>" +
                "<cell>(613) 823-2323</cell>" +
            "</phone>" +
        "</dbws_emp_typeType>";

    @Test
    public void addEmpTypeTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object eType = unmarshaller.unmarshal(new StringReader(ETYPE_XML));
        Invocation invocation = new Invocation("AddEmpTypeTest");
        invocation.setParameter("ETYPE", eType);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ETYPE_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    @Test
    public void addEmpTypeTest2() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object eType = unmarshaller.unmarshal(new StringReader(ETYPE_XML));
        Invocation invocation = new Invocation("AddEmpTypeTest2");
        invocation.setParameter("ETYPE", eType);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(ETYPE_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    static String ETYPE_XML =
        REGULAR_XML_HEADER +
        "<dbws_emp_typeType xmlns=\"urn:ObjectTypeTests\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
            "<id>9</id>" +
            "<name>LAHEY</name>" +
            "<phone>" +
                "<home>(902) 987-0011</home>" +
                "<cell>(902) 789-1100</cell>" +
            "</phone>" +
        "</dbws_emp_typeType>";

    @Test
    public void validateJavaClassName() {
        Project orProject = builder.getOrProject();
        ClassDescriptor empORDesc = orProject.getDescriptorForAlias(EMP_TYPE_ALIAS);
        assertNotNull("No OR descriptor found for alias [" + EMP_TYPE_ALIAS + "]", empORDesc);
        assertEquals("Expected class name [" + EMP_TYPE_CLASSNAME + "] but was [" + empORDesc.getJavaClassName() + "]", empORDesc.getJavaClassName(), EMP_TYPE_CLASSNAME);
        ClassDescriptor phoneORDesc = orProject.getDescriptorForAlias(PHONE_TYPE_ALIAS);
        assertNotNull("No OR descriptor found for alias [" + PHONE_TYPE_ALIAS + "]", phoneORDesc);
        assertEquals("Expected class name [" + PHONE_TYPE_CLASSNAME + "] but was [" + phoneORDesc.getJavaClassName() + "]", phoneORDesc.getJavaClassName(), PHONE_TYPE_CLASSNAME);

        Project oxProject = builder.getOxProject();
        ClassDescriptor empOXDesc = oxProject.getDescriptorForAlias(EMP_TYPE_ALIAS);
        assertNotNull("No OX descriptor found for alias [" + EMP_TYPE_ALIAS + "]", empOXDesc);
        assertEquals("Expected class name [" + EMP_TYPE_CLASSNAME + "] but was [" + empOXDesc.getJavaClassName() + "]", empOXDesc.getJavaClassName(), EMP_TYPE_CLASSNAME);
        ClassDescriptor phoneOXDesc = oxProject.getDescriptorForAlias(PHONE_TYPE_ALIAS);
        assertNotNull("No OX descriptor found for alias [" + PHONE_TYPE_ALIAS + "]", phoneOXDesc);
        assertEquals("Expected class name [" + PHONE_TYPE_CLASSNAME + "] but was [" + phoneOXDesc.getJavaClassName() + "]", phoneOXDesc.getJavaClassName(), PHONE_TYPE_CLASSNAME);
    }

    @Test
    public void inTypeTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object pType = unmarshaller.unmarshal(new StringReader(MYTYPE_XML));
        Invocation invocation = new Invocation("TestIn");
        invocation.setParameter("P1", pType);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(RETURN_VALUE_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    static String RETURN_VALUE_XML =
        "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" +
        "<value>1</value>";

    @Test
    public void outTypeTest() {
        Invocation invocation = new Invocation("TestOut");
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(MYTYPE_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    @Test
    public void inAndOutTypeTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object pType = unmarshaller.unmarshal(new StringReader(MYTYPE_XML));
        Invocation invocation = new Invocation("TestInAndOut");
        invocation.setParameter("P1", pType);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(MYTYPE_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    @Test
    public void inOutTypeTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object pType = unmarshaller.unmarshal(new StringReader(MYTYPE_XML));
        Invocation invocation = new Invocation("TestInOut");
        invocation.setParameter("P1", pType);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(MYTYPE_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    static String MYTYPE_XML =
        REGULAR_XML_HEADER +
        "<mytype_1Type xmlns=\"urn:ObjectTypeTests\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
            "<id>66</id>" +
            "<name>Steve French</name>" +
        "</mytype_1Type>";

    @Test
    public void arrayEchoTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object pType = unmarshaller.unmarshal(new StringReader(MYTYPE_ARRAY_XML));
        Invocation invocation = new Invocation("TestEchoArray");
        invocation.setParameter("P1", pType);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(MYTYPE_ARRAY_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    static String MYTYPE_ARRAY_XML =
        REGULAR_XML_HEADER +
        "<mytype_1_arrayType xmlns=\"urn:ObjectTypeTests\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
            "<item>" +
                "<id>66</id>" +
                "<name>Steve French</name>" +
            "</item>" +
        "</mytype_1_arrayType>";

    @Test
    public void multiInAndOutTest() {
        XMLUnmarshaller unmarshaller = xrService.getXMLContext().createUnmarshaller();
        Object pType = unmarshaller.unmarshal(new StringReader(MYTYPE_XML));
        Invocation invocation = new Invocation("TestMultiInAndOut");
        invocation.setParameter("P1", pType);
        invocation.setParameter("P2", " the Cougar!");
        invocation.setParameter("P3", 3);
        Operation op = xrService.getOperation(invocation.getName());
        Object result = op.invoke(xrService, invocation);
        assertNotNull("result is null", result);
        Document doc = xmlPlatform.createDocument();
        XMLMarshaller marshaller = xrService.getXMLContext().createMarshaller();
        marshaller.marshal(result, doc);
        Document controlDoc = xmlParser.parse(new StringReader(MYTYPE2_XML));
        assertTrue("Expected:\n" + documentToString(controlDoc) + "\nActual:\n" + documentToString(doc), comparer.isNodeEqual(controlDoc, doc));
    }
    static String MYTYPE2_XML =
        REGULAR_XML_HEADER +
        "<mytype_1Type xmlns=\"urn:ObjectTypeTests\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
            "<id>69</id>" +
            "<name>Steve French the Cougar!</name>" +
        "</mytype_1Type>";
}
