/*
 * Copyright 2013 Oracle and/or its affiliates.
 * All rights reserved.  You may not modify, use,
 * reproduce, or distribute this software except in
 * compliance with  the terms of the License at:
 * http://developers.sun.com/license/berkeley_license.html
 */


import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Queue;
import javax.jms.Topic;
import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.MessageProducer;
import javax.jms.TextMessage;
import javax.jms.JMSException;
import javax.annotation.Resource;


/**
 * Klasa Producer zawiera tylko metodę main,
 * która wysyła kilka komunikatów do kolejki lub tematu.
 *
 * Uruchom program w połączeniu z SynchConsumer lub
 * AsynchConsumer. Wskaż "kolejka" lub "temat" w wierszu poleceń
 * w momencie uruchomienia programu. Domyślnie program
 * wysyła tylko jeden komunikat. Podaj wartość po nazwie
 * celu, by wysłać więcej komunikatów.
 */
public class Producer {
    @Resource(lookup = "jms/ConnectionFactory")
    private static ConnectionFactory connectionFactory;
    @Resource(lookup = "jms/Queue")
    private static Queue queue;
    @Resource(lookup = "jms/Topic")
    private static Topic topic;

    /**
     * Metoda main.
     *
     * @param args     cel wykorzystywany przez przykład
     *                 i opcjonalnie loczba komunikatów
     *                 do wysłania
     */
    public static void main(String[] args) {
        final int NUM_MSGS;
        Connection connection = null;

        if ((args.length < 1) || (args.length > 2)) {
            System.err.println(
                    "Program przyjmuje jeden lub dwa argumenty: "
                    + "<typ-celu> [<liczba-komunikatów>]");
            System.exit(1);
        }

        String destType = args[0];
        System.out.println("Typ celu to " + destType);

        if (!(destType.equals("kolejka") || destType.equals("temat"))) {
            System.err.println("Argument musi być typu \"kolejka\" lub " + "\"temat\"");
            System.exit(1);
        }

        if (args.length == 2) {
            NUM_MSGS = (new Integer(args[1])).intValue();
        } else {
            NUM_MSGS = 1;
        }

        Destination dest = null;

        try {
            if (destType.equals("kolejka")) {
                dest = (Destination) queue;
            } else {
                dest = (Destination) topic;
            }
        } catch (Exception e) {
            System.err.println("Błąd wysyłania: " + e.toString());
            e.printStackTrace();
            System.exit(1);
        }

        /*
         * Tworzy połączenie.
         * Tworzy sesję z połączenia; false oznacza, że sesja
         * nie używa transakcji.
         * Tworzy producenta i komunikat.
         * Wysyła komunikaty o nieco różnej treści.
         * Wysyła komunikat o zakończeniu komunikatów.
         * Na końcu zamyka połączenie.
         */
        try {
            connection = connectionFactory.createConnection();

            Session session = connection.createSession(
                        false,
                        Session.AUTO_ACKNOWLEDGE);

            MessageProducer producer = session.createProducer(dest);
            TextMessage message = session.createTextMessage();

            for (int i = 0; i < NUM_MSGS; i++) {
                message.setText(
                        "Oto " + (i + 1) + ". komunikat od producenta");
                System.out.println("Wysyłanie komunikatu: " + message.getText());
                producer.send(message);
            }

            /*
             * Wysłanie komunikatu nietekstowego kończy komunikację.
             */
            producer.send(session.createMessage());
        } catch (JMSException e) {
            System.err.println("Wystąpił wyjątek: " + e.toString());
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                }
            }
        }
    }
}
