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

Format d'échange (XML, JSON...) Java Discussion :

DocumentBuilderFactory très lent (?)


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut DocumentBuilderFactory très lent (?)
    Bonjour,

    J'ai codé une Applet parcourant un dossier passé en paramètre. Ce dossier contient des fichiers XML et je souhaite vérifier si ces derniers sont signés ou non. Or, mon Applet s'arrête au moment de la création du DocumentBuilderFactory.

    Voilà le code (simplifié : j'ai enlevé plusieurs lignes ne servant à rien dans mon problème) permettant de vérifier la présence d'une signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
    org.w3c.dom.Document xmlDoc = dbf.newDocumentBuilder().parse(f);
    NodeList nl = xmlDoc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
    
    if (nl.getLength() != 0) {
    	System.out.println("Fichier signé");
    }
    else {
    	System.out.println("Fichier non signé");
    }
    Après avoir rajouté des System.out.println() de partout, j'ai remarqué que l'exécution de l'Applet s'arrêtait bien à la ligne en gras.

    Autre remarque, l'Applet plante quand j'essaie d'exécuter mon Applet (qui est signée) sur un site utilisant SSL et authentification par certificat. Or, si je l'exécute sur une page HTML toute simple sur notre serveur local, tout fonctionne parfaitement (de même directement dans NetBeans).

    Quelqu'un aurait une idée de ce qui cause ce bug ?

    Merci d'avance.

    DarkSeiryu

    EDIT : aucun retour dans la console, comme si l'Applet cessait de s'exécuter).

  2. #2
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Sans certitude, ce se serait pas un soucis de permissions sur les fichiers XML ?
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  3. #3
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Je ne pense pas, étant donné qu'en lançant l'Applet depuis une autre page HTML (non sécurisé) dans le même navigateur (Opera), l'accès au fichier se fait sans problème.

    Et de toute façon, la ligne où ça bloque ne touche pas du tout au fichier. Par contre, d'autres parties de mon code le font avant l'appel à cette fonction de vérification et me donnent accès à ces fichiers.

    DarkSeiryu

  4. #4
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Du coup, juste pour confirmer que c'est bien l'Applet qui devient très lente au moment décrit. Nous l'avons laissé tourner 45min et elle a bien effectué les traitements de vérification des fichiers avant de passer à l'étape des signatures.

    Personne ne voit d'où ça pourrait venir ?

    DarkSeiryu

  5. #5
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Nouveaux éléments (désolé pour le double poste mais c'est pour être sûr que tout le monde y voit) :

    Je suis allé regarder dans les logs Apache, et je trouve à chaque exécution de mon Applet des lignes comme ça (j'ai pas tout mis, y'en a une chiée) :
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/Datas/version_fr.class HTTP/1.1" 404 463 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/Datas/version_fr.properties HTTP/1.1" 404 468 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/Datas/version_fr_FR.class HTTP/1.1" 404 466 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/Datas/version_fr_FR.properties HTTP/1.1" 404 471 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    192.168.1.81 - - [22/Mar/2012:13:28:55 +0100] "GET /scripts_mickael/META-INF/services/javax.xml.parsers.DocumentBuilderFactory HTTP/1.1" 404 499 "-" "Mozilla/4.0 (Windows 7 6.1) Java/1.7.0_03"
    Du coup, j'ai l'impression qu'il cherche des classes Java là où il ne risque pas d'en trouver et que du coup, il parcourt une grosse arborescence de fichiers avant d'arriver à trouver ce dont il a besoin.

    Qu'est-ce qu'il faut que je fasse pour empêcher ça ?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Marrant. Enfin, façon de parler. Apparemment, Java considère que ton site web fait partie du classpath disponible pour aller chercher des ressources.

    Je serais assez surpris que ce soit normal. Tu peux nous montrer avec quel code tu intègres l'applet dans la page ? C'est bien un .jar, n'est-ce pas ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Merci pour ta réponse.

    Pour te répondre, oui c'est bien un Jar et voici le code de la page PHP qui appelle l'Applet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php echo 'Hello world !<br />'; ?>
     
    <object type="application/x-java-applet" width="800" height="500">
    	<param name="archive" value="../applets/dist/AppletMPI-v7/Applet-v7-Helios.jar" />
    	<param name="code" value="ExportHeliosJApplet.class" />
    	<param name="Id_Client" value="1" >
    	<param name="Id_Etablissement" value="5" >
    	<param name="SIRET" value="12345678901234" >
    	<param name="Sequestre" value="C:\Sequestres\Helios" >
    	<param name="urlTransfert" value="http://www.aws-france.com" >
    	<param name="urlFin" value="http://www.aws-france.com" >
    </object>
    PS : ouais moi aussi j'trouve ça marrant !

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ca n'a rien d'étonnant, on peux très bien avoir les applets en dehors de jar. Du coup, tout appel à getResource tente de la charger depuis le site en question.

    Vu ton code, tu lui dit d'utiliser un archive (le jar) mais aussi un .class précis (relatif à la page web donc).


    Retire ce .class et normalement il devrais comprendre que tout est dans le/les jar.

    regarde aussi si le jar n'a pas un classpath dans son META-INF/MANIFEST.MF qui incluerais "." (donc la page web de nouveau).

    Aussi, toutes tes classes devraient avoir un package!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <object type="application/x-java-applet" width="800" height="500">
    	<param name="archive" value="../applets/dist/AppletMPI-v7/Applet-v7-Helios.jar" />
    	<param name="code" value="monpackage.ExportHeliosJApplet" />
    	<param name="Id_Client" value="1" >
    	<param name="Id_Etablissement" value="5" >
    	<param name="SIRET" value="12345678901234" >
    	<param name="Sequestre" value="C:\Sequestres\Helios" >
    	<param name="urlTransfert" value="http://www.aws-france.com" >
    	<param name="urlFin" value="http://www.aws-france.com" >
    </object>
    je rajoute que les deux seules méthode documentées par oracle pour le déploiement sont <applet> et jnlp, pas <object>

    http://docs.oracle.com/javase/tutori...ingApplet.html
    http://docs.oracle.com/javase/tutori...plet/html.html

  9. #9
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    VOIR EDIT EN BAS DE CE POST. MERCI.

    Yo.

    J'ai effectué les modif' que tu m'as indiqué (y compris mettre mes classes dans un nouveau package), mais ça n'a rien changé. Je vois toujours le même style d'entrées dans les logs Apache...

    Code d'appel de l'Applet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <object type="application/x-java-applet" width="800" height="500">
    	<param name="archive" value="../applets/dist/AppletMPI-v7/Applet-v7-Helios.jar" />
    	<param name="code" value="applets.ExportHeliosJApplet" />
    	<param name="Id_Client" value="1" >
    	<param name="Id_Etablissement" value="5" >
    	<param name="SIRET" value="12345678901234" >
    	<param name="Sequestre" value="C:\Sequestres\Helios" >
    	<param name="urlTransfert" value="http://www.aws-france.com" >
    	<param name="urlFin" value="http://www.aws-france.com" >
    </object>
    Citation Envoyé par tchize_ Voir le message
    je rajoute que les deux seules méthode documentées par oracle pour le déploiement sont <applet> et jnlp, pas <object>

    http://docs.oracle.com/javase/tutori...ingApplet.html
    http://docs.oracle.com/javase/tutori...plet/html.html
    Oui, mais j'ai cru comprendre que la balise <applet> n'est pas utilisé en HTML5 mais plutôt <object>. Du coup, je dois écouter qui ? La W3C ou Oracle ?

    EDIT : j'ai voulu afficher mon classpath dans la console à partir de l'Applet, voici ce que ça donne : C:\\Program Files\\Java\\jre7\\classes. Or, je n'ai ni fichier ni dossier "classes" dans C:\\Program Files\\Java\\jre7\\

    Ca viendrait de ça ?

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message

    Oui, mais j'ai cru comprendre que la balise <applet> n'est pas utilisé en HTML5 mais plutôt <object>. Du coup, je dois écouter qui ? La W3C ou Oracle ?
    Pour le moment, oracle. HTML5, ça n'existe pas

    Si tu veux de la compatibilité avec le futur, l'option jnlp est recommandée par oracle.

    j'ai voulu afficher mon classpath dans la console à partir de l'Applet, voici ce que ça donne : C:\\Program Files\\Java\\jre7\\classes. Or, je n'ai ni fichier ni dossier "classes" dans C:\\Program Files\\Java\\jre7\\

    Ca viendrait de ça ?
    Comment tu affiche ce classpath (code)? Cet élément m'a l'air de faire partie normalement du classpath (on y inclue la JRE et ses extensions éventuelles)

  11. #11
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Pour le moment, oracle. HTML5, ça n'existe pas

    Si tu veux de la compatibilité avec le futur, l'option jnlp est recommandée par oracle.
    Ca marche, merci pour les précisions.

    Citation Envoyé par tchize_ Voir le message
    Comment tu affiche ce classpath (code)? Cet élément m'a l'air de faire partie normalement du classpath (on y inclue la JRE et ses extensions éventuelles)
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("\nCLASSPATH : " + System.getProperty("java.class.path") + "\n");

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    effectivement, ca ne te fournira aucune information utile cette ligne. Elle ne tiens pas compte des classloader supplémentaires (utilisé par la sandbox notamment).

    Tu peux par exemple partir de ton Classloader, caster (ça passe ou ça casse) en urlclassloader et afficher toutes les urls. Ensuite récusivement avec le classloader parent

  13. #13
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Yo.

    Désolé de répondre que maintenant, pas là du week-end.

    Citation Envoyé par tchize_ Voir le message
    Tu peux par exemple partir de ton Classloader, caster (ça passe ou ça casse) en urlclassloader et afficher toutes les urls. Ensuite récusivement avec le classloader parent
    J'suis pas un nOOB en Java, mais j'suis loin d'être rôdé dessus, du coup comment je fais ça ?

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    URLClassLoader monClassLoader = (URLClassLoader)taclasse.getClassloader();

    Après ça tu regarde dans l'API de URLClassLoader et il y a tout ce qu'il te faut dedans.

  15. #15
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Re.

    J'ai essayé ce que tu m'as dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    System.out.println("\nURLs de la classe " + this.getClass().getName() + " :");
    URLClassLoader urlClassLoader = (URLClassLoader) this.getClass().getClassLoader();
    for (URL url : urlClassLoader.getURLs()) {
    	System.out.println("\t- Path : " + url.getPath() + " | File : " + url.getFile());
    }
    J'ai placé ce bout de code dans deux classes différentes, voici le résultat affiché dans la console :

    URLs de la classe applets.ExportHeliosJApplet :
    - Path : /java/Applet-v7-Helios.jar | File : /java/Applet-v7-Helios.jar
    - Path : /helios/helios/modifierenvoi/id/194/tab/ | File : /helios/helios/modifierenvoi/id/194/tab/


    URLs de la classe OutilsAWS.Enveloppes :
    - Path : /java/Applet-v7-Helios.jar | File : /java/Applet-v7-Helios.jar
    - Path : /helios/helios/modifierenvoi/id/194/tab/ | File : /helios/helios/modifierenvoi/id/194/tab/
    L'URL dans les lignes en gras est celle de la page sur laquelle l'Applet est exécutée.

    Du coup, je comprends pourquoi je vois ce que je vois dans les logs Apache. Cela dit, j'comprends pas pourquoi il y a ça dans l'URLClassLoader.

    Donc, comment faire pour corriger ça ?

    DarkSeiryu

Discussions similaires

  1. BDD sur réseau très très très lent...
    Par ericain dans le forum Access
    Réponses: 12
    Dernier message: 20/02/2015, 17h17
  2. Ouverture et fermeture de base très lent...
    Par Tofdelille dans le forum Installation
    Réponses: 6
    Dernier message: 19/09/2006, 18h51
  3. [Lomboz] Editeur jsp très lent
    Par lr dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 29/01/2005, 19h43
  4. SQL Server trés lent
    Par arwen dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 07/11/2003, 14h45

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