private void readXML() throws SAXException, ParserConfigurationException, IOException, NoSuchAlgorithmException, InvalidKeySpecException {
        try {
            this.mutex.acquire();

            // On parse le fichier une seule fois
            File userFile = new File(XML_PATH);
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(userFile);
            doc.getDocumentElement().normalize();

            // On récupère la liste des users
            NodeList usersList = doc.getElementsByTagName("user");
            for (int temp = 0; temp < usersList.getLength(); temp++) {

                Node userNode = usersList.item(temp);
                if (userNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element userElement = (Element) userNode;
                    // On crée le user et initialise les données
                    User user = new User();
                    user.setLogin(getTagValue("login", userElement));
                    user.setPassword(getTagValue("password", userElement));

                    // On reconstruit la clé public  
                    byte[] publicKey = getBytes("public_key", userElement);

                    // On reconstruit la clé privée   
                    byte[] privateKey = getBytes("private_key", userElement);
                    Keys keys = new Keys();
                    keys.construction(publicKey, privateKey);

                    user.setKeys(keys);


                    // On récupère la liste des fichiers du user
                    ArrayList<SignatureFile> files = new ArrayList<SignatureFile>();
                    NodeList filesList = userElement.getElementsByTagName("file");
                    for (int temp2 = 0; temp2 < filesList.getLength(); temp2++) {

                        Node fileNode = filesList.item(temp2);
                        if (fileNode.getNodeType() == Node.ELEMENT_NODE) {
                            Element fileElement = (Element) fileNode;
                            SignatureFile file = new SignatureFile(new File(getTagValue("path", fileElement)));

                            String tmp = getTagValue("algorithm", fileElement);
                            if (tmp != null) {
                                file.setAlgorithm(tmp);
                            }

                            tmp = getTagValue("last_check_result", fileElement);
                            if (tmp != null) {
                                file.setTestResult(Boolean.parseBoolean(tmp));
                            }


                            tmp = getTagValue("last_check_date", fileElement);
                            if (tmp != null) {
                                file.setLastCheckedDate(new Date(Long.parseLong(tmp)));
                            }

                            tmp = getTagValue("signature_date", fileElement);
                            if (tmp != null) {
                                file.setLastSignedDate(new Date(Long.parseLong(tmp)));
                            }

                            file.setSignature(getBytes("signature", fileElement));
                            files.add(file);
                        }
                    }

                    // On a tous les fichiers
                    user.setFiles(files);

                    // On ajoute le user à la liste
                    this.users.add(user);
                }
            }

            this.mutex.release();
        } catch (InterruptedException ex) {
            Logger.getLogger(DataBase.class.getName()).log(Level.SEVERE, null, ex);
        }
    }