Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package model; import model.Data; import model.Mois; import model.Jour; import model.Heure; import model.DataClimate; import model.Annee; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import java.util.zip.GZIPInputStream; import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.stage.FileChooser; import javax.swing.JOptionPane; import org.apache.commons.io.FileUtils; import controller.Controller; /** * Classe qui sert d'interface entre les classes du domaines et le controlleur * * @author GHEMID */ public class Modele { public List<Station> station = new ArrayList<>(); public List<DataClimate> dataClimate = new ArrayList<>(); /** * ligne propre l'affichage des donnes dans une tableView */ public ObservableList<Data> data = FXCollections.observableArrayList(); /** * liste propres l'affichage des donnes */ public List<String> donnes; /** * les stations associs ce modle */ public ArrayList<Station> station_list; List<String> list_donnee = new ArrayList<>(); private String nom_fichier; /** * Methode qui fait un balayage des fichier qui existent dj dans le * reprtoire local lancer au dmmarage de l'application * * @return la liste donnes qui existent */ public List<String> download_existing_files() { String mois = null; for (int i = 1996; i < 2018; i++) { for (int j = 1; j < 13; j++) { if (j < 10) { mois = "0" + String.valueOf(j); } else { String.valueOf(j); } File f = new File("synop." + String.valueOf(i) + mois + ".csv.gz.txt"); if (f.exists()) { Save_data(f); } } } return list_donnee; } /** * Methode qui sauvegarde les donnes dans des objets (RAM) * * @param file le fichier sauvegarder * @return le nom de fichier pour l'afficher sur la rubrique des donnes */ public String Save_data(File file) { String last_last_1 = null; String last_last_2 = null; try (BufferedReader br = new BufferedReader(new FileReader(file))) { final String fileName = file.toURI().toString(); String fileNamelast = null; String[] fileNames = fileName.toString().split("/"); String last_part = fileNames[7]; String[] parts = last_part.split("\\."); String last_last_part = parts[1]; last_last_1 = last_last_part.substring(0, 4); last_last_2 = last_last_part.substring(4, 6); List<String> row = new ArrayList<>(); String line; donnes = new ArrayList<>(); boolean line_one = false; double val_proggress = 0.0; while ((line = br.readLine()) != null) { if (line_one) { row.clear(); donnes.add(line); int i = 0; for (String retval : line.split(";")) { if (i == 0 || i == 1 || i == 7 || i == 9 || i == 14) { row.add(retval); } i++; } if (row.size() == 5) { String c; if (!row.get(2).equals("mq")) { Float kelvin = Float.parseFloat(row.get(2)); Float celsius = kelvin - 273.15F; c = Float.toString(celsius); } else { c = "0"; } //conversion des erreurs : if (row.get(0).equals("mq")) { row.set(0, "0"); } if (row.get(1).equals("mq")) { row.set(1, "0"); } if (row.get(2).equals("mq")) { row.set(2, "0"); } if (row.get(3).equals("mq")) { row.set(3, "0"); } if (row.get(4).equals("mq")) { row.set(4, "0"); } add_or_create(row, c); } } line_one = true; } } catch (IOException ex) { Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); } list_donnee.add("DATA existe, Date : " + last_last_1 + " - " + last_last_2); return "DATA existe, Date : " + last_last_1 + " - " + last_last_2; } /** * Methode qui retourne le nom de la station partir de l'id de la station * * @param IdStations l'identificateur de la station * @return le nom de station qui correspond l'id de la station pass en * paramtre */ public String IdStationToStation(String IdStations) { String nomStation = null; for (int i = 0; i < station.size(); i++) { if (station.get(i).getIdStation().equals(IdStations)) { nomStation = station.get(i).getNomStation(); } } return nomStation; } /** * Methode qui tlcharger le fichier des donnes du site directement * * @param jour jour du fichier telecharger * @param mois mois du fichier telecharger * @param annee annee du fichier telecharger * @param heure heure du fichier telecharger * @return nom du fichier tlcharger * @throws MalformedURLException * @throws IOException */ public String Download_File(String jour, String mois, String annee, String heure) throws MalformedURLException, IOException { if (jour.equals("NULL") && heure.equals("NULL")) { URL url = new URL("https://donneespubliques.meteofrance.fr/donnees_libres/Txt/Synop/Archive/synop." + annee + mois + ".csv.gz"); File file = new File("synop." + annee + mois + ".csv.gz"); FileUtils.copyURLToFile(url, file); FileInputStream in = new FileInputStream("synop." + annee + mois + ".csv.gz"); GZIPInputStream zipin = new GZIPInputStream(in); byte[] buffer = new byte[8192]; FileOutputStream out = new FileOutputStream("synop." + annee + mois + ".csv.gz.txt"); int length; while ((length = zipin.read(buffer, 0, 8192)) != -1) { out.write(buffer, 0, length); } out.close(); zipin.close(); File f = new File("synop." + annee + mois + ".csv.gz.txt"); if (f.exists()) { nom_fichier = Save_data(f); } else { JOptionPane.showMessageDialog(null, "Fichier inexistant ou n'a pas pu tre tlcharg !"); } } else { if (annee.equals("2017")) { URL url = new URL("https://donneespubliques.meteofrance.fr/donnees_libres/Txt/Synop/Archive/synop." + annee + mois + jour + heure + ".csv.gz"); File file = new File("synop." + annee + mois + jour + heure + ".csv"); FileUtils.copyURLToFile(url, file); File f = new File("synop." + annee + mois + jour + heure + ".csv"); if (f.exists()) { nom_fichier = Save_data(f); } else { JOptionPane.showMessageDialog(null, "Fichier inexistant ou n'a pas pu tre tlcharg !"); } } else { JOptionPane.showMessageDialog(null, "Seulement l'anne 2017 disponible pour cette option !"); } } return nom_fichier; } /** * Methode qui vrifie s'il y a une connexin internet * * @return vrai s'il y a une connexion, faux s'il y a pas de connexion */ public static boolean netIsAvailable() { try { final URL url = new URL("http://www.google.com"); final URLConnection conn = url.openConnection(); conn.connect(); return true; } catch (MalformedURLException e) { throw new RuntimeException(e); } catch (IOException e) { return false; } } /** * Methode qui dcoupe la date en Anne/Jour/Mois/Heure * * @param date la date entire en string de la forme 2016010206 * @return une liste de date dcoups s[0] = anne, s[1] = mois, s[2] = * jour, s[4] = heure, */ public ArrayList<String> split_date(String date) { ArrayList<String> s = new ArrayList<>(); String annee, mois, jour, heure; annee = date.substring(0, 4); mois = date.substring(4, 6); jour = date.substring(6, 8); heure = date.substring(8, 10); s.add(annee); s.add(mois); s.add(jour); s.add(heure); return s; } /** * Methode qui importe un fichier de donne de la machine local (sans * internet) * * @param event * @return le nom du fichier pour l'afficher dans la rubrique des donnes * @throws IOException * @throws InterruptedException */ public String import_file(ActionEvent event) throws IOException, InterruptedException { FileChooser filechooser = new FileChooser(); filechooser.setTitle("Ouvrir un fichier"); File file = filechooser.showOpenDialog(null); if (file != null) { String[] extensions = { "txt", "csv", "gz" }; for (String extension : extensions) { if (file.getName().toLowerCase().endsWith("." + extension)) { if (extension.equals("gz")) { final String fileName = file.toURI().toString(); String fileNamelast = null; for (String retval : fileName.split("/")) { fileNamelast = retval; } File filex = new File(fileNamelast + ".txt"); boolean success = file.renameTo(filex); file = filex; } nom_fichier = Save_data(file); } } } return nom_fichier; } /** * mthode qui retourne l'cart type d'une liste d'entier pass en paramtre * * @param S list d'entier * @return l'cart type d'une liste d'entier pass en paramtre */ public Integer Ecart_type(ArrayList<Integer> S) { int ecrt_val; Collections.sort(S); if ((S.size() % 2) != 0) { ecrt_val = (S.size() + 1) / 2; return S.get(ecrt_val); } else { return (S.get(S.size() / 2) + S.get((S.size() + 1) / 2)) / 2; } } /** * Methode qui sauvegarde les donnes dans des objets * @param row Liste donne ajouter * @param c la temprature en C */ public void add_or_create(List<String> row, String c) { station.stream().forEach((stationn) -> { ArrayList<String> data_composant = split_date(row.get(1)); if (stationn.getNomStation().equals(IdStationToStation(row.get(0)))) { Annee year = null; Mois month = null; Jour day = null; Heure hour = null; for (Annee annee : stationn.getAnnee()) { if (annee.getAnnee_value().equals(data_composant.get(0))) { year = annee; } } if (year == null) { DataClimate dataclimaate = new DataClimate(row.get(2), c, row.get(3), row.get(4)); List<Heure> list_heure = new ArrayList<>(); list_heure.add(new Heure(data_composant.get(3), dataclimaate)); List<Jour> list_jour = new ArrayList<>(); list_jour.add(new Jour(data_composant.get(2), list_heure)); List<Mois> list_mois = new ArrayList<>(); list_mois.add(new Mois(data_composant.get(1), list_jour)); stationn.AddAnnee(new Annee(data_composant.get(0), list_mois)); } else { for (Mois mois : year.getMois_list()) { if (mois.getMois_value().equals(data_composant.get(1))) { month = mois; } } if (month == null) { DataClimate dataclimaate = new DataClimate(row.get(2), c, row.get(3), row.get(4)); List<Heure> list_heure = new ArrayList<>(); list_heure.add(new Heure(data_composant.get(3), dataclimaate)); List<Jour> list_jour = new ArrayList<>(); list_jour.add(new Jour(data_composant.get(2), list_heure)); year.AddMois(new Mois(data_composant.get(1), list_jour)); } else { for (Jour jour : month.getList_jour()) { if (jour.getJour_value().equals(data_composant.get(2))) { day = jour; } } if (day == null) { DataClimate dataclimaate = new DataClimate(row.get(2), c, row.get(3), row.get(4)); List<Heure> list_heure = new ArrayList<>(); month.Addjour(new Jour(data_composant.get(2), list_heure)); } else { for (Heure heure : day.getList_heure()) { if (heure.getHeure_value().equals(data_composant.get(3))) { hour = heure; } } if (hour == null) { DataClimate dataclimaate = new DataClimate(row.get(2), c, row.get(3), row.get(4)); day.addHeure(new Heure(data_composant.get(3), dataclimaate)); } else { } } } } } }); } }