/*******************************************************************************
 * Copyright (c) 2011, 2013 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 v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * 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>";
}