04.06.2008 | 22:12:22
immagine
Ing. Emanuele Scapin

ITS, prova di fine modulo in Java, proposta di risoluzione.
  • Prova somministrata al I° ciclo (as. 2015/2016), terza sessione, in data 18 Maggio 2016.

    1) Definire una classe1 in Java che possa essere utilizzata per gestire i dati di più stazioni di rilevazioni meteo da esportare in formato XML, come nel seguente esempio (dove il valore è espresso in gradi Celsius °C) [1]

    <dati>
    <stazione>ST001</stazione>
    <testo>temperatura</testo>
    <data>20160518115030</data>
    <valore>19.5</valore>
    </dati>

    2) Definire una classe in Java2 che possa gestire una lista dei dati del tipo definito al punto precedente. Includere i metodi principali per la gestione della lista e prevedere la possibilità di esportare la lista in formato XML. [2]

    3) Produrre una classe in Java3 che possa definire un Thread che riesca a gestire la connessione socket lato server delle richieste di un client socket, creando gli oggetti che servono all'invio e ricezione dell'informazione. [1]
    In particolare il thread deve ricevere il socket generato precedentemente e tramite questo ricevere dei messaggi di richiesta dei dati disponibili per le stazioni, del tipo
              “ST001” con il codice della stazione di cui si richiedono i dati
    e rispondere alla richiesta con i dati così come progettati nel punto 1 in formato XML, da ricavare da una lista popolata così come progettata nel punto 2 e letta da una database (DatiMeteo, stringa di connessione “jdbc:mysql://172.18.9.132:3306/meteo”, username “dati”, password “datimeteo”) ove la tabella dei dati rispecchia la struttura dell'oggetto progettato al punto 1. [4]

    Si ricordi che il marshal di un oggetto Java in una stringa può essere fatto come segue: [0,5]
    JAXBContext context = JAXBContext.newInstance(MiaClasse.class);
    Marshaller m = context.createMarshaller();
    StringWriter sw = new StringWriter();
    m.marshal(miaclasse, sw);

    Si ricordi che lo unmarshal di una stringa XML può essere fatta come segue: [0,5]
    JAXBContext jaxbContext = JAXBContext.newInstance(MiaClasse.class);  
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();  
    MiaClasse c = (MiaClasse) unmarshaller.unmarshal(new StringReader(“ ... stringa xml ...”));


  • Classe per la gestione dei dati.

    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class Dati {
        private String stazione;
        private String testo;
        private String data;
        private float valore;
        
        public Dati() {}
    
        public Dati(String stazione, String testo, String data, float valore) {
            this.stazione = stazione;
            this.testo = testo;
            this.data = data;
            this.valore = valore;
        }
    
        @XmlElement
        public String getStazione() {
            return stazione;
        }
    
        @XmlElement
        public String getTesto() {
            return testo;
        }
    
        @XmlElement
        public String getData() {
            return data;
        }
    
        @XmlElement
        public float getValore() {
            return valore;
        }
            
        public void setStazione(String stazione) {
            this.stazione = stazione;
        }
    
        public void setTesto(String testo) {
            this.testo = testo;
        }
    
        public void setData(String data) {
            this.data = data;
        }
    
        public void setValore(float valore) {
            this.valore = valore;
        }  
    }
            
  • Classe per la gestione della lista di dati.

    import java.util.ArrayList;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class ListaDati {
    
        @XmlElement(name="dati")
        private ArrayList<Dati> lista = new ArrayList<Dati>();
        
        public ListaDati() {
        }    
        
        public ListaDati(ArrayList<Dati> lista) {
            this.lista = lista;
        }   
        
        public void add(Dati dati) {
            lista.add(dati);
        }
        
        public int size() {
            return lista.size();
        }
        
        public Dati get(int index) {
            return lista.get(index);
        }
        
        public void removeAll() {
            lista.clear();
        }
        
        public void remove(int index) {
            lista.remove(index);
        }
    }
            
  • Classe per la gestione della connessione al database e la gestione delle query.

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class Database {
        private String schema;
        private String username;
        private String password;
        private String host;
        private int port;
        
        private Connection conn = null;  
    
        public Database(String schema, String username, 
                        String password, String host, int port) {
            this.schema = schema;
            this.username = username;
            this.password = password;
            this.host = host;
            this.port = port;
        }
        
        public void Connetti() {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection(
                       "jdbc:mysql://"+host+":"+port+"/"+schema,username,password);            
            } catch (Exception ex) {
                Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
            }        
        }
        
        public void Sconnetti() {
            if (conn != null) try {
                conn.close();
            } catch (SQLException ex) {
                Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
            }
        } 
        
        public ListaDati getDati(String codice) {
            ListaDati ret = null;
            
            if (conn != null) {
                try {
                   String sql = "select * from dati where codice = ? order by data";
    
                   PreparedStatement psd = conn.prepareStatement(sql);
                   psd.setString(1, codice);
                   ResultSet rsd = psd.executeQuery();
    
                   if (rsd != null) {
                     while(rsd.next()) {
                         String stazione = rsd.getString("stazione");
                         String testo = rsd.getString("testo");
                         String data = rsd.getString("data");
                         float valore = rsd.getFloat("valore");
                         Dati st = new Dati(stazione, testo, data, valore);
                         ret.add(st);
                     }
                   }
                }
                catch(Exception ex) {
                    System.out.println("errore query stati " + ex.getMessage());
                }
            }        
            
            return ret;
        }
    }
            
  • Classe che definisce il Thread che riceve le richieste e invia la riposta con i dati richiesti letti da database.

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.net.Socket;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Marshaller;
    
    public class ThreadDati extends Thread {
        private Socket socket = null;
        private BufferedReader in;
        private PrintWriter out;
        private Database db;
    
        public ThreadDati(Socket socket, String schema, String username, String password, String host, int port) {
            this.socket = socket;
            if (socket != null) {
                try {
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    out = new PrintWriter(socket.getOutputStream());
                    db = new Database(schema, username, password, host, port);
                } catch (IOException ex) {
                    Logger.getLogger(ThreadDati.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    
        @Override
        public void run() {
            if (socket != null  && db != null) {
                db.Connetti();
                while(true) {
                    try {
                        String codice = in.readLine();
                        if(codice != null && codice.length() > 0) {
                            ListaDati lista = db.getDati(codice);
                            JAXBContext context = JAXBContext.newInstance(ListaDati.class);
                            Marshaller m = context.createMarshaller();
                            StringWriter sw = new StringWriter();
                            m.marshal(lista, sw);  
                            out.println(sw.toString());
                        }
                    } catch (Exception ex) {
                        Logger.getLogger(ThreadDati.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        }   
    }
            

© Emanuele Scapin 2008-2018

 

Valid HTML 4.01! Valid CSS!