IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Un bug dans FileSystemUtils.copyRecursively ?


Sujet :

Spring Java

  1. #1
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut Un bug dans FileSystemUtils.copyRecursively ?
    Hello,

    Je ne suis pas vraiment un familier des issues/tracking, mais il me semble qu'il existe un bug dans une fonction - parfaitement secondaire - de Spring, dans FileSystemUtils, au niveau de la méthode copyRecursively, grâce à laquelle on peut copier un répertoire vers un autre.

    Elle est très simple : pour chaque élément du répertoire source, si c'est un fichier, elle le copie vers la destination, sinon elle s'appelle récursivement en considérant que c'est un répertoire.

    Mais une "chose" sur un système de fichier peut parfaitement n'être ni un fichier, ni un répertoire ; auquel cas, l'appel récursif va planter : la liste du faux répertoire va renvoyer null, et on aura un NullPointerException à la ligne 60.

    Je ne sais pas si je suis clair...

    Le problème m'est arrivé, sur un fichier que je trimballe de sauvegarde en sauvegarde, de système d'exploitation en système d'exploitation, d'encodage en encodage, et qui n'est plus rien aujourd'hui, le pauvre, sauf pour faire des NullPointerException.

    Qu'en pensez-vous ?... J'ai cherché un peu dans le jira de spring mais j'ai rien trouvé qui ressemble à ça...

    La solution, que j'ai appliquée, est de transformer ainsi la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
      public static void copyRecursively(File src, File dest) throws IOException
      {
        dest.mkdir();
        File[] entries = src.listFiles();
        for (int i = 0; i < entries.length; i++)
        {
          File file = entries[i];
          File newFile = new File(dest, file.getName());
          if (file.isFile())
          {
            newFile.createNewFile();
            FileCopyUtils.copy(file, newFile);
          }
          else if (file.isDirectory())
            {
              copyRecursively(file, newFile);
            }
            else
              System.out.println("file '" + file + "' ni un fichier, ni un répertoire."); // nothing
        }
      }

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Je présume que tu es sous linux pour avoir des 'choses' qui ne sont ni fichier ni répertoire ?

    Si tu as un exemple concret à proposer, il serait peut être intéressant de créer une issue sur le jira de Spring en expliquant la chose.
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Oui, je suis sous Linux. Mais mes connaissances sur Linux ne sont pas suffisantes pour expliquer le phénomène ; je peux juste dire que, au départ, les "choses" incriminées étaient des fichiers, et que, au fur et à mesure de manips non identifiées, c'est devenu n'importe quoi.

    Je subodorre qu'il s'agit d'un problème de décodage du nom de fichier. En effet le fichier incriminé comporte des accents, dans un autre encodage que l'encodage standard ; j'ai l'impression que la JVM - ou Linux ? - se trompe à cause de ça.

    Il n'en reste pas moins vrai que cela provoque le plantage de tout le processus de copie, sur un NullPointerException, alors que ça ne devrait pas, à mon avis ; il y a simplement une chose, dans le système de fichiers, qui n'est pas copiable, c'est tout.

    Que veux-tu dire par un exemple concret ?

  4. #4
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Citation Envoyé par gifffftane Voir le message

    Que veux-tu dire par un exemple concret ?

    J'entends un répertoire qui "foire" pour lequel tu ferai un listing via la console Linux. afin d'avoir la structure et le "type" de fichier en dehors du monde java.

    Avec un code java simple, qui "bug" et pour lequel tu aurais une sortie.

    Tout ca pour fournir une piste de départ pour les gens de Spring :-)
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je ne suis pas sûr que je puisse transmettre aux gens de spring le fichier incriminé puisque... précisément, je ne peux pas le copier !

    Le listing, voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > ls -l *dynamique.html                        [9:02:01]
    -rw-r--r-- 1 herve herve 2615 2008-07-02 22:18 94-Etre-dynamique.html
    -rw-r--r-- 1 herve herve 2610 2008-06-26 17:50 94-Être-dynamique.html
    -rw-r--r-- 1 herve herve 2581 2008-04-22 15:51 94-+�tre-dynamique.html
    Le fichier qui plante est le dernier. ... Même pour la simple copie de son nom cela foire, c'est dire... depuis ma console je vois "94-+(petit rectangle)tre-dy...".

    Le code c'est copyRecursively, ils l'ont déjà, j'imagine...

    Et pour la solution, c'est dans mon premier post ! Ça c'est du précis !

  6. #6
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Salut,
    Citation Envoyé par gifffftane Voir le message
    Et pour la solution, c'est dans mon premier post ! Ça c'est du précis !
    Tu pourrais alors ouvrir une issue dans le JIRA de Spring décrivant ce phénomène + le code corrigé (ou mieux encore, un patch), histoire d'être un citoyen modèle dans le pays de l'Open Source

  7. #7
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Mais je suis tout ouvert ! Seulement il faut me dire pas à pas ce qu'il faut faire... Je n'ai jamais réussi à entrer dans ce monde (mes faibles performances en anglais, sans doute) (et le fait que je sois intarissable). Bon... y'a pas un forum DEBUTANT DEVELOPPEUR SPRING ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    Je n'ai pas relu ton code, mais je ne serais pas surpris s'il y avait un problème sous Unix, car sous Unix on voit sous forme de fichiers des choses qui n'en sont pas vraiment.
    Je me demande ce que donnerait une copie de /dev/null d'ailleurs...

    Quoiqu'il en soit, je t'encourage vivement à mettre ton bug dans le Jira de Spring :
    http://jira.springframework.org/secure/Dashboard.jspa

    La marche à suivre est simple, tu crées un compte et tu mets un rapport de bug, ce que tu as proposé dans ton premier post est déjà très bien. Si tu as un souci avec l'Anglais, contacte moi et je t'aiderai à traduire.

    Pour revenir sur "l'exemple concret", le top c'est de fournir avec un jeu de test qui prouve que le bug existait avant, et qui prouve qu'ensuite il est corrigé. Par contre, étant donné que ce que tu as es spécifique à ton OS, voire même à certains fichiers de ton OS, cela risque d'être un peu difficile à réaliser.

  9. #9
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Et voilà c'est fait !

    C'est une semaine faste pour les bugs : j'en ai également soumis un sur Netbeans, qui semble avoir été accepté comme tel... il est NEW, j'attends qu'il passe à STARTED On va voir ce que devient celui de spring.

    C'est bien ces histoires de bugs parce que cela me permet d'entrer par une petite porte dans ce monde fourmillant des logiciels libres... Le seul problème est que le nombre de mes login / mot de passe explose, et je n'ai pas assez de neurones pour me souvenir de tout, moi

  10. #10
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Bonjour,

    Moi aussi je suis sous Linux. Mais si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    touch "/tmp/94-+�tre-dynamique.html"
    Puis si j'exécute ce petit programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static void main(String[] args) {
            File f = new File("/tmp/94-+�tre-dynamique.html");
            System.out.println("IsDir = " + f.isDirectory());
            System.out.println("IsFile = " + f.isFile());
        }
    J'ai bien :
    IsDir = false
    IsFile = true
    Donc je pense que le code Spring est bon (bien qu'un contrôle supplémentaire ne fait pas de mal). Et que le problème vient de ton système de fichier.
    Mon linux est configuré entièrement en UTF-8.

    Vérifie l'encodage de ton système, du montage de ta partition, etc.

    Je te conseille la lecture des deux documentations de gentoo suivantes :
    http://www.gentoo.org/doc/fr/guide-localization.xml
    http://www.gentoo.org/doc/fr/utf-8.xml

  11. #11
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Absolument, mais, mon système de fichiers étant ce qu'il est, il n'y a pas de raison qu'il y ait un NullPointerException.

    Moi je pensais spontanément, peut être à tord, que, dans le cas où un fichier - ou une chose - n'était pas copiable, alors le copyRecursively devait passer silencieusement dessus : je lui demande de copier récursivement, sauf bien sûr les choses non copiables.

    Si l'on a une approche plus sévère, alors le système devrait me renvoyer une exception de la famille des IOException.

    Le NullPointerException vient de ce que la méthode se trompe : elle croit que ma chose, n'étant pas un fichier, est un répertoire. C'est une erreur, quelque soit ce qu'il y a sur mon système à moi de fichiers.

    Ainsi, avec Linux, avec ton programme, si je fais l'essai avec /dev/null ou /dev/tty0 et sans doute tout ce qui se trouve dans /dev alors j'obtiens false et false : /dev/null n'est ni un répertoire, ni un fichier, et si je demande à Linux de me copier /dev/null par la commande cp, je n'ai aucune erreur, et j'ai un beau fichier de taille 0 à l'arrivée !

    En tous les cas je vais lire tes docs c'est toujours intéressant. Merci.

  12. #12
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Et bien voilà ça y est mon bug semble avoir été accepté ! Quelle joie !

    Priorité MINOR (humpf) disent-ils, un malheureux développeur affecté à cette tâche, etc.

    Quelle semaine faste pour l'open source, puisque j'ai découvert 2 bugs !

    Bon et pour ce thread présent je mets RESOLU.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    un malheureux développeur affecté à cette tâche
    Attends, tu rigoles, c'est Juergen Hoeller en personne qui est affecté à la tâche!!

    Une petite bio de Juergen :
    http://www.thespringexperience.com/c...n_hoeller.html

  14. #14
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Ah ben cela redonne de l'importance à mon bug effectivement !

    Si vous le connaissez dites lui de me contacter je lui donnerai le code et comme mon anglais est parfait and I transfert some files recursively since 20 years ago with a big experience of cp linux command and so on and so on and so on.

  15. #15
    Membre chevronné


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 855
    Par défaut
    Citation Envoyé par gifffftane Voir le message
    Quelle semaine faste pour l'open source, puisque j'ai découvert 2 bugs !
    Un grand merci d'avoir joué le jeux et pris le temps de les remonter

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    Oui merci gifffftane d'avoir joué le jeu.

    Pour Juergen, bien sûr que je le connais (on bosse dans la même boîte quand même!), pour info il devrait passer à Paris en Novembre, si tu es sur place je peux te tenir au courant.

  17. #17
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Et non je suis à Saint Etienne comme l'indique ma signature. Enfin bon cela n'empêche pas que je suis très heureux de mettre un pied à la participation de logiciels libres.

  18. #18
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Juste pour donner la fin du feuilleton : je viens de recevoir un mail pour me dire que le bug est reconnu et résolu http://jira.springframework.org/brow...s:all-tabpanel

    Bon, après cet exploit, je vais continuer mon exploration de spring

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 143
    Par défaut
    Excellent! Félicitations et merci!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bug dans le TCheckListBox ?
    Par Tardiff Jean-François dans le forum Composants VCL
    Réponses: 6
    Dernier message: 04/11/2004, 08h39
  2. Bug dans les expressions régulières ?
    Par SergioF dans le forum Linux
    Réponses: 8
    Dernier message: 12/05/2004, 15h14
  3. [PROPERTIES] Bug dans java.util.Properties ?
    Par mathieu dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 28/04/2004, 15h11
  4. bug dans une base Access
    Par bizouard dans le forum Access
    Réponses: 5
    Dernier message: 29/12/2003, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo