/*******************************************************************************
 * Copyright (c) 1998, 2016 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
 *     04/01/2016-2.7 Tomas Kraus
 *       - 490677: Database connection properties made configurable in test.properties
 ******************************************************************************/
package org.eclipse.persistence.testing.tests.eis.aq;

import javax.jms.JMSException;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;

import org.eclipse.persistence.testing.framework.junit.LogTestExecution;
import org.eclipse.persistence.testing.tests.nosql.NoSQLProperties;
import org.junit.Rule;
import org.junit.Test;

import oracle.jms.AQjmsFactory;

/**
 * Test connecting directly through the AQ JMS driver. Requires AQ installed on this database.
 */
public class JMSDirectConnectTest {

    /** Log the test being currently executed. */
    @Rule public LogTestExecution logExecution = new LogTestExecution();

    /**
     * Creates an instance of direct connection tests.
     */
    public JMSDirectConnectTest() {
    }

    /**
     * Create database connection using {@link TopicConnection}.
     * @return {@link TopicConnection} instance.
     */
    static TopicConnection connectTopic() throws JMSException {
        final TopicConnectionFactory connectionFactory
                = AQjmsFactory.getTopicConnectionFactory(NoSQLProperties.getDBURL(), null);
        return connectionFactory.createTopicConnection(
                NoSQLProperties.getDBUserName(), NoSQLProperties.getDBPassword());
    }

    /**
     * Create database connection using {@link QueueConnection}.
     * @return {@link TopicConnection} instance.
     */
    static QueueConnection connectQueue() throws JMSException {
        final QueueConnectionFactory connectionFactory
                = AQjmsFactory.getQueueConnectionFactory(NoSQLProperties.getDBURL(), null);
        return connectionFactory.createQueueConnection(
                NoSQLProperties.getDBUserName(), NoSQLProperties.getDBPassword());
    }

    /**
     * Test direct connection using {@link TopicConnection}.
     */
    @Test
    public void testConnectTopic() throws Exception {
        TopicSession session = null;
        TopicConnection connection = null;
        try {
            connection = connectTopic();
            session = connection.createTopicSession(true, Session.CLIENT_ACKNOWLEDGE);
            connection.start();
        } finally {
            if (session != null) {
                session.close();
            }
            if (connection != null) {
                connection.close();
            }
        }
    }

    /**
     * Test direct connection using {@link QueueConnection}.
     */
    @Test
    public void testConnectQueue() throws Exception {
        QueueConnection connection = null;
        QueueSession session = null;
        try {
            connection = connectQueue();
            session = connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
            connection.start();
        } finally {
            if (session != null) {
                session.close();
            }
            if (connection != null) {
                connection.close();
            }
        }
    }

}
