- SipG est une bibliothèque pour générer et valider des archives aux formats FNTC v4 et SEDA v2.1 & v2.2.
La librairie SipG offre les fonctionnalités suivantes :
- Génération d’un SIP conforme aux formats FNTC v4 et SEDA v2.1 & v2.2
- Suivi précis des étapes de validation par callback
- Validation optionnelle du fichier de description de l'archive par un profil RNG
- Application automatique de valeurs par défaut raisonnables
- Support des tags et des fragments XML étendus
- Identification des formats des objets binaires (intégration de la librairie Droid)
- Calcul automatique des empreintes des objets binaires
- Support des archives numériques et physiques
- Validation complète d'une archive existante aux formats FNTC v4 ou SEDA v2.1 & v2.2
- Sérialisation/désérialisation du fichier de description au format JSON
- Capacité à générer des archives extrêmement volumineuses (plus de 100 000 objets)
- Support du multi-threads lors de la génération de l'archive
- Documentation Javadoc exhaustive
Le standard d'échange de données pour l'archivage SEDA modélise les différentes transactions qui peuvent avoir lieu entre des acteurs dans le cadre de l'archivage de données.
La documentation complète du SEDA v2 est disponible sur le site de France Archive.
Le standard FNTC v4 est un standard d'échange de données élaboré dans le cadre de la FNTC.
Le standard FNTC v4 a pour principales caractéristiques :
- Compatibilité avec les normes MEDONA & DEPIP supportées par le SIAF
- Proximité syntaxique et sémantique avec le standard SEDA 2.1
- Syntaxe non ambigüe en regard du XSD 1.0
- Ontologie de description des unités d'archives réduite et simple
- Extension de l’ontologie autorisée dans un cadre bien défini
Les principales différences entre les formats SEDA v2 et FNTC v4 sont listées ici.
La librairie SipG a pour objectif de faciliter la création et la validation d'archives. Dans un premier temps, l'application de traitement des archives récupère et transforme les données métiers, puis grâce à SipG, génère et valide les SIP (Submission Information Package) dans un format compatible avec celui du système d'archivage.
Le répertoire contenant les tests d'intégration fournit de nombreux exemples d'utilisation de la librairie.
SipG supporte les versions 2.1 et 2.2 de la norme SEDA.
Sedav2Service service21 = Sedav2Service.getInstance(); // Seda 2.1
Sedav2Service service22 = Sedav2Service.getV22Instance(); // Seda 2.2
ArchiveUnit unit = new ArchiveUnit(); // Instancie l’unité d’archive
unit.setBinaryPath(Paths.get("dummy.pdf")); // Spécifie le fichier de données
unit.addTitle("MyTitle"); // Spécifie un titre
unit.addTag("This is a tag"); // Spécifie un mot clé
ArchiveTransfer archiveTransfer = new ArchiveTransfer(); // Instancie l’archive à transférer
archiveTransfer.setArchivalAgreement("My Archival Agreement"); // Spécifie le contrat
archiveTransfer.setArchivalAgency("AG001", ""); // Spécifie le service d’archive
archiveTransfer.setTransferringAgency("AG002", ""); // Spécifie le service versant
archiveTransfer.addArchiveUnit(unit); // Ajoute l’unité à l’archive
Sedav2Service.getInstance().write(archiveTransfer, Paths.get("seda.zip")); // Génère le SIP en Seda v2.1
...
Sedav2Service.getV22Instance().write(archiveTransfer, Paths.get("seda.zip")); // Génère le SIP en Seda v2.2
Fichier CSV :
dummy.pdf;MyTitle1;tag1
dummy.pdf;MyTitle2;tag2
dummy.pdf;MyTitle3;tag3
dummy.pdf;MyTitle4;tag4
dummy.pdf;MyTitle5;tag5
Code :
ArchiveTransfer archiveTransfer = new ArchiveTransfer(); // Instancie l’archive
archiveTransfer.setArchivalAgreement("My Agreement");
archiveTransfer.setArchivalAgency("AG001", "My Archive Agency");
archiveTransfer.setTransferringAgency("AG002", "My Transfer Agency");
try (BufferedReader reader = Files.newBufferedReader(csvPath)) { // Ouvre le fichier CSV
CSVParser parser = CSVFormat.DEFAULT.withDelimiter(';').parse(reader); // Instancie le parser CSV
for (CSVRecord record : parser) { // Parcours le fichier CSV
ArchiveUnit unit = new ArchiveUnit(); // Une archive peut contenir
unit.setBinaryPath(Paths.get(record.get(0))); // plusieurs unités d'archives
unit.addTitle(record.get(1));
unit.addTag(record.get(2));
archiveTransfer.addArchiveUnit(unit); // Ajout de l'unité à l'archive
}
}
Sedav2Service.getInstance().write(archiveTransfer, Paths.get("seda.zip")); // Génère le SIP
Path path = Paths.get("seda_small.xml"); // Le fichier XML à valider
Sedav2Service.getInstance().validate(path); // Validation du fichier en Seda v2.1
Sedav2Service.getV22Instance().validate(path); // Validation du fichier en Seda v2.2
Path path = Paths.get("seda_small.xml"); // Le fichier XML à valider
Path rngPath = Paths.get("seda_small.rng"); // Le profil RNG
Validator rng = Validators.getRngValidator(rngPath); // Création d'un validator RNG
Validators.validate(path, rng); // Validation du fichier avec le validateur
Code :
Path input = Paths.get("seda.zip"); // Archive à valider
Sedav2Config cnf = Sedav2Config.DEFAULT; // Configuration pour contrôler la validation
Validator val = null; // Validation RNG optionnelle
Sedav2Service.getInstance().validate(input, val, cnf, event -> LOGGER.info(event.toString()));
Résultat de la validation :
ProgressEvent{id=seda, status=SUCCESS, step=START, message=Archive: seda.zip}
ProgressEvent{id=seda, status=SUCCESS, step=ARCHIVE_EXIST, message=Archive exists}
ProgressEvent{id=seda, status=SUCCESS, step=ARCHIVE_READABLE, message=Archive is readable}
ProgressEvent{id=seda, status=SUCCESS, step=ARCHIVE_UNZIP, message=Archive is opened}
ProgressEvent{id=seda, status=SUCCESS, step=MANIFEST_EXIST, message=Manifest exists}
ProgressEvent{id=seda, status=SUCCESS, step=MANIFEST_SEDA, message=Manifest conforms to SEDA}
ProgressEvent{id=seda, status=SUCCESS, step=MANIFEST_PARSE, message=Manifest is parsed}
ProgressEvent{id=seda, status=SUCCESS, step=BINARY_EXIST, message=Binary object exists: Content/helloworld_1.pdf}
ProgressEvent{id=seda, status=SUCCESS, step=BINARY_FOLDER, message=Binary object folder is valid}
ProgressEvent{id=seda, status=SUCCESS, step=BINARY_SIZE, message=Binary object size is valid}
ProgressEvent{id=seda, status=SUCCESS, step=BINARY_DIGEST, message=Binary object digest is valid}
ProgressEvent{id=seda, status=SUCCESS, step=BINARY_EXIST, message=Binary object exists: Content/helloworld_2.pdf}
ProgressEvent{id=seda, status=SUCCESS, step=BINARY_FOLDER, message=Binary object folder is valid}
ProgressEvent{id=seda, status=SUCCESS, step=BINARY_SIZE, message=Binary object size is valid}
ProgressEvent{id=seda, status=SUCCESS, step=BINARY_DIGEST, message=Binary object digest is valid}
ProgressEvent{id=seda, status=SUCCESS, step=COMPLETE, message=Archive is valid}
Fichier minisip.json :
{
"codeListVersions": {},
"archivalAgreement": "My Archival Agreement",
"archivalAgency": {
"identifier": "AG001"
},
"transferringAgency": {
"identifier": "AG002"
},
"archiveUnits": [{
"binaryPath": "file:///resources/dummy.pdf",
"binaryVersion": "BinaryMaster_1",
"digestAlgorithm": "SHA-512",
"titles": [{ "message": "MyTitle" }],
"descriptions": [{ "message": "This is a description" }]
}]
}
Code :
Path jsonPath = Paths.get("minisip.json");
ArchiveTransfer archiveTransfer = JsonService.getInstance().read(jsonPath);
L'objet archiveTransfer, issu de la désérialisation, peut ainsi être utilisé et modifié pour générer une nouvelle archive.
- Forker le projet Github
- Créer sa propre branche (git checkout -b newFeature)
- Commiter les modifications (git commit -am "nouvelle modification")
- Pusher la branche (git push origin newFeature)
- Créer une pull request
Après avoir testé la nouvelle release:
- Modifier la version dans le fichier pom.xml
- Commiter les modifications avec le message "Bump to version 1.4"
- Associer un tag à ce commit (voir exemple ci-dessous)
git tag -a v1.4 -m "Sipg version 1.4"
git push origin v1.4 or git push origin --tags
- Sur github, exécuter le workflow "Deploy on Maven central" pour copier l'artifact SipG sur le serveur Nexus Sonatype
- Note. l'authentification par API sur le serveur Nexus nécessite un token généré depuis l'interface web du serveur Sonatype (Menu profile/User Token)
- Puis, se connecter à l'interface web du serveur Sonatype
- Aller dans Staging Repositories
- Passer les étapes du workflow déploiement (close, etc.)
- Chaque étape peut prendre quelques minutes
La librairie SipG est publiée en Open Source sous licence libre Apache v2.
La librairie Droid éditée par The British National Archive est disponible sur Github sous licence BSD.