/*******************************************************************************
 * Copyright (c) 1998, 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:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.tests.eis.aq;

import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.eis.*;
import org.eclipse.persistence.eis.adapters.aq.*;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.sessions.JNDIConnector;
import org.eclipse.persistence.sessions.factories.*;
import org.eclipse.persistence.testing.framework.*;

/**
 * Test TopLink EIS with the Oracle IP JCA drivers.
 */
public class AQTestModel extends TestModel {
    protected Session oldSession;

    public AQTestModel() {
        super();
        setDescription("Test TopLink EIS with the Oracle AQ drivers.");
    }

    public void addTests() {
        TestSuite jmsSuite = new TestSuite();
        jmsSuite.setName("JMSDirectTestSuite");
        jmsSuite.addTest(new JMSDirectConnectTest());
        jmsSuite.addTest(new JMSDirectInteractionTest());
        addTest(jmsSuite);

        TestSuite javaSuite = new TestSuite();
        javaSuite.setName("JavaDirectTestSuite");
        javaSuite.addTest(new JavaDirectConnectTest());
        javaSuite.addTest(new JavaDirectInteractionTest());
        addTest(javaSuite);

        TestSuite toplinkSuite = new TestSuite();
        toplinkSuite.setName("TopLinkTestSuite");
        toplinkSuite.addTest(new ConnectTest());
        toplinkSuite.addTest(new AuthenticationTest());
        toplinkSuite.addTest(new ReadWriteTest());
        toplinkSuite.addTest(new ReadTimeoutTest());
        toplinkSuite.addTest(new ReadUOWTest());
        addTest(toplinkSuite);
    }

    public void setup() {
        oldSession = getSession();
        DatabaseLogin login = (DatabaseLogin)oldSession.getLogin().clone();
        if (login.getConnector() instanceof JNDIConnector) {
            login.setConnector(new JNDIConnector("jdbc/OracleCoreAQ"));
        } else {
            login.setUserName("aquser");
            login.setPassword("aquser");
        }
        DatabaseSession session = new Project(login).createDatabaseSession();
        session.setSessionLog(getSession().getSessionLog());
        try {
            session.login();
        } catch (Exception exception) {
            throw new TestProblemException("Database needs to be setup for AQ, with the aquser", exception);
        }

        /** to setup aquser, need to execute,
            1 - login as sys (default password is password)
            - login as scott tiger
            connect sys/password@james as sysdba

            2 - might need to install aq procesures?
            - in sqlplus - @@<orahome>\ora92\rdbms\admin\catproc.sql

            3 - create a aq user (i.e aquser)
            grant connect, resource , aq_administrator_role to aquser identified by aquser
            grant execute on dbms_aq to aquser
            grant execute on dbms_aqadm to aquser
            grant execute on dbms_lock to aquser
            connect aquser/aquser
        */
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.STOP_QUEUE (queue_name => 'order_queue'); end;"));
        } catch (Exception notThere) {
        }
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.DROP_QUEUE (queue_name => 'order_queue'); end;"));
        } catch (Exception notThere) {
        }
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.DROP_QUEUE_TABLE (queue_table => 'order_queue_table'); end;"));
        } catch (Exception notThere) {
        }
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.STOP_QUEUE (queue_name => 'order_topic'); end;"));
        } catch (Exception notThere) {
        }
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.DROP_QUEUE (queue_name => 'order_topic'); end;"));
        } catch (Exception notThere) {
        }
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.DROP_QUEUE_TABLE (queue_table => 'order_topic_table'); end;"));
        } catch (Exception notThere) {
        }
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.STOP_QUEUE (queue_name => 'raw_order_queue'); end;"));
        } catch (Exception notThere) {
        }
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.DROP_QUEUE (queue_name => 'raw_order_queue'); end;"));
        } catch (Exception notThere) {
        }
        try {
            session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.DROP_QUEUE_TABLE (queue_table => 'raw_order_queue_table'); end;"));
        } catch (Exception notThere) {
        }

        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.CREATE_QUEUE_TABLE (queue_table => 'order_queue_table', multiple_consumers => FALSE, queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE'); end;"));
        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.CREATE_QUEUE (queue_name => 'order_queue', queue_table => 'order_queue_table'); end;"));
        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.START_QUEUE (queue_name => 'order_queue'); end;"));

        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.CREATE_QUEUE_TABLE (queue_table => 'order_topic_table', multiple_consumers => TRUE, queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE'); end;"));
        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.CREATE_QUEUE (queue_name => 'order_topic', queue_table => 'order_topic_table'); end;"));
        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.START_QUEUE (queue_name => 'order_topic'); end;"));

        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.CREATE_QUEUE_TABLE (queue_table => 'raw_order_queue_table', multiple_consumers => FALSE, queue_payload_type => 'RAW'); end;"));
        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.CREATE_QUEUE (queue_name => 'raw_order_queue', queue_table => 'raw_order_queue_table'); end;"));
        session.executeNonSelectingCall(new SQLCall("begin DBMS_AQADM.START_QUEUE (queue_name => 'raw_order_queue'); end;"));

        session = XMLProjectReader.read("org/eclipse/persistence/testing/models/order/eis/aq/order-project.xml", getClass().getClassLoader()).createDatabaseSession();
        session.setSessionLog(getSession().getSessionLog());

        //String url = oldSession.getLogin().getConnectionString();
		String url;
		try{
			url = ((AbstractSession)getSession()).getAccessor().getConnection().getMetaData().getURL();
		}catch(java.sql.SQLException se){
			se.printStackTrace();
			throw new TestErrorException("There is SQLException");
		}
        EISLogin eisLogin = (EISLogin)session.getDatasourceLogin();
        eisLogin.setConnectionSpec(new AQEISConnectionSpec());
        eisLogin.setProperty(AQEISConnectionSpec.URL, url);
        eisLogin.setUserName("aquser");
        eisLogin.setPassword("aquser");
        session.login();

        getExecutor().setSession(session);
    }

    public void reset() {
        getDatabaseSession().logout();
        getExecutor().setSession(oldSession);
    }

    /**
     * Return the JUnit suite to allow JUnit runner to find it.
     */
    public static junit.framework.TestSuite suite() {
        return new AQTestModel();
    }
}
