Struts 1 sans API: l'export CSV de l'écran, lu tel qu'il sort
Objectif Lire une application Struts 1 qui n'a pour toute sortie que l'export CSV de son écran, et être prévenu d'un retour client qui attend une pièce depuis plus de 30 jours.
Un fabricant de pompes gère ses retours clients dans un intranet Struts 1 écrit en 2007: Tomcat, JSP, DisplayTag. Aucune API; l'écran a un lien d'export CSV, et une tâche planifiée le récupère chaque nuit.
pas d'en-tête, ISO-8859-1, un guillemet échappé par une barre oblique inverse;
des montants groupés par une espace insécable: « 2 310,00 »;
le lendemain, les retours clos sortent de la table, sept retours en attente de pièce lèvent une décision.
RMA-26-0001,20/08/2026,Agri-Services Dubreuil,Vanne V-40,Surchauffe,Reçu,"89,90",78
RMA-26-0002,21/08/2026,"Léon, Fils & Cie",Surpresseur S-3,Casse au transport,Avoir à émettre,"2 310,00",77
RMA-26-0003,22/08/2026,Établissements Morvan,Pompe P-220,Erreur de référence,Ouvert,"1 234,50",76
RMA-26-0005,28/08/2026,Agri-Services Dubreuil,Vanne V-40,"Client: \"pièce jamais reçue\", relancé",En expertise,"179,80",70
RMA-26-0006,28/08/2026,Quincaillerie Bérard,Carte électronique CE-12,Ne démarre pas,En attente pièce,"636,00",70
RMA-26-0007,29/08/2026,Côté Jardin Négoce,Carte électronique CE-12,Erreur de référence,En attente pièce,"318,00",69
RMA-26-0008,31/08/2026,Thermique de l'Ouest,Surpresseur S-3,"Bruit anormal, vibrations",En attente pièce,"4 620,00",67
RMA-26-0009,01/09/2026,Plomberie Garnier SARL,Carte électronique CE-12,Erreur de référence,Ouvert,"318,00",66
RMA-26-0010,03/09/2026,Hydro Saône,Carte électronique CE-12,Fuite au joint,En attente pièce,"636,00",64
RMA-26-0011,04/09/2026,"Léon, Fils & Cie",Pompe P-220,"Client: \"pièce jamais reçue\", relancé",Avoir à émettre,"1 234,50",63
RMA-26-0012,08/09/2026,Plomberie Garnier SARL,Carte électronique CE-12,"Client: \"pièce jamais reçue\", relancé",Avoir à émettre,"636,00",59
RMA-26-0013,11/09/2026,Thermique de l'Ouest,Surpresseur S-3,Surchauffe,En attente pièce,"2 310,00",56
RMA-26-0014,13/09/2026,"Léon, Fils & Cie","Moteur M-1,5 kW","Client: \"pièce jamais reçue\", relancé",En expertise,"612,75",54
RMA-26-0015,14/09/2026,Thermique de l'Ouest,Vanne V-40,Ne démarre pas,Ouvert,"89,90",53
RMA-26-0016,16/09/2026,Établissements Morvan,Vanne V-40,Fuite au joint,Reçu,"89,90",51
RMA-26-0017,17/09/2026,Plomberie Garnier SARL,Pressostat PR-6,"Bruit anormal, vibrations",En attente pièce,"46,20",50
RMA-26-0018,19/09/2026,Plomberie Garnier SARL,Pompe P-220,Casse au transport,Ouvert,"1 234,50",48
RMA-26-0020,21/09/2026,"Léon, Fils & Cie",Pompe P-220,Surchauffe,En expertise,"1 234,50",46
RMA-26-0021,23/09/2026,Hydro Saône,Surpresseur S-3,"Bruit anormal, vibrations",Reçu,"2 310,00",44
RMA-26-0022,24/09/2026,Hydro Saône,Pressostat PR-6,Surchauffe,En attente pièce,"46,20",43
… 25 lignes de plus
$ lm connector run scenario-struts-arun scheduled: c963af0f-d820-4fec-abd0-760c0f7a0505$ lm run get c963af0f-d820-4fec-abd0-760c0f7a0505ID CONNECTOR ENDPOINT STATUS IN OUT SKIPPED DEAD-LETTERS STARTED ENDED EVALUATED
c963af0f scenario-struts-a default Completed 45 45 0 0 2026-11-07 16:14 2026-11-07 16:14 yes• 1 row(s) removed — the source no longer holds them$ lm inbox --process scenario-struts-waiting-aID WHEN PROCESS MESSAGE ENTITY_KEY
25492 just now scenario-struts-waiting-a RMA-26-0022 (Hydro Saône, Pressostat PR-6): waiting for a part for 43 days RMA-26-0022
25491 just now scenario-struts-waiting-a RMA-26-0017 (Plomberie Garnier SARL, Pressostat PR-6): waiting for a part for 50 days RMA-26-0017
25490 just now scenario-struts-waiting-a RMA-26-0013 (Thermique de l'Ouest, Surpresseur S-3): waiting for a part for 56 days RMA-26-0013
25489 just now scenario-struts-waiting-a RMA-26-0010 (Hydro Saône, Carte électronique CE-12): waiting for a part for 64 days RMA-26-0010
25488 just now scenario-struts-waiting-a RMA-26-0008 (Thermique de l'Ouest, Surpresseur S-3): waiting for a part for 67 days RMA-26-0008
25487 just now scenario-struts-waiting-a RMA-26-0007 (Côté Jardin Négoce, Carte électronique CE-12): waiting for a part for 69 days RMA-26-0007
25486 just now scenario-struts-waiting-a RMA-26-0006 (Quincaillerie Bérard, Carte électronique CE-12): waiting for a part for 70 days RMA-26-0006
default
Completed · IN 45 · OUT 45 · DEAD-LETTERS 0
hub
45 RMAs in the table; gone: RMA-26-0004, RMA-26-0019, RMA-26-0030; RMA-26-0040: Reçu
RMA-26-0006
RMA-26-0006 (Quincaillerie Bérard, Carte électronique CE-12): waiting for a part for 70 days
RMA-26-0007
RMA-26-0007 (Côté Jardin Négoce, Carte électronique CE-12): waiting for a part for 69 days
RMA-26-0008
RMA-26-0008 (Thermique de l'Ouest, Surpresseur S-3): waiting for a part for 67 days
RMA-26-0010
RMA-26-0010 (Hydro Saône, Carte électronique CE-12): waiting for a part for 64 days
RMA-26-0013
RMA-26-0013 (Thermique de l'Ouest, Surpresseur S-3): waiting for a part for 56 days
RMA-26-0017
RMA-26-0017 (Plomberie Garnier SARL, Pressostat PR-6): waiting for a part for 50 days
RMA-26-0022
RMA-26-0022 (Hydro Saône, Pressostat PR-6): waiting for a part for 43 days
Le run dit « 1 row(s) removed »: c'est la baisse de la table. Les lignes n'ont pas de clé; trois retours clos et deux ouverts font 1.
L'ancienneté change chaque nuit, donc chaque ligne est réécrite: c'est ainsi que la règle, déclarée après la première lecture, voit les sept retours. Ce que devient la décision d'un retour qui attend encore la troisième nuit n'a pas été joué.
Le lien d'export est appelé sans session. Une application qui exige une connexion pour son écran demande un cookie de session: non joué ici.
La tâche cron est jouée par le script du scénario, pas par un crontab.
Retours, clients et montants synthétiques; Struts 1.3.10, DisplayTag 1.2 et Tomcat 9 sont réels.
SAV · Struts 1
Les retours clients vivent dans un intranet de 2007.