Ajouter un commentaire

Jgugliel

Rien que pour cette classe, le code fait 900 lignes. Et il y en a d'autres... Donc je sais pas vraiment par où commencer.

Je cherche peut-être les erreurs aux mauvais endroits. N'empêche que ce que j'ai écrit, ca marche sur ma machine. Manque de bol pour moi, ma machine ne sert qu'à tester car lorsque je lance le programme, je ne peux presque plus rien faire d'autre. Et quand je le lance sur la machine commune du labo, ca reste bloqué toujours à la même foutue requête. Je n'arrive vraiment pas à comprendre ce qui fait que ça peut marcher d'un côté et pas de l'autre (les OS : XP pour mon PC et XP Pro pour l'autre).

Maintenant je ne voulais absolument pas te froisser en modifiant ton code. Mais je préfère toujours chercher par moi-même avant d'appeler à l'aide. J'ai donc fait des tests de mon côté... Bon ben ca marche pas terrible mais j'aurais essayé :)

Revenons à ce programme...
Au départ, je lui balance un string et il lance un programme appelé BLAST via une requête http sur le serveur de mon labo. Pour cela j'utilise la classe HttpClient

private String post(String url, Map parameters) throws Exception {

    String response = "";
    int res = 0;
    boolean test = false;
    while (res != 200) {
      try {
        PostMethod postMethod = new PostMethod(url);
        Iterator keys = parameters.keySet().iterator();
        while (keys.hasNext()) {
          String name = (String) keys.next();
          String value = (String) parameters.get(name);
          postMethod.setParameter(name, value);
        }

        HttpClient httpClient = new HttpClient();
        res = httpClient.executeMethod(postMethod);
        System.out.println(res);
        if (res != 200) {
          res = 0;
        }
        response = postMethod.getResponseBodyAsString();
        postMethod.releaseConnection();
      }
      catch (IOException ex) {
      }
    }

    return response;
  }

C'est ce code que j'utilisais avant pour les requêtes qui me posent problème. Avant, ça marchait nickel.

Le résultat est un fichier XML qui est parsé afin de retirer les infos qui m'intéressent. J'utilise ces deux méthodes.

public Result readBlastResult(String xmlBlastResult) throws Exception {

    Document doc = null;
    boolean ok = false;
    while (!ok) {
      try {
        doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().
            parse(new InputSource(new StringReader(xmlBlastResult)));
        ok = true;
      }
      catch (Exception ex) {
        System.out.println("Connection to ncbi failed during the XML parsing");
      }
    }

    Result result = new Result();

    NodeList hits = doc.getElementsByTagName("Hit");
    for (int i = 0; i < hits.getLength(); ++i) {
      result.hits.add(fetchHit( (Element) hits.item(i)));
    }

    return result;
  }

  private Hit fetchHit(Element hitElement) throws Exception {
    Hit hit = new Hit();
    hit.id = (String) hitElement.getElementsByTagName("Hit_id").item(0).
        getFirstChild().getNodeValue();
    hit.len = (String) hitElement.getElementsByTagName("Hit_len").item(0).
        getFirstChild().getNodeValue();
    hit.def = (String) hitElement.getElementsByTagName("Hit_def").item(0).
        getFirstChild().getNodeValue();

    Element hsp = (Element) hitElement.getElementsByTagName("Hsp").item(0);
    hit.expectedValue = (String) hsp.getElementsByTagName("Hsp_evalue").item(
        0).
        getFirstChild().getNodeValue();

    return hit;
  }

Ca, c'est pas de moi, je l'ai ré-utilisé à mon compte.

Ensuite, j'utilise les informations récoltées afin de poster une requête à un serveur US contenant d'autres informations dont j'ai besoin.
Avant, je ré-utilisait la méthode post décrite plus haut, mais comme ça ne fonctionne plus...

  public void proteinRetrieve(Hit hit) throws Exception {
    boolean reallyAdded = false;
    boolean cds = false;
    String startPosition = "";
    String endPosition = "";
    String proteinSequence = "";
    String taxon = "";
    boolean complement = false;
    String compl = "false";

    String geneId = hit.getGI();
    MainFrame.subProgressBar.setString("Get files from gene " + geneId);
    MainFrame.subProgressBar.setMinimum(0);
    MainFrame.subProgressBar.setValue(0);
    MainFrame.subProgressBar.setStringPainted(true);
    MainFrame.subProgressBar.setIndeterminate(true);

// Send a request and receive a *.gb text file
    String results = "";
    System.out.println("Get files from gene " + geneId);
    String url = new String(
        "http://www.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&tool=PAQuery_v1.0&email=jgugliel@ulb.ac.be&id=" +
        geneId + "&rettype=gb&retmode=text");

    while (! (results.endsWith("//\n\n"))) {
      results = "";
      results = retrieve(url);  // là avant il y avait un appel de la méthode post...

La boucle while (! (results.endsWith me servait en fait à tester que le fichier a bien été intégralement téléchargé. Vu les problèmes de connexion qu'on a ici, je préfère être sûr. Le fichier gb récupéré est censé être formaté afin de faciliter les choses à quelqu'un comme moi désirant le parser sans trop de problèmes. Donc oui, je suis sûr qu'ils se terminent tous en //\n\n.
(D'ailleurs, oui j'ai fait exprès de rajouter les \n. Je sais que le ReadLine ne les prend pas. Alors je les mets là où ils devraient être... volontairement.)

Le retrieve(url), c'est en fait la méthode décrite dans le post précédent.

La suite je ne l'ai pas mise, c'est juste un parseur du fichier gb, et la suite du programme...

J'imagine que tout ce que tu vois là doit te piquer les yeux. Je suis conscent du fait que, comparé à un "vrai" code, ce que j'ai écrit semble horrible. Mais bon, j'ai jamais appris, et on m'a demandé de pondre un programme en 3 mois... j'ai fait au plus pressé :)

Merci du temps que tu me consacres.
Julien

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 FFFF  M   M  K  K  V     V      J 
F MM MM K K V V J
FFF M M M KK V V J
F M M K K V V J J
F M M K K V JJJ