Format Indicator
Un message qui ne dit pas qui il est rend impossible la coexistence de plusieurs versions. Le pattern Format Indicator demande au message d'auto-déclarer son format et sa version, dès la première ligne.
Problème
Un hub EDI reçoit en continu des messages issus de partenaires qui n'ont pas tous adopté la même version : Walmart est encore en X12 004010, Costco a migré en 005010, une chaîne européenne envoie en EDIFACT D.96A pendant qu'une autre est passée en D.24A. Comment le hub sait-il quel parser utiliser sans agréger un annuaire par partenaire ? Et que se passe-t-il quand un partenaire change silencieusement de millésime entre deux envois ?
Forces
- Coexistence de millésimes. Aucun standard EDI ne remplace ses versions du jour au lendemain : 4010, 5010 et 6020 coexistent dans la même DMZ pendant des années.
- Changements unilatéraux. Un partenaire peut migrer sa version sans préavis dans le sens où ses systèmes le supportent ; le hub doit suivre, pas casser.
- Échecs silencieux. Sans format indicator, un parser 4010 lit un 5010 « à peu près » — les nouveaux segments sont ignorés ou plantent silencieusement. Les pires bugs EDI.
- Inspection sans contexte. Un opérateur qui ouvre un fichier dans la file d'archive doit savoir à quel format il fait face, sans lire la convention bilatérale.
Solution
EIP §180 (Hohpe & Woolf, 2003) prescrit : chaque message porte, dans une zone très en amont du payload, un indicateur explicite de format et de version. Le récepteur lit cet indicateur en premier, sélectionne le parser approprié, et seulement ensuite consomme le reste du payload. Le pattern est si fondamental qu'il est encodé dans tous les standards EDI sérieux.
EDIFACT — UNH S009
Le segment UNH (Message Header) commence par un composite
S009 — Message Identifier qui porte : type de message
(ORDERS), numéro de version (D), release
(96A), agence contrôlante (UN), et code
d'association optionnel (EAN008 pour EANCOM, etc.). C'est
le format indicator canonique d'EDIFACT — il dit en quatre champs
exactement quel dictionnaire de segments utiliser.
UNB+UNOC:3+SENDER:14+RECEIVER:14+260514:1545+ORD202605140001'
UNH+1+ORDERS:D:96A:UN:EAN008'
... segments ORDERS ...
UNT+12+1'
UNZ+1+ORD202605140001' X12 — GS08 et ISA12
En X12, deux indicateurs coexistent. ISA12 (Interchange
Control Version Number) déclare la version de la syntaxe
d'enveloppe (00401, 00501) — c'est la
grammaire ISA / IEA elle-même. GS08 (Version / Release /
Industry Identifier Code) déclare la version des transaction sets dans
le groupe (004010, 005010X222A1 pour le 837
HIPAA). Un même interchange peut, en théorie, contenir plusieurs
groupes en versions différentes.
ISA*00* *00* *ZZ*SENDERID *ZZ*RECEIVERID *260514*1545*U*00401*900042001*0*P*>~
GS*PO*SENDERID*RECEIVERID*20260514*1545*42*X*004010~
ST*850*0001~
...
SE*42*0001~
GE*1*42~
IEA*1*900042001~
Lecture : ISA12 = 00401 dit « syntaxe d'enveloppe
4010 ». GS08 = 004010 dit « transaction sets
4010 ». Une suite HIPAA porterait 005010X222A1 qui
encode aussi le sous-profil industriel.
UBL / cXML — namespace et version
Côté XML, le format indicator est porté par le namespace XML et un
attribut version explicite. Une facture UBL déclare son
namespace urn:oasis:names:specification:ubl:schema:xsd:Invoice-2
avec UBLVersionID et CustomizationID (par
exemple urn:cen.eu:en16931:2017 pour PEPPOL BIS 3.0).
cXML déclare sa version dans l'attribut version de
l'élément racine.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.069/cXML.dtd">
<cXML xmlns:xml="http://www.w3.org/XML/1998/namespace"
payloadID="20260514@partner-a"
timestamp="2026-05-14T15:45:00-05:00"
version="1.2.069">
...
</cXML> AS2 / AS4 — Content-Type et Service
En transport, AS2 (RFC 4130) utilise le MIME Content-Type
pour indiquer le format applicatif : application/EDI-X12,
application/EDIFACT, application/xml. AS4
(OASIS ebMS3) va plus loin avec eb:Service et
eb:Action qui encodent un identifiant de service business
(busdox:noprocess en PEPPOL) — un format indicator de
granularité fine, lu par le routeur AS4 avant même l'inspection du
payload.
Anti-patterns
- Format implicite par canal. « Tout ce qui
arrive sur
/edi/inbound/x12est en X12 4010 ». Faux dès que le partenaire migre : le hub plante en silence ou ignore les nouveaux segments. - Sniffing du contenu. Détecter X12 vs EDIFACT en regardant les premiers octets fonctionne pour le standard mais pas pour la version. Un sniffer ne distingue pas un 4010 d'un 5010 — le format indicator déclaratif est plus fiable.
- Ignorer le format indicator. Tous les standards le portent. L'ignorer pour gagner trois lignes de code revient à réinventer le pattern par-dessus, avec moins de robustesse.
- Incohérence Content-Type vs payload. Un AS2
application/EDI-X12qui contient du JSON est un bogue silencieux côté émetteur ; le récepteur doit valider la cohérence et alerter si elle est rompue.
Patterns liés
- Normalizer — consomme le Format Indicator pour choisir le Translator approprié.
- Message Translator — convertit d'un format vers un autre, identifié par les indicators.
- Content-Based Router — peut router en fonction du format indicator, pas seulement du contenu.
- Message History — devrait conserver les indicateurs de format à chaque étape pour l'audit.
Sources
- Hohpe G., Woolf B. — Enterprise Integration Patterns, pattern Format Indicator (§180). enterpriseintegrationpatterns.com — Format Indicator
- ISO 9735 — segment UNH, composite S009 (Message Identifier), structure du format indicator EDIFACT.
- X12 .004010 — ISA / GS. Définition des Interchange Control Version (ISA12) et GS Version (GS08).
- OASIS — UBL 2.1. Spécification de
UBLVersionIDetCustomizationID. docs.oasis-open.org/ubl/UBL-2.1 - RFC 4130 — AS2. Section sur le Content-Type applicatif transporté en MIME. rfc-editor.org/rfc/rfc4130