/*
 * Copyright (c) 1998, 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:
//     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.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;

import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.logging.SessionLog;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.testing.framework.junit.LogTestExecution;
import org.eclipse.persistence.testing.tests.nosql.ModelHelper;
import org.eclipse.persistence.testing.tests.nosql.NoSQLProperties;
import org.eclipse.persistence.testing.tests.nosql.SessionHelper;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import oracle.jms.AQjmsSession;

/**
 * Test direct interactions through the AQ JMS driver. Requires AQ installed on this database.
 */
public class JMSDirectInteractionTest extends JMSDirectConnectTest {

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

    /** Logger. */
    private static final SessionLog LOG = AbstractSessionLog.getLog();

    /** Relational database session. Required for model initialization. */
    DatabaseSession rDBSession;

    /**
     * Creates an instance of the test class.
     */
    public JMSDirectInteractionTest() {
    }

    /**
     * Set up this test suite.
     */
    @Before
    public void setUp() {
        // Use temporary relational database session to initialize the model.
        final Project project = SessionHelper.createModelProject(SessionHelper.createDatabaseLogin(), AQTestSuite.class);
        rDBSession = SessionHelper.createDatabaseSession(project);
    }

    /**
     * Clean up this test suite.
     */
    @After
    public void tearDown() {
        rDBSession.logout();
    }

    /**
     * Test AQ JMS driver direct interactions using {@link QueueConnection}.
     */
    @Test
    public void testQueue() throws Exception {
        ModelHelper.setupOrderQueue(rDBSession);
        QueueConnection connection = null;
        QueueSession session = null;
        try {
            connection = connectQueue();
            session = connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
            Queue queue = ((AQjmsSession)session).getQueue(NoSQLProperties.getDBUserName(), "order_queue");
            LOG.log(SessionLog.FINEST, queue.toString());
            QueueReceiver receiver = session.createReceiver(queue);
            LOG.log(SessionLog.FINEST, receiver.toString());
            QueueSender sender = session.createSender(queue);
            LOG.log(SessionLog.FINEST, sender.toString());
            TextMessage message = session.createTextMessage();
            LOG.log(SessionLog.FINEST, message.toString());
            message.setText("the message");
            message.setJMSCorrelationID("1234");
            sender.send(queue, message);
            session.commit();
            message = (TextMessage)receiver.receiveNoWait();
            LOG.log(SessionLog.FINEST, message != null ? message.toString() : null);
            LOG.log(SessionLog.FINEST, message != null ? message.getText() : null);
            session.commit();
        } finally {
            if (session != null) {
                session.close();
            }
            if (connection != null) {
                connection.close();
            }
            ModelHelper.resetOrderQueue(rDBSession);
        }
   }

    /**
     * Test AQ JMS driver direct interactions using {@link TopicConnection}.
     */
    @Test
    public void testTopic() throws Exception {
        ModelHelper.setupOrderTopic(rDBSession);
        TopicSession session = null;
        TopicConnection connection = null;
        try {
            connection = connectTopic();
            session = connection.createTopicSession(true, Session.CLIENT_ACKNOWLEDGE);
            Topic topic = ((AQjmsSession)session).getTopic(NoSQLProperties.getDBUserName(), "order_topic");
            LOG.log(SessionLog.FINEST, topic.toString());
            TopicSubscriber subscriber = session.createSubscriber(topic);
            LOG.log(SessionLog.FINEST, subscriber.toString());
            TopicPublisher publisher = session.createPublisher(topic);
            LOG.log(SessionLog.FINEST, publisher.toString());
            TextMessage message = session.createTextMessage();
            LOG.log(SessionLog.FINEST, message.toString());
            message.setText("the message");
            message.setJMSCorrelationID("1234");
            publisher.publish(topic, message);
            session.commit();
            message = (TextMessage)subscriber.receiveNoWait();
            LOG.log(SessionLog.FINEST, message != null ? message.toString() : null);
            LOG.log(SessionLog.FINEST, message != null ? message.getText() : null);
            session.commit();
        } finally {
            if (session != null) {
                session.close();
            }
            if (connection != null) {
                connection.close();
            }
            ModelHelper.resetOrderTopic(rDBSession);
        }
    }

}
