import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;



public class Client implements ActionListener {

	public JTextArea jta, log;
	public JComboBox jcb;
	public JTextField indir, ser, por, attr;
	public JButton jb1, jb2;
	public JFrame frame;
	public JScrollPane jsp, jsp2;
	public BufferedReader br;
	public InputStreamReader isr;
	public InputStream is;
	public OutputStream os;
	public HttpURLConnection conn;
	
	public Client() {
		jcb = new JComboBox();
		jcb.addItem("RichiestaOperazioni");
	//	jcb.addItem("Due");
	//	jcb.addItem("Tre");
		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));
		indir = new JTextField("localhost");
		ser = new JTextField("LibriService");
		por = new JTextField("8080");
		attr = new JTextField("");
		//attr.setEditable(false);
		
		
		jb1 = new JButton("Connetti");
		jb1.addActionListener(this);
		jb2 = new JButton("Esegui");
		jb2.addActionListener(this);
		creaFinestra();
	}
	
	public void creaFinestra(){
		frame = new JFrame("Semplice Client HTTP");
		JPanel p = new JPanel(new GridLayout(2,1));
		
		
		JPanel su = new JPanel(new GridLayout(1,6));
		su.add(new JLabel(" Indirizzo:"));
		su.add(indir);
		
		su.add(new JLabel(" Servizio:"));
		su.add(ser);
		
		su.add(new JLabel(" Porta:"));
		su.add(por);
		
		//su.add(jb1);
		
		JPanel giu = new JPanel(new GridLayout(1,3));//era 5
		//giu.add(new JLabel(" Operazione:"));
		giu.add(jcb);
		
	//	giu.add(new JLabel(" Attributi:"));
		giu.add(attr);
		
		giu.add(jb1);
		
		p.add(su);
		p.add(giu);
		
		
		JPanel p1 = new JPanel(new BorderLayout(3,3));
		p1.add(p, 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);
	}
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Client cl = new Client();
		cl.frame.setVisible(true);

		
		
		
		
	}

	public void esegui(){
		
	    try {
			String intest= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
			String parte1 = "<env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tns=\"http://progetto/tesina/types\">\n<env:Body>\n<tns:";
			String parte2 = ">\n<tns:name>";
			String parte3 = "</tns:name>\n</tns:";
			String parte4 = ">\n</env:Body>\n</env:Envelope>\n";
			
			String xmldata;
			if(jcb.getSelectedItem().equals("RichiestaOperazioni")){
			
				xmldata = intest + parte1 + "RichiestaOperazioni" + parte2 + parte3 + "RichiestaOperazioni" + parte4;
			}
			else{
			
				xmldata = intest + parte1 + jcb.getSelectedItem() + parte2 + attr.getText() + parte3 + jcb.getSelectedItem() + parte4;
			}
			//log.append(xmldata + "\n");
			log.setText(xmldata);
			int porta = Integer.parseInt(por.getText());
				
			
			//Create socket
		    String hostname = indir.getText();
		    int port = porta;
		    InetAddress  addr = InetAddress.getByName(hostname);
		    Socket sock = new Socket(addr, port);
				
	      //Send header
			String path = "/" + ser.getText() +"/" ;
			BufferedWriter  wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
			wr.write("POST " + path  + " HTTP/1.0\r\n");
			wr.write("Host: " + hostname + ":" + port + "\r\n");
			wr.write("Content-Length: " + xmldata.length() + "\r\n");
			wr.write("Content-Type: text/xml; charset=\"utf-8\"\r\n");
			wr.write("\r\n");
				
	      //Send data
			wr.write(xmldata);
			wr.flush();
				
	      // Response
			BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
			String line;
			String modifica = "";  
			String dec;
			String str = br.readLine();
			while (str != null){
							dec = str.replaceAll("&lt;", "<");
							
							dec.trim();
							dec = dec.replaceAll("<", "\n<");
						    jta.append(dec + "\n");
						    modifica = modifica + dec +  "\n";
						    str = br.readLine();
			}
			jta.append("\n");
			if(jcb.getSelectedItem().equals("RichiestaOperazioni")){
				
				
				int cont = jcb.getItemCount() -1;	
				String st;
				while (cont>=0){

					jcb.removeItemAt(cont);
					cont--;
				}
				int indice = modifica.indexOf("<name>");
				indice+=6;
		
				modifica = modifica.substring(indice);
				int indice2 = modifica.indexOf("\n");
				
				String modifica2 = modifica.substring(0,indice2);
				while(!modifica2.startsWith("<")){
					jcb.addItem(modifica2);
					modifica = modifica.substring(indice2).trim();
					indice2 = modifica.indexOf("\n");
					modifica2 = modifica.substring(0,indice2);
				}

			}
			
	    } 
		catch (Exception e) {
			e.printStackTrace();
	    }
	
	}
	
	
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		Object ob = e.getSource();
		JButton cast = (JButton) ob;
		if (cast.equals(jb1)){
				if(jb1.getText().equals("Connetti")){
				esegui();
				}
		}

	}
}
