fr.crnan.videso3d.databases.terrainsoaci.TerrainsOaci.java Source code

Java tutorial

Introduction

Here is the source code for fr.crnan.videso3d.databases.terrainsoaci.TerrainsOaci.java

Source

/*
 * This file is part of ViDESO.
 * ViDESO is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * ViDESO is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with ViDESO.  If not, see <http://www.gnu.org/licenses/>.
*/

package fr.crnan.videso3d.databases.terrainsoaci;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

import fr.crnan.videso3d.databases.DatabaseManager;
import fr.crnan.videso3d.DatasManager;
import fr.crnan.videso3d.DatasManager.Type;
import fr.crnan.videso3d.FileParser;
import fr.crnan.videso3d.geom.Latitude;
import fr.crnan.videso3d.geom.Longitude;

/**
 * Lecteur de Base Terrains OACI
 * @author David Granado
 * @version 0.0.1
 */
public class TerrainsOaci extends FileParser {

    /**
     * Nom de la BDS
     */
    private String name;

    /**
     * Connection  la base de donnes
     */
    private Connection conn;

    private Document document = null;

    private final static String[] fileNames = { "TERRAG" };

    public TerrainsOaci() {
        super();
    }

    /**
     * Construit la bdd  partir du fichier dans path
     * @param path Chemin vers le rpertoire contenant la BDS
     */
    public TerrainsOaci(String path) {
        super(path);
        SAXBuilder sxb = new SAXBuilder();
        try {
            document = sxb.build(new File(path));
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Construit la bdd  partir du fichier dans path et lui donne le nom name
     * @param path Chemin vers le rpertoire contenant la BDS
     * @param name Le nom  donner  cette base de donnes
     */
    public TerrainsOaci(String path, String name) {
        super(path);
        this.name = name;
        SAXBuilder sxb = new SAXBuilder();
        try {
            document = sxb.build(new File(path));
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Dtermine si le fichier est un fichier Terrains OACI
     * Cherche "<codeIcao>" dans les 50 premires lignes du fichier
     * @param file
     * @return <code>true</code> si c'est un fichier Terrains OACI
     */
    public static boolean isTerrainsOACIFile(File file) {
        BufferedReader in = null;
        boolean found = false;
        try {
            in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
            int i = 0;
            while (in.ready() && !found && i < 50) {
                String line = in.readLine();
                if (line.matches(".*codeIcao.*")) {
                    found = true;
                }
                i++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        //      return file.getName().toLowerCase().contains("terrag");

        //      SAXBuilder sxb = new SAXBuilder();
        //      boolean isTerr = false;
        //      try {
        //         isTerr = sxb.build(file).getRootElement().getName().equals("SdoReportResponse");
        //      } catch (JDOMException e) {
        //         e.printStackTrace();
        //      } catch (IOException e) {
        //         e.printStackTrace();
        //      }
        //      return isTerr;

        return found;
    }

    /**
     * 
     * @return l'lment qui contient les arodromes
     */
    public Element getDocumentRoot() {
        return document.getRootElement().getChild("SdoReportResult");
    }

    @Override
    protected void getFromFiles() throws IOException, SQLException {
        this.setFile("TerrainsOACI");
        this.setProgress(0);
        //      Ci dessous, le code qui permettait d'utiliser l'ancien format de fichier terrain OACI
        //      BufferedReader in = null;
        //      try{
        //         in = new BufferedReader(new InputStreamReader(new FileInputStream(this.path)));
        //         while (in.ready()){
        //            String line = in.readLine();
        //            if(line.matches("[A-Z]{4}  ([0-9]{2} ){3}[NS] [0-9]{3} ([0-9]{2} ){2}[EW].*")){
        //               insertTerrainOaci(line);
        //            }
        //         }
        //      } catch(IOException e){
        //         throw e;
        //      } finally{
        //         if(in != null)
        //            in.close();
        //      }
        try {
            List<Element> terrs = getDocumentRoot().getChildren();
            for (Element terr : terrs) {
                if (terr.getChildText("codeIcao") != null) { //certains terrains ne sont pas recenss par l'OACI
                    insertTerrainOaci(terr);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.setProgress(1);
    }

    private void insertTerrainOaci(Element terr) throws SQLException {
        PreparedStatement insert = this.conn.prepareStatement(
                "insert into terrainsoaci (idoaci, idiata, name, type, country, city, latitude, longitude) "
                        + "values (?, ?, ?, ?, ?, ?, ?, ?)");
        insert.setString(1, terr.getChildText("codeIcao"));
        insert.setString(2, terr.getChildText("codeIata"));
        insert.setString(3, terr.getChildText("txtName"));
        insert.setString(4, terr.getChildText("codeType"));
        insert.setString(5, filterCountry(terr.getChild("Org").getChildText("txtName").replace("'", " "))); //suppression des apostrophes pour les requtes SQL
        insert.setString(6, terr.getChildText("txtNameCitySer"));
        String lati = terr.getChildText("geoLat").trim();
        String longi = terr.getChildText("geoLong").trim();
        Latitude lat = new Latitude(Integer.parseInt(lati.substring(0, 2)), Integer.parseInt(lati.substring(2, 4)),
                Integer.parseInt(lati.substring(4, 6)), lati.substring(6, 7));
        Longitude lon = new Longitude(Integer.parseInt(longi.substring(0, 3)),
                Integer.parseInt(longi.substring(3, 5)), Integer.parseInt(longi.substring(5, 7)),
                (longi.substring(7, 8).equalsIgnoreCase("W") ? "O" : "E"));
        insert.setDouble(7, lat.toDecimal());
        insert.setDouble(8, lon.toDecimal());
        insert.executeUpdate();
        insert.close();
    }

    /**
     * Suite  un manque de rigueur lors du remplissage du fichier XML (merci la rpublique tchque...), un filtre artisanal est appliqu pour limiter au maximum les dsagrments.
     * @param brutcountry - le nom du pays tel qu'il est renseign dans le fichier XML
     * @return le nom du pays ventuellement corrig
     */
    private String filterCountry(String brutcountry) {
        if (brutcountry.matches(
                "(.*KLUB.*)|(.*A\\.S.*)|(.*LETISTE.*)|(.*S\\.R\\.O.*)|(.*BRNO.*)|(.*VARY.*)|(.*OSTRAVA.*)|(.*BOHEMIAN.*)|(.*CZECH.*)|(.*PRAGUE.*)|(.*STATUTARNI.*)")) {
            brutcountry = "CZECH REPUBLIC";
        } else if (brutcountry.matches("(.*FLUGSICHERUNG.*)|(.*DEUTSCH.*)")) {
            brutcountry = "DEUTSCHLAND";
        }
        return brutcountry;
    }

    @Override
    public int numberFiles() {
        return 1;
    }

    @Override
    public Integer doInBackground() {
        try {
            this.createName();
            //si la base de donnes n'existe pas
            if (!DatabaseManager.databaseExists(DatasManager.Type.TerrainsOACI, this.name)) {
                //on cre la connection  la db
                this.conn = DatabaseManager.selectDB(DatasManager.Type.TerrainsOACI, this.name.trim());
                this.conn.setAutoCommit(false);
                //puis la structure de la base de donne
                DatabaseManager.createTerrainsOaci(this.name);
                //et on remplit la bdd avec les donnes du fichier
                this.getFromFiles();
                this.conn.commit();
            } else {
                DatabaseManager.selectDatabase(this.name, DatasManager.Type.TerrainsOACI);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            this.cancel(true);
        } catch (IOException e) {
            e.printStackTrace();
            this.cancel(true);
        }
        return null;
    }

    /**
     * Cre le nom de la base  partir de la date dans le fichier (gnralement en 1re ligne)
     * Le fichier doit contenir le mot-cl "date" (ignoreCase) avant la date
     * @throws IOException 
     */
    private void createName() throws IOException {
        if (name == null) {
            //         Ci dessous, le code qui permettait d'utiliser l'ancien format de fichier terrain OACI
            //         BufferedReader in = null;
            //         Boolean nameFound = false;
            //         try {
            //            in = new BufferedReader(new InputStreamReader(new FileInputStream(FileManager.getFile(path))));
            //            Pattern pattern = Pattern.compile(".*date.*");
            //            while (in.ready() && !nameFound){
            //               String line = in.readLine().toLowerCase();
            //               if (pattern.matcher(line).matches()){
            //                  int researchstart = line.indexOf("date")+4;
            //                  int start = 0;
            //                  int end = 0;
            //                  boolean bstart = false;
            //                  boolean bend = false;
            //                  int i = 0;
            //                  int j = 0;
            //                  while (!bstart) {
            //                     Character c = (Character) line.charAt(researchstart+i);
            //                     if(Character.toString(c).matches("[0-9]")) {
            //                        bstart=true;
            //                        start = researchstart+i;
            //                     } else {
            //                        i++;
            //                     }
            //                  }
            //                  while (!bend) {
            //                     Character c = (Character) line.charAt(start+j);
            //                     if(Character.toString(c).matches(" ")) {
            //                        bend=true;
            //                        end = start+j;
            //                     } else {
            //                        j++;
            //                     }
            //                  }
            //                  this.name = "TerrainsOACI_"+line.substring(start, end).replaceAll("[^0-9]", "");
            //                  nameFound = true;
            //               }
            //            }
            //         } catch(IOException e){
            //            //rethrow exception to cancel data import
            //            throw e;
            //         } finally {
            //            if(in != null){
            //               in.close();
            //            }
            //         }
            //         if(nameFound == false){
            //            throw new IOException("Pas de date dans le fichier : impossible de nommer la base");
            //         }
            String date = document.getRootElement().getAttributeValue("created").substring(0, 10);
            this.name = "TerrainsOACI_" + date;
        }
    }

    @Override
    public void done() {
        if (this.isCancelled()) {
            try {
                DatabaseManager.deleteDatabase(name, DatasManager.Type.TerrainsOACI);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            firePropertyChange("done", true, false);
        } else {
            firePropertyChange("done", false, true);
        }
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public Type getType() {
        return DatasManager.Type.TerrainsOACI;
    }

    @Override
    public List<String> getRelevantFileNames() {
        return Arrays.asList(fileNames);
    }

}