import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


import org.apache.activemq.ActiveMQConnectionFactory;


public class Client implements ActionListener {
		
	public JTextArea jta, log;
	public JComboBox jcb;
	public JTextField attr;
	public JButton jb1;
	public JFrame frame;
	public JScrollPane jsp, jsp2;
	
	public Client() {
		jcb = new JComboBox();
		jcb.addItem("RichiestaOperazioni");

		log = new JTextArea();
		log.setEditable(false);
		jsp2 = new JScrollPane(log,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		log.setMaximumSize(new Dimension(700,100));
		jta = new JTextArea();
		jta.setEditable(false);
		jsp = new JScrollPane(jta,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		jta.setMinimumSize(new Dimension(700,400));
		attr = new JTextField("");
	
		
		
		jb1 = new JButton("Richiedi");
		jb1.addActionListener(this);

		creaFinestra();
	}
	
	public void creaFinestra(){
		frame = new JFrame("Semplice Client JMS");
		
		
		JPanel giu = new JPanel(new GridLayout(1,3));
		
		giu.add(jcb);

		giu.add(attr);
		
		giu.add(jb1);
		
		
		JPanel p1 = new JPanel(new BorderLayout(3,3));
		p1.add(giu, BorderLayout.NORTH);
		p1.add(jsp, BorderLayout.CENTER);
		p1.add(jsp2, BorderLayout.SOUTH);
		frame.setContentPane(p1);
		frame.setSize(500,450);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}	
		
	public void actionPerformed(ActionEvent e) {
		String funzione = (String)jcb.getSelectedItem();
		String argomento = attr.getText();
		
		String daInviare = "<text><funzione>" + funzione + "</funzione><argomento>" + argomento + "</argomento></text>";
		try{
			if(funzione.equals("RichiestaOperazioni")) JMSTest(daInviare,0);
			else JMSTest(daInviare,1);
		}
		catch(Exception ex){
			log.setText("\nServizio non attivo");
		}
	}	
		
	
		
		
	public static void main(String[] args) throws Exception {
		Client c = new Client();
		
		c.frame.setVisible(true);
	}


	public void JMSTest(String testo, int codice) throws Exception {
			
		// Setto l'ambiente JMS
		        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
		        QueueConnection queueConnection = connectionFactory.createQueueConnection();
		        QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
		        Queue requestQueue = queueSession.createQueue("myJmsQueueTest");
		        QueueSender queueSender = queueSession.createSender(requestQueue);
		        Destination tempResponseQueue = queueSession.createTemporaryQueue();
		        MessageConsumer responseMessageConsumer = queueSession.createConsumer(tempResponseQueue);
		     // Setto il messaggio di richiesta JMS 
		        TextMessage msg = queueSession.createTextMessage();
		        msg.setText(testo);
		        msg.setJMSReplyTo(tempResponseQueue);
		        msg.setJMSCorrelationID(String.valueOf(System.currentTimeMillis()));


		        jta.append(msg.getText().replaceAll(">", ">\n") +"\n");
		// apre la connessione, invia il messaggio e aspetta la risposta
		        queueConnection.start();
		        queueSender.send(msg);
		        Message responseMessage = responseMessageConsumer.receive();
		    
		        
		// prende il messaggio di risposta
		        TextMessage textMessage = (TextMessage) responseMessage;
		        String risposta = textMessage.getText();
		        
		        log.setText("\n" + risposta.replaceAll(">", ">\n")  );
		        //richiesta operazioni aggiorno checkbox
		        if(codice==0){
		        	int cont = jcb.getItemCount() -1;	
					while (cont>=0){

						jcb.removeItemAt(cont);
						cont--;
					}
		        	
		        	String opz;
		        	risposta = risposta.replace("<?xml version='1.0' encoding='UTF-8'?>", "");
		        	risposta = risposta.substring(risposta.indexOf(">")+1);
		        	try{
			        	while(!risposta.startsWith("</operazione></")){
			        		risposta = risposta.substring(risposta.indexOf(">")+1);
			        		risposta = risposta.substring(risposta.indexOf(">")+1);
			        		opz = risposta.substring(0, risposta.indexOf("</operazione>"));
			        		jcb.addItem(opz);
			        	}
			        }
		        	catch (Exception exc){}
		        }
		        
		        

		
		        queueSender.close();
		        queueSession.close();
		        queueConnection.close();
	}

   
}

		