From 5c75655d5a37958423bb4c5a1e4bd9b3447dce78 Mon Sep 17 00:00:00 2001 From: Daniel Radeau Date: Mon, 20 Oct 2025 18:51:56 +0200 Subject: [PATCH] story #15307 refactor(sedalib/resip): improve SEDA version handling changes: * pass SEDA version from int to enumeration in sedalib * add observable SEDA version changes in resip --- .../gouv/vitam/tools/resip/app/ResipApp.java | 42 ++--- .../tools/resip/app/ResipGraphicApp.java | 53 +++--- .../fr/gouv/vitam/tools/resip/data/Work.java | 40 ++--- .../gouv/vitam/tools/resip/event/Event.java | 4 + .../vitam/tools/resip/event/EventBus.java | 31 ++++ .../tools/resip/event/EventListener.java | 6 + .../resip/event/SedaVersionChangedEvent.java | 15 ++ .../frame/preferences/PreferencesDialog.java | 43 ++--- .../preferences/SedaVersionSelector.java | 10 +- .../resip/parameters/TreatmentParameters.java | 69 ++++---- .../XMLArchiveUnitEditorPanel.java | 56 +++--- .../vitam/tools/resip/threads/AddThread.java | 3 +- .../threads/ChangeSeda2VersionThread.java | 29 ++-- .../tools/resip/threads/ImportThread.java | 3 +- .../tools/resip/parameters/WorkTest.java | 2 +- sedalib/pom.xml | 12 ++ .../tools/sedalib/core/ArchiveTransfer.java | 19 ++- .../tools/sedalib/core/BinaryDataObject.java | 35 ++-- .../tools/sedalib/core/DataObjectGroup.java | 5 +- .../sedalib/core/PhysicalDataObject.java | 30 +--- .../tools/sedalib/core/SEDA2Version.java | 160 ------------------ .../tools/sedalib/core/seda/SedaContext.java | 13 ++ .../tools/sedalib/core/seda}/SedaVersion.java | 20 ++- .../core/seda/SedaVersionConverter.java | 114 +++++++++++++ .../metadata/compacted/FileObject.java | 5 +- .../sedalib/metadata/content/Content.java | 7 +- .../tools/sedalib/metadata/content/Event.java | 7 +- .../content/PersistentIdentifier.java | 3 +- .../metadata/content/SigningInformation.java | 3 +- .../namedtype/ComplexListInterface.java | 160 ++++++++++++++---- .../namedtype/ComplexListMetadataMap.java | 5 +- .../metadata/namedtype/ComplexListType.java | 83 ++------- ...rType.java => LinkingAgentIdentifier.java} | 9 +- .../tools/sedalib/xml/SEDAXMLEventReader.java | 13 +- .../tools/sedalib/xml/SEDAXMLValidator.java | 31 ++-- .../tools/sedalib/SedaContextExtension.java | 21 +++ .../sedalib/core/BinaryDataObjectTest.java | 23 ++- .../sedalib/core/DataObjectPackageTest.java | 3 + .../sedalib/core/GlobalMetadataTest.java | 3 + .../sedalib/core/PhysicalDataObjectTest.java | 24 ++- .../tools/sedalib/core/SEDA2VersionTest.java | 31 ++-- .../ArchiveTransferSerDeserializerTest.java | 3 + .../core/seda/SedaVersionConverterTest.java | 138 +++++++++++++++ ...rchiveDeliveryRequestReplyFromXmlTest.java | 3 + .../inout/ArchiveTransferToFromXmlTest.java | 3 + .../inout/CSVMetadataExporterTest.java | 3 + ...tadataToDataObjectPackageImporterTest.java | 3 + ...SVTreeToDataObjectPackageImporterTest.java | 3 + .../inout/CompressedFileImportTest.java | 3 + .../sedalib/inout/DiskImportExportTest.java | 3 + .../sedalib/inout/SEDAValidationTest.java | 17 +- .../tools/sedalib/inout/SIPBuilderTest.java | 3 + .../tools/sedalib/inout/SIPImportTest.java | 12 +- .../importer/CSVMetadataFormatterTest.java | 3 + .../metadata/ArchiveUnitProfileTest.java | 3 + .../tools/sedalib/metadata/ContentTest.java | 17 +- .../tools/sedalib/metadata/DataTest.java | 3 + .../metadata/ManagementMetadataTest.java | 3 + .../sedalib/metadata/ManagementTest.java | 3 + .../tools/sedalib/process/CompactorTest.java | 16 +- .../sedalib/process/DeCompactorTest.java | 3 + .../vitam/tools/sedalib/utils/ArchTests.java | 3 + .../sedalib/utils/LocalDateTimeUtilTest.java | 5 +- .../tools/sedalib/utils/ResourceUtils.java | 4 + .../tools/sedalib/xml/SEDAValidationTest.java | 15 +- 65 files changed, 893 insertions(+), 624 deletions(-) create mode 100644 resip/src/main/java/fr/gouv/vitam/tools/resip/event/Event.java create mode 100644 resip/src/main/java/fr/gouv/vitam/tools/resip/event/EventBus.java create mode 100644 resip/src/main/java/fr/gouv/vitam/tools/resip/event/EventListener.java create mode 100644 resip/src/main/java/fr/gouv/vitam/tools/resip/event/SedaVersionChangedEvent.java delete mode 100644 sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/SEDA2Version.java create mode 100644 sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaContext.java rename {resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences => sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda}/SedaVersion.java (59%) create mode 100644 sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersionConverter.java rename sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/{LinkingAgentIdentifierType.java => LinkingAgentIdentifier.java} (86%) create mode 100644 sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/SedaContextExtension.java create mode 100644 sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersionConverterTest.java diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/app/ResipApp.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/app/ResipApp.java index eff4c93d..abd59d93 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/app/ResipApp.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/app/ResipApp.java @@ -30,6 +30,8 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.ObjectMapper; import fr.gouv.vitam.tools.resip.data.Work; +import fr.gouv.vitam.tools.resip.event.EventBus; +import fr.gouv.vitam.tools.resip.event.SedaVersionChangedEvent; import fr.gouv.vitam.tools.resip.parameters.CSVImportContext; import fr.gouv.vitam.tools.resip.parameters.CSVMetadataImportContext; import fr.gouv.vitam.tools.resip.parameters.CreationContext; @@ -40,13 +42,13 @@ import fr.gouv.vitam.tools.resip.utils.ResipException; import fr.gouv.vitam.tools.resip.utils.ResipLogger; import fr.gouv.vitam.tools.sedalib.core.ArchiveTransfer; -import fr.gouv.vitam.tools.sedalib.core.SEDA2Version; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.droid.DroidIdentifier; import fr.gouv.vitam.tools.sedalib.inout.exporter.ArchiveTransferToSIPExporter; import fr.gouv.vitam.tools.sedalib.inout.importer.CSVMetadataToDataObjectPackageImporter; import fr.gouv.vitam.tools.sedalib.inout.importer.DiskToArchiveTransferImporter; import fr.gouv.vitam.tools.sedalib.inout.importer.SIPToArchiveTransferImporter; -import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -65,7 +67,9 @@ import java.time.Duration; import java.time.Instant; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * ResipApp class for launching the command or the graphic application. @@ -236,6 +240,8 @@ public static void main(String[] args) throws System.out.println("Resip launched"); + EventBus.subscribe(SedaVersionChangedEvent.class, event -> SedaContext.setVersion(event.getNewVersion())); + String workdirString; int logLevel; CreationContext creationContext; @@ -335,24 +341,22 @@ public static void main(String[] args) throws } // define the SEDA 2 version - if (cmd.hasOption("sedaversion")){ - try { - int tmp = Integer.parseInt(cmd.getOptionValue("sedaversion")); - switch (tmp){ - case 1: - case 2: - SEDA2Version.setSeda2Version(tmp); - break; - default: - throw new NumberFormatException("Doit valoir 1 ou 2"); - } - } catch (NumberFormatException e) { - System.err.println( - "Resip: La sous-version du SEDA 2 est non conforme, elle doit être dans la liste (1|2)"); + if (cmd.hasOption("sedaversion")) { + final Map supportedSedaVersions = new HashMap<>(); + supportedSedaVersions.put("2.1", SedaVersion.V2_1); + supportedSedaVersions.put("2.2", SedaVersion.V2_2); + supportedSedaVersions.put("2.3", SedaVersion.V2_3); + + String sedaVersion = cmd.getOptionValue("sedaversion"); + boolean isNotSupportedVersion = !supportedSedaVersions.containsKey(sedaVersion); + + if (isNotSupportedVersion) { + System.err.println("Doit valoir " + String.join(",", supportedSedaVersions.keySet())); System.exit(1); - } catch (SEDALibException ignored) { - // no real case } + + final SedaVersion version = supportedSedaVersions.get(sedaVersion); + EventBus.publish(new SedaVersionChangedEvent(version)); } // define the global logger @@ -447,7 +451,7 @@ else if (cmd.hasOption("listimport")) { cmi.doImport(); packet = new ArchiveTransfer(); - Work work = new Work(cmi.getDataObjectPackage(), cSVMetadataImportContext, exportContext, SEDA2Version.getSeda2Version()); + Work work = new Work(cmi.getDataObjectPackage(), cSVMetadataImportContext, exportContext); work.getDataObjectPackage() .setManagementMetadataXmlData(work.getExportContext().getManagementMetadataXmlData()); packet.setDataObjectPackage(work.getDataObjectPackage()); diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/app/ResipGraphicApp.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/app/ResipGraphicApp.java index 5ee33509..02e83d0c 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/app/ResipGraphicApp.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/app/ResipGraphicApp.java @@ -29,6 +29,8 @@ import fr.gouv.vitam.tools.mailextractlib.core.StoreExtractor; import fr.gouv.vitam.tools.resip.data.Work; +import fr.gouv.vitam.tools.resip.event.EventBus; +import fr.gouv.vitam.tools.resip.event.SedaVersionChangedEvent; import fr.gouv.vitam.tools.resip.frame.*; import fr.gouv.vitam.tools.resip.frame.preferences.PreferencesDialog; import fr.gouv.vitam.tools.resip.parameters.*; @@ -43,7 +45,8 @@ import fr.gouv.vitam.tools.resip.threads.ImportThread; import fr.gouv.vitam.tools.resip.utils.ResipException; import fr.gouv.vitam.tools.resip.utils.ResipLogger; -import fr.gouv.vitam.tools.sedalib.core.SEDA2Version; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.droid.DroidIdentifier; import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; @@ -159,6 +162,8 @@ public class ResipGraphicApp implements ActionListener, Runnable { */ public DuplicatesWindow duplicatesWindow; + private SedaVersion sedaVersion; + /** * Instantiates a new Resip graphic app. * @@ -166,6 +171,11 @@ public class ResipGraphicApp implements ActionListener, Runnable { * @throws ResipException the resip exception */ public ResipGraphicApp(CreationContext creationContext) throws ResipException { + EventBus.subscribe( + SedaVersionChangedEvent.class, + event -> this.sedaVersion = event.getNewVersion() + ); + try { if (System.getProperty("os.name").toLowerCase().contains("win")) UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); @@ -195,13 +205,6 @@ public ResipGraphicApp(CreationContext creationContext) throws ResipException { this.interfaceParameters = new InterfaceParameters(Preferences.getInstance()); this.treatmentParameters = new TreatmentParameters(Preferences.getInstance()); - try { - SEDA2Version.setSeda2Version(treatmentParameters.getSeda2Version()); - } catch (SEDALibException e) { - getGlobalLogger().getLogger().error(e.getLocalizedMessage()); - System.exit(-1); - } - getGlobalLogger().setDebugFlag(interfaceParameters.isDebugFlag()); getGlobalLogger().logIfDebug("Resip prefs accessed from " + Preferences.getInstance().getPrefPropertiesFilename(), null); @@ -377,13 +380,13 @@ public JMenuBar createMenu() { actionByMenuItem.put(menuItem, "SeeManifest"); treatMenu.add(menuItem); - sedaValidationMenuItem = new JMenuItem("Vérifier la conformité " + SEDA2Version.getSeda2VersionString() + "..."); + sedaValidationMenuItem = new JMenuItem("Vérifier la conformité " + sedaVersion.displayString() + "..."); sedaValidationMenuItem.addActionListener(this); sedaValidationMenuItem.setAccelerator(KeyStroke.getKeyStroke('R', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx())); actionByMenuItem.put(sedaValidationMenuItem, "CheckSEDASchema"); treatMenu.add(sedaValidationMenuItem); - sedaProfileValidationMenuItem = new JMenuItem("Vérifier la conformité à un profil " + SEDA2Version.getSeda2VersionString() + "..."); + sedaProfileValidationMenuItem = new JMenuItem("Vérifier la conformité à un profil " + sedaVersion.displayString() + "..."); sedaProfileValidationMenuItem.addActionListener(this); sedaProfileValidationMenuItem.setAccelerator(KeyStroke.getKeyStroke('R', InputEvent.SHIFT_DOWN_MASK + Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx())); actionByMenuItem.put(sedaProfileValidationMenuItem, "CheckSpecificSEDASchemaProfile"); @@ -726,18 +729,18 @@ private void loadWork() { if (fileChooser.showOpenDialog(mainWindow) == JFileChooser.APPROVE_OPTION) { filename = fileChooser.getSelectedFile().getCanonicalPath(); - int loadSeda2Version = Work.getSeda2VersionFromFile(filename); - if (loadSeda2Version != SEDA2Version.getSeda2Version()) { + final SedaVersion sedaVersionFromWorkspace = Work.getSeda2VersionFromFile(filename); + + if (sedaVersionFromWorkspace != sedaVersion) { if (UserInteractionDialog.getUserAnswer(mainWindow, "Pour charger ce fichier il faut faire passer l'interface en " + - SEDA2Version.getSeda2VersionString(loadSeda2Version) + "\n" + + sedaVersion + "\n" + "Voulez-vous continuer?", "Confirmation", UserInteractionDialog.WARNING_DIALOG, null) != OK_DIALOG) return; - treatmentParameters.setSeda2Version(loadSeda2Version); + EventBus.publish(new SedaVersionChangedEvent(sedaVersionFromWorkspace)); treatmentParameters.toPrefs(Preferences.getInstance()); - useSeda2Version(treatmentParameters.getSeda2Version()); } mainWindow.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); currentWork = Work.createFromFile(filename); @@ -839,14 +842,6 @@ private void closeWork() { } } - private void useSeda2Version(int version) throws SEDALibException { - SEDA2Version.setSeda2Version(version); - if (currentWork != null) - currentWork.setSeda2Version(version); - sedaValidationMenuItem.setText("Vérifier la conformité " + SEDA2Version.getSeda2VersionString() + "..."); - sedaProfileValidationMenuItem.setText("Vérifier la conformité à un profil " + SEDA2Version.getSeda2VersionString() + "..."); - } - // MenuItem Edit Preferences /** @@ -866,8 +861,6 @@ void editPrefs() { preferencesDialog.tp.toPrefs(Preferences.getInstance()); preferencesDialog.ip.toPrefs(Preferences.getInstance()); Preferences.getInstance().save(); - treatmentParameters = preferencesDialog.tp; - useSeda2Version(treatmentParameters.getSeda2Version()); interfaceParameters = preferencesDialog.ip; debugMenuItem.setState(interfaceParameters.isDebugFlag()); experimentalMenuItem.setState(interfaceParameters.isExperimentalFlag()); @@ -876,7 +869,7 @@ void editPrefs() { ResipLogger.createGlobalLogger(preferencesDialog.cc.getWorkDir() + File.separator + "log.txt", getGlobalLogger().getProgressLogLevel()); } - } catch (ResipException | SEDALibException e) { + } catch (ResipException e) { UserInteractionDialog.getUserAnswer(mainWindow, "Erreur fatale, impossible d'éditer les préférences \n->" + e.getMessage(), "Erreur", UserInteractionDialog.ERROR_DIALOG, @@ -997,7 +990,7 @@ void seeManifest() { * Check seda schema. */ void checkSEDASchema() { - InOutDialog inOutDialog = new InOutDialog(mainWindow, "Vérification " + SEDA2Version.getSeda2VersionString()); + InOutDialog inOutDialog = new InOutDialog(mainWindow, "Vérification " + sedaVersion.displayString()); CheckProfileThread checkProfileThread = new CheckProfileThread(null, inOutDialog); completeResipWork(); checkProfileThread.execute(); @@ -1014,7 +1007,7 @@ void checkSpecificSEDASchemaProfile() { JFileChooser fileChooser = new JFileChooser(Preferences.getInstance().getPrefsImportDir()); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); if (fileChooser.showOpenDialog(mainWindow) == JFileChooser.APPROVE_OPTION) { - InOutDialog inOutDialog = new InOutDialog(mainWindow, "Vérification Profil " + SEDA2Version.getSeda2VersionString()); + InOutDialog inOutDialog = new InOutDialog(mainWindow, "Vérification Profil " + sedaVersion.displayString()); CheckProfileThread checkProfileThread = new CheckProfileThread(fileChooser.getSelectedFile() .getAbsolutePath(), inOutDialog); completeResipWork(); @@ -1023,12 +1016,12 @@ void checkSpecificSEDASchemaProfile() { } } catch (Exception e) { UserInteractionDialog.getUserAnswer(mainWindow, - "Erreur fatale, impossible de faire la vérification de confirmité au profil " + SEDA2Version.getSeda2VersionString() + "\n->" + "Erreur fatale, impossible de faire la vérification de confirmité au profil " + sedaVersion.displayString() + "\n->" + e.getMessage(), "Erreur", UserInteractionDialog.ERROR_DIALOG, null); getGlobalLogger().log(ResipLogger.ERROR, "resip.graphicapp: erreur fatale, impossible de faire la " + - "vérification de confirmité au profil " + SEDA2Version.getSeda2VersionString(), e); + "vérification de confirmité au profil " + sedaVersion.displayString(), e); } } diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/data/Work.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/data/Work.java index 5602537a..7f01dfbd 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/data/Work.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/data/Work.java @@ -30,6 +30,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; +import fr.gouv.vitam.tools.resip.event.EventBus; +import fr.gouv.vitam.tools.resip.event.SedaVersionChangedEvent; import fr.gouv.vitam.tools.resip.parameters.CreationContext; import fr.gouv.vitam.tools.resip.parameters.ExportContext; import fr.gouv.vitam.tools.resip.utils.ResipException; @@ -37,6 +39,7 @@ import fr.gouv.vitam.tools.sedalib.core.*; import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageDeserializer; import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageSerializer; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger; @@ -92,15 +95,15 @@ public class Work { private DataObjectPackage dataObjectPackage; /** - * The SEDA 2 version. + * SEDA version */ - private int seda2Version; + private SedaVersion version; /** * Instantiates a new work for json serialization. */ public Work() { - this(null, null, null,1); + this(null, null, null); } /** @@ -109,14 +112,17 @@ public Work() { * @param dataObjectPackage the archive transfer * @param creationContext the creation context * @param exportContext the export context - * @param seda2Version the seda 2 version */ - public Work(DataObjectPackage dataObjectPackage, CreationContext creationContext, ExportContext exportContext, int seda2Version) { + public Work(DataObjectPackage dataObjectPackage, CreationContext creationContext, ExportContext exportContext) { this.serializationVersion = CURRENT_SERIALIZATION_VERSION; - this.seda2Version = seda2Version; this.dataObjectPackage = dataObjectPackage; this.creationContext = creationContext; this.exportContext = exportContext; + + EventBus.subscribe( + SedaVersionChangedEvent.class, + event -> this.version = event.getNewVersion() + ); } /** @@ -149,7 +155,7 @@ public String doVitamNormalize(SEDALibProgressLogger spl) * @return the SEDA 2 version * @throws ResipException the resip exception */ - public static int getSeda2VersionFromFile(String file) throws ResipException { + public static SedaVersion getSeda2VersionFromFile(String file) throws ResipException { Work ow; try (ZipInputStream zis = new ZipInputStream(new FileInputStream(file))) { ObjectMapper mapper = new ObjectMapper(); @@ -167,7 +173,7 @@ public static int getSeda2VersionFromFile(String file) throws ResipException { throw new ResipException("Resip: La lecture du fichier [" + file + "] ne permet pas de retrouver une session Resip", e); } - return ow.seda2Version; + return ow.version; } /** @@ -295,22 +301,4 @@ public ExportContext getExportContext() { public void setExportContext(ExportContext exportContext) { this.exportContext = exportContext; } - - /** - * Gets the SEDA 2 version used. - * - * @return the seda 2 version - */ - public int getSeda2Version() { - return seda2Version; - } - - /** - * Sets the SEDA 2 version used. - * - * @param seda2Version the seda 2 version - */ - public void setSeda2Version(int seda2Version) { - this.seda2Version = seda2Version; - } } diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/event/Event.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/event/Event.java new file mode 100644 index 00000000..4324c115 --- /dev/null +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/event/Event.java @@ -0,0 +1,4 @@ +package fr.gouv.vitam.tools.resip.event; + +public interface Event { +} diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/event/EventBus.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/event/EventBus.java new file mode 100644 index 00000000..63fde28b --- /dev/null +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/event/EventBus.java @@ -0,0 +1,31 @@ +package fr.gouv.vitam.tools.resip.event; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +public class EventBus { + + private static final Map, List>> listenersMap = new ConcurrentHashMap<>(); + + public static void subscribe(Class eventType, EventListener listener) { + listenersMap + .computeIfAbsent(eventType, k -> new CopyOnWriteArrayList<>()) + .add(listener); + } + + @SuppressWarnings("unchecked") + public static void publish(T event) { + List> listeners = listenersMap.getOrDefault(event.getClass(), Collections.emptyList()); + for (EventListener listener : listeners) { + ((EventListener) listener).onEvent(event); + } + } + + public static void unsubscribe(Class eventType, EventListener listener) { + List> listeners = listenersMap.get(eventType); + if (listeners != null) { + listeners.remove(listener); + } + } +} diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/event/EventListener.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/event/EventListener.java new file mode 100644 index 00000000..d7d68205 --- /dev/null +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/event/EventListener.java @@ -0,0 +1,6 @@ +package fr.gouv.vitam.tools.resip.event; + +@FunctionalInterface +public interface EventListener { + void onEvent(T event); +} diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/event/SedaVersionChangedEvent.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/event/SedaVersionChangedEvent.java new file mode 100644 index 00000000..d5686235 --- /dev/null +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/event/SedaVersionChangedEvent.java @@ -0,0 +1,15 @@ +package fr.gouv.vitam.tools.resip.event; + +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; + +public class SedaVersionChangedEvent implements Event { + private final SedaVersion newVersion; + + public SedaVersionChangedEvent(SedaVersion newVersion) { + this.newVersion = newVersion; + } + + public SedaVersion getNewVersion() { + return newVersion; + } +} diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/PreferencesDialog.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/PreferencesDialog.java index ea893140..1e8b54d1 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/PreferencesDialog.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/PreferencesDialog.java @@ -28,6 +28,8 @@ package fr.gouv.vitam.tools.resip.frame.preferences; import fr.gouv.vitam.tools.resip.app.ResipGraphicApp; +import fr.gouv.vitam.tools.resip.event.EventBus; +import fr.gouv.vitam.tools.resip.event.SedaVersionChangedEvent; import fr.gouv.vitam.tools.resip.frame.InOutDialog; import fr.gouv.vitam.tools.resip.frame.MainWindow; import fr.gouv.vitam.tools.resip.frame.NumericFilter; @@ -38,8 +40,7 @@ import fr.gouv.vitam.tools.resip.utils.ResipException; import fr.gouv.vitam.tools.resip.utils.ResipLogger; import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage; -import fr.gouv.vitam.tools.sedalib.core.SEDA2Version; -import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import javax.swing.*; import javax.swing.text.AbstractDocument; @@ -169,6 +170,8 @@ public class PreferencesDialog extends JDialog { "UTF-16BE", "UTF-16LE", "UTF-32", "UTF-32BE", "UTF-32LE", "x-UTF-32BE-BOM", "x-UTF-32LE-BOM", "windows-1250", "windows-1251", "windows-1253", "windows-1254", "windows-1257"}; + private SedaVersion currentVersion; + // Dialog test context /** @@ -197,7 +200,10 @@ public static void main(String[] args) throws ClassNotFoundException, Unsupporte */ public PreferencesDialog(JFrame owner) { super(owner, "Edition des paramètres par défaut", true); - GridBagConstraints gbc; + + EventBus.subscribe(SedaVersionChangedEvent.class, event -> { + this.currentVersion = event.getNewVersion(); + }); cc = new CreationContext(Preferences.getInstance()); coc = new CompactContext(Preferences.getInstance()); @@ -218,6 +224,8 @@ public PreferencesDialog(JFrame owner) { gridBagLayout.columnWeights = new double[]{1.0, 1.0}; contentPane.setLayout(new GridBagLayout()); + GridBagConstraints gbc; + tabbedPane = new JTabbedPane(TOP); gbc = new GridBagConstraints(); gbc.fill = GridBagConstraints.BOTH; @@ -1305,7 +1313,7 @@ public PreferencesDialog(JFrame owner) { gbc.gridy = 4; treatmentParametersPanel.add(sedaVersionLabel, gbc); - final SedaVersion selectedVersion = SedaVersion.from(2, tp.getSeda2Version()); + final SedaVersion selectedVersion = this.currentVersion; sedaVersionSelector = new SedaVersionSelector(selectedVersion); gbc = new GridBagConstraints(); @@ -1471,12 +1479,16 @@ private void buttonChooseWorkDir() { } } - private boolean tryToConvertCurrentWorkSedaVersion(int toSeda2Version) { + private boolean tryToConvertCurrentWorkSedaVersion(SedaVersion currentVersion, SedaVersion nextVersion) { DataObjectPackage currentPackage = ResipGraphicApp.getTheApp().currentWork.getDataObjectPackage(); - String versionLabel = "SEDA 2." + toSeda2Version; - InOutDialog inOutDialog = new InOutDialog(this.owner, "Conversion vers le schéma " + versionLabel); - ChangeSeda2VersionThread conversionThread = new ChangeSeda2VersionThread(toSeda2Version, currentPackage, inOutDialog); + InOutDialog inOutDialog = new InOutDialog(this.owner, "Conversion vers le schéma " + nextVersion); + ChangeSeda2VersionThread conversionThread = new ChangeSeda2VersionThread( + currentVersion, + nextVersion, + currentPackage, + inOutDialog + ); SedaConversionErrorHandler errorHandler = new SedaConversionErrorHandler(this.owner); SedaConversionWaiter waiter = new SedaConversionWaiter(); @@ -1486,12 +1498,12 @@ private boolean tryToConvertCurrentWorkSedaVersion(int toSeda2Version) { inOutDialog.setVisible(true); waiter.waitUntilFinished(conversionThread); } catch (Exception e) { - errorHandler.handleFatalError(versionLabel, e, conversionThread.getError()); + errorHandler.handleFatalError(nextVersion.toString(), e, conversionThread.getError()); return false; } if (conversionThread.getResult() == null) { - errorHandler.handleNullResult(versionLabel, conversionThread.getError()); + errorHandler.handleNullResult(nextVersion.toString(), conversionThread.getError()); return false; } @@ -1619,7 +1631,6 @@ else if (lastUsageButton.isSelected()) } tp.setDupMax(tmp); - SedaVersion currentVersion = SedaVersion.from(2, tp.getSeda2Version()); SedaVersion selectedVersion = sedaVersionSelector.getSelectedVersion(); if (!selectedVersion.equals(currentVersion) @@ -1644,17 +1655,11 @@ else if (lastUsageButton.isSelected()) if (userChoice != OK_DIALOG) return false; - if (!tryToConvertCurrentWorkSedaVersion(selectedVersion.getMinor())) + if (!tryToConvertCurrentWorkSedaVersion(currentVersion, selectedVersion)) return false; } - tp.setSeda2Version(selectedVersion.getMinor()); - - try { - SEDA2Version.setSeda2Version(tp.getSeda2Version()); - } catch (SEDALibException ignored) { - // no real case - } + EventBus.publish(new SedaVersionChangedEvent(selectedVersion)); ip.setStructuredMetadataEditionFlag(structuredInterfaceRadioButton.isSelected()); ip.setDebugFlag(debugModeCheckBox.isSelected()); diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/SedaVersionSelector.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/SedaVersionSelector.java index b613004e..624a42f9 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/SedaVersionSelector.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/SedaVersionSelector.java @@ -1,14 +1,22 @@ package fr.gouv.vitam.tools.resip.frame.preferences; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; + import javax.swing.*; import java.awt.*; +import java.util.Arrays; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class SedaVersionSelector extends JPanel { private final Map versionButtons = new LinkedHashMap<>(); private final ButtonGroup buttonGroup = new ButtonGroup(); + private final List versions = Arrays.stream(SedaVersion.values()) + .filter(version -> !version.equals(SedaVersion.V2_0)) + .collect(Collectors.toList()); public SedaVersionSelector(SedaVersion selectedVersion) { setLayout(new FlowLayout(FlowLayout.LEFT, 20, 0)); @@ -16,7 +24,7 @@ public SedaVersionSelector(SedaVersion selectedVersion) { } private void initializeButtons(SedaVersion selectedVersion) { - for (SedaVersion version : SedaVersion.values()) { + for (SedaVersion version : this.versions) { JRadioButton radioButton = new JRadioButton(version.toString()); versionButtons.put(version, radioButton); buttonGroup.add(radioButton); diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/parameters/TreatmentParameters.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/parameters/TreatmentParameters.java index af0a24fe..231c8ade 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/parameters/TreatmentParameters.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/parameters/TreatmentParameters.java @@ -27,7 +27,9 @@ */ package fr.gouv.vitam.tools.resip.parameters; -import fr.gouv.vitam.tools.sedalib.core.SEDA2Version; +import fr.gouv.vitam.tools.resip.event.EventBus; +import fr.gouv.vitam.tools.resip.event.SedaVersionChangedEvent; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import org.apache.commons.lang3.StringUtils; import java.util.Arrays; @@ -44,7 +46,7 @@ public class TreatmentParameters { /** * The format by category map. */ - LinkedHashMap> formatByCategoryMap; + LinkedHashMap> formatByCategoryMap = new LinkedHashMap<>(); /** * The maximum duplicates aggregation number. @@ -54,17 +56,19 @@ public class TreatmentParameters { /** * The SEDA2 subversion. */ - int seda2Version; + SedaVersion sedaVersion; /** * Instantiates a new creation context. */ public TreatmentParameters() { - formatByCategoryMap = new LinkedHashMap<>(); + EventBus.subscribe(SedaVersionChangedEvent.class, event -> { + this.sedaVersion = event.getNewVersion(); + }); } - private String canonizeCategoryName(String category){ + private String canonizeCategoryName(String category) { return StringUtils.stripAccents(category).replaceAll("[^A-Za-z0-9]",""); } @@ -74,8 +78,12 @@ private String canonizeCategoryName(String category){ * @param preferences the prefs */ public TreatmentParameters(Preferences preferences) { - String categoriesString = preferences.getPrefProperties().getProperty("treatmentParameters.categoriesList", null); - formatByCategoryMap = new LinkedHashMap<>(); + EventBus.subscribe(SedaVersionChangedEvent.class, event -> { + this.sedaVersion = event.getNewVersion(); + }); + + final String categoriesString = preferences.getPrefProperties().getProperty("treatmentParameters.categoriesList", null); + if (categoriesString != null) { List categoryList = Arrays.asList(categoriesString.split("\\|")); categoryList.replaceAll(String::trim); @@ -87,21 +95,18 @@ public TreatmentParameters(Preferences preferences) { formatByCategoryMap.put(category, formatList); } } + try { - dupMax=Integer.parseInt(preferences.getPrefProperties().getProperty("treatmentParameters.dupMax","1000")); - } - catch (NumberFormatException e){ - dupMax=1000; - } - try { - seda2Version=Integer.parseInt( - preferences.getPrefProperties().getProperty("treatmentParameters.seda2Version","1")); + dupMax = Integer.parseInt(preferences.getPrefProperties().getProperty("treatmentParameters.dupMax","1000")); + } catch (NumberFormatException e) { + dupMax = 1000; } - catch (NumberFormatException e){ - seda2Version=1; - } - if (!SEDA2Version.isSupportedSeda2Version(seda2Version)) - seda2Version=1; + + final String sedaVersion = preferences + .getPrefProperties() + .getProperty("treatmentParameters.seda2Version", SedaVersion.V2_1.toString()); + + EventBus.publish(new SedaVersionChangedEvent(SedaVersion.from(sedaVersion))); } /** @@ -115,7 +120,7 @@ public void toPrefs(Preferences preferences) { preferences.getPrefProperties().setProperty("treatmentParameters.categories."+canonizeCategoryName(e.getKey()),String.join("|",e.getValue())); } preferences.getPrefProperties().setProperty("treatmentParameters.dupMax", Integer.toString(dupMax)); - preferences.getPrefProperties().setProperty("treatmentParameters.seda2Version", Integer.toString(seda2Version)); + preferences.getPrefProperties().setProperty("treatmentParameters.seda2Version", sedaVersion.toString()); } /** @@ -159,13 +164,13 @@ public void setDefaultPrefs() { "fmt/50", "fmt/51", "fmt/52", "fmt/53", "fmt/136", "fmt/258", "fmt/290", "fmt/291", "fmt/412", "fmt/609", "fmt/754", "x-fmt/42", "x-fmt/43", "x-fmt/44", "x-fmt/64", "x-fmt/65", "x-fmt/273", "x-fmt/274", "x-fmt/275", "x-fmt/276", "x-fmt/393", "x-fmt/394")); - formatByCategoryMap.put("Texte brut",Arrays.asList("x-fmt/111")); + formatByCategoryMap.put("Texte brut", List.of("x-fmt/111")); formatByCategoryMap.put("Video (avi,mov,mpeg,mp4...)",Arrays.asList("fmt/5", "fmt/199", "fmt/569", "fmt/640", "fmt/649", "fmt/797", "x-fmt/384", "x-fmt/385", "x-fmt/386")); - formatByCategoryMap.put("Non connu",Arrays.asList("UNKNOWN")); - formatByCategoryMap.put("Autres...",Arrays.asList("Other")); - dupMax=1000; - seda2Version=1; + formatByCategoryMap.put("Non connu", List.of("UNKNOWN")); + formatByCategoryMap.put("Autres...", List.of("Other")); + dupMax = 1000; + sedaVersion = SedaVersion.V2_1; } // Getters and setters @@ -211,18 +216,16 @@ public void setDupMax(int dupMax) { * * @return the seda2 version */ - public int getSeda2Version() { - return seda2Version; + public SedaVersion getSedaVersion() { + return sedaVersion; } /** * Sets seda2 version. * - * @param sedaVersion the seda2 version + * @param version the seda2 version */ - public void setSeda2Version(int sedaVersion) { - this.seda2Version = sedaVersion; + public void setSedaVersion(SedaVersion version) { + this.sedaVersion = version; } - - } \ No newline at end of file diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/sedaobjecteditor/components/highlevelcomponents/XMLArchiveUnitEditorPanel.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/sedaobjecteditor/components/highlevelcomponents/XMLArchiveUnitEditorPanel.java index b5ef9cda..4ba6d820 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/sedaobjecteditor/components/highlevelcomponents/XMLArchiveUnitEditorPanel.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/sedaobjecteditor/components/highlevelcomponents/XMLArchiveUnitEditorPanel.java @@ -58,11 +58,6 @@ import static fr.gouv.vitam.tools.resip.sedaobjecteditor.SEDAObjectEditorConstants.translateTag; public class XMLArchiveUnitEditorPanel extends JPanel implements ArchiveUnitEditorPanel { - /** - * The Add content editedObject array. - */ - static private String[] addContentMetadataArray = null; - /** * The editedObject. */ @@ -83,34 +78,33 @@ public class XMLArchiveUnitEditorPanel extends JPanel implements ArchiveUnitEdit * @return the string [ ] */ static public String[] getAddContentMetadataArray() { - if (addContentMetadataArray == null) { - try { - List tmp = new ArrayList(); - tmp.add("[A]ArchiveUnitProfile "); - Content c = new Content(); - List contentMetadataList = new ArrayList(); - contentMetadataList.add("[C]AnyOtherMetadata "); - for (String metadataName : c.getMetadataMap().keySet()) { - ComplexListMetadataKind complexListMetadataKind = c.getMetadataMap().get(metadataName); - contentMetadataList.add("[C]" + metadataName + (complexListMetadataKind.isMany() ? " *" : " ")); - } - contentMetadataList.sort(String::compareTo); - tmp.addAll(contentMetadataList); - Management m = new Management(); - List managementMetadataList = new ArrayList(); - managementMetadataList.add("[C]AnyOtherMetadata "); - for (String metadataName : m.getMetadataMap().keySet()) { - ComplexListMetadataKind complexListMetadataKind = m.getMetadataMap().get(metadataName); - managementMetadataList.add("[M]" + metadataName + (complexListMetadataKind.isMany() ? " *" : " ")); - } - managementMetadataList.sort(String::compareTo); - tmp.addAll(managementMetadataList); - addContentMetadataArray = tmp.toArray(new String[0]); - } catch (SEDALibException e) { - addContentMetadataArray = new String[0]; + List options = new ArrayList<>(); + + try { + options.add("[A]ArchiveUnitProfile "); + Content c = new Content(); + List contentMetadataList = new ArrayList(); + contentMetadataList.add("[C]AnyOtherMetadata "); + for (String metadataName : c.getMetadataMap().keySet()) { + ComplexListMetadataKind complexListMetadataKind = c.getMetadataMap().get(metadataName); + contentMetadataList.add("[C]" + metadataName + (complexListMetadataKind.isMany() ? " *" : " ")); + } + contentMetadataList.sort(String::compareTo); + options.addAll(contentMetadataList); + Management m = new Management(); + List managementMetadataList = new ArrayList(); + managementMetadataList.add("[C]AnyOtherMetadata "); + for (String metadataName : m.getMetadataMap().keySet()) { + ComplexListMetadataKind complexListMetadataKind = m.getMetadataMap().get(metadataName); + managementMetadataList.add("[M]" + metadataName + (complexListMetadataKind.isMany() ? " *" : " ")); } + managementMetadataList.sort(String::compareTo); + options.addAll(managementMetadataList); + } catch (SEDALibException e) { + ResipLogger.getGlobalLogger().log(ResipLogger.GLOBAL, "Errors occurs while computing add metadata options", e); } - return addContentMetadataArray; + + return options.toArray(new String[0]); } /** diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/AddThread.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/AddThread.java index e6a19f5a..4d8ba93f 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/AddThread.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/AddThread.java @@ -39,7 +39,6 @@ import fr.gouv.vitam.tools.resip.utils.ResipLogger; import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit; import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage; -import fr.gouv.vitam.tools.sedalib.core.SEDA2Version; import fr.gouv.vitam.tools.sedalib.inout.importer.DiskToDataObjectPackageImporter; import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger; @@ -107,7 +106,7 @@ public AddThread(Work work, DataObjectPackageTreeNode targetNode, List fil else this.work = new Work(null, new DiskImportContext(Preferences.getInstance()), - null, SEDA2Version.getSeda2Version()); + null); this.targetNode = targetNode; this.lp = new ArrayList<>(); diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/ChangeSeda2VersionThread.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/ChangeSeda2VersionThread.java index 4f3bb889..09404c19 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/ChangeSeda2VersionThread.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/ChangeSeda2VersionThread.java @@ -33,7 +33,8 @@ import fr.gouv.vitam.tools.resip.utils.ResipException; import fr.gouv.vitam.tools.resip.utils.ResipLogger; import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage; -import fr.gouv.vitam.tools.sedalib.core.SEDA2Version; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersionConverter; import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger; import javax.swing.*; @@ -46,9 +47,10 @@ */ public class ChangeSeda2VersionThread extends SwingWorker { //input - private int toSeda2Version; - private DataObjectPackage dop; - private InOutDialog inOutDialog; + private final SedaVersion currentVersion; + private final SedaVersion nextVersion; + private final DataObjectPackage dop; + private final InOutDialog inOutDialog; //run output private DataObjectPackage convertedDop; @@ -59,12 +61,19 @@ public class ChangeSeda2VersionThread extends SwingWorker { /** * Instantiates a new Check profile thread. * - * @param toSeda2Version the seda 2 version to change to - * @param dop the data object package - * @param dialog the dialog + * @param currentVersion current SEDA version + * @param nextVersion target SEDA version + * @param dop the data object package + * @param dialog the dialog */ - public ChangeSeda2VersionThread(int toSeda2Version, DataObjectPackage dop, InOutDialog dialog) { - this.toSeda2Version = toSeda2Version; + public ChangeSeda2VersionThread( + SedaVersion currentVersion, + SedaVersion nextVersion, + DataObjectPackage dop, + InOutDialog dialog + ) { + this.currentVersion = currentVersion; + this.nextVersion = nextVersion; this.dop = dop; this.inOutDialog = dialog; this.exitThrowable = null; @@ -95,7 +104,7 @@ public String doInBackground() { if (work == null) throw new ResipException("Pas de contenu à transformer"); - convertedDop = SEDA2Version.convertToSeda2Version(dop, toSeda2Version, spl); + convertedDop = new SedaVersionConverter(spl).convert(dop, currentVersion, nextVersion); } catch (Throwable e) { //NOSONAR exitThrowable = e; } diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/ImportThread.java b/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/ImportThread.java index 6abd65ee..e1e5217b 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/ImportThread.java +++ b/resip/src/main/java/fr/gouv/vitam/tools/resip/threads/ImportThread.java @@ -38,7 +38,6 @@ import fr.gouv.vitam.tools.resip.utils.ResipLogger; import fr.gouv.vitam.tools.sedalib.core.ArchiveDeliveryRequestReply; import fr.gouv.vitam.tools.sedalib.core.ArchiveTransfer; -import fr.gouv.vitam.tools.sedalib.core.SEDA2Version; import fr.gouv.vitam.tools.sedalib.inout.importer.*; import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger; @@ -75,7 +74,7 @@ public class ImportThread extends SwingWorker { * @param dialog the dialog */ public ImportThread(CreationContext cc, InOutDialog dialog) { - this.work = new Work(null, cc, null, SEDA2Version.getSeda2Version()); + this.work = new Work(null, cc, null); this.inOutDialog = dialog; this.summary = null; this.exitThrowable = null; diff --git a/resip/src/test/java/fr/gouv/vitam/tools/resip/parameters/WorkTest.java b/resip/src/test/java/fr/gouv/vitam/tools/resip/parameters/WorkTest.java index 505442d5..3e236b9d 100644 --- a/resip/src/test/java/fr/gouv/vitam/tools/resip/parameters/WorkTest.java +++ b/resip/src/test/java/fr/gouv/vitam/tools/resip/parameters/WorkTest.java @@ -60,7 +60,7 @@ void TestResipWorkSerializationDeserialization() throws ResipException, FileNotF ignorePatternList.add("pagefile.sys"); ExportContext gmc=new ExportContext("src/test/resources/PacketSamples/ExportContext.config"); CreationContext oic=new DiskImportContext(ignorePatternList,false, "src/test/resources/PacketSamples/SampleWithoutLinksModelV2", destLog); - Work ow=new Work(null,oic,gmc,1); + Work ow = new Work(null, oic, gmc); DiskToArchiveTransferImporter di = new DiskToArchiveTransferImporter(ow.getCreationContext().getOnDiskInput(), spl); diff --git a/sedalib/pom.xml b/sedalib/pom.xml index 58a68e88..0100b44b 100644 --- a/sedalib/pom.xml +++ b/sedalib/pom.xml @@ -154,6 +154,12 @@ ${logback.version} test + + ch.qos.logback + logback-classic + 1.5.19 + test + @@ -168,6 +174,12 @@ ${assertj-core.version} test + + org.mockito + mockito-core + 5.20.0 + test + com.tngtech.archunit archunit diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/ArchiveTransfer.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/ArchiveTransfer.java index 7db2b4d2..1cd42839 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/ArchiveTransfer.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/ArchiveTransfer.java @@ -28,6 +28,8 @@ package fr.gouv.vitam.tools.sedalib.core; import com.fasterxml.jackson.annotation.JsonIgnore; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger; import fr.gouv.vitam.tools.sedalib.xml.IndentXMLTool; @@ -40,6 +42,7 @@ import javax.xml.validation.Schema; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.nio.charset.StandardCharsets; import static fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger.doProgressLog; @@ -105,27 +108,29 @@ private void exportStartDocument(SEDAXMLStreamWriter xmlWriter) throws SEDALibEx xmlWriter.writeStartElement("ArchiveTransfer"); xmlWriter.writeNamespace("xlink", "http://www.w3.org/1999/xlink"); xmlWriter.writeNamespace("pr", "info:lc/xmlns/premis-v2"); - switch(SEDA2Version.getSeda2Version()){ - case 1: + + final SedaVersion version = SedaContext.getVersion(); + switch (version) { + case V2_1: xmlWriter.writeDefaultNamespace("fr:gouv:culture:archivesdefrance:seda:v2.1"); xmlWriter.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); xmlWriter.writeAttribute("xsi", "http://www.w3.org/2001/XMLSchema-instance", "schemaLocation", "fr:gouv:culture:archivesdefrance:seda:v2.1 seda-2.1-main.xsd"); break; - case 2: + case V2_2: xmlWriter.writeDefaultNamespace("fr:gouv:culture:archivesdefrance:seda:v2.2"); xmlWriter.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); xmlWriter.writeAttribute("xsi", "http://www.w3.org/2001/XMLSchema-instance", "schemaLocation", "fr:gouv:culture:archivesdefrance:seda:v2.2 seda-2.2-main.xsd"); break; - case 3: + case V2_3: xmlWriter.writeDefaultNamespace("fr:gouv:culture:archivesdefrance:seda:v2.3"); xmlWriter.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); xmlWriter.writeAttribute("xsi", "http://www.w3.org/2001/XMLSchema-instance", "schemaLocation", "fr:gouv:culture:archivesdefrance:seda:v2.3 seda-2.3-main.xsd"); break; default: - throw new SEDALibException("Version de SEDA ["+ SEDA2Version.getSeda2VersionString() +"] sans schéma",null); + throw new SEDALibException("Version ["+ SedaContext.getVersion() +"] sans schéma", null); } xmlWriter.setXmlId(true); } catch (XMLStreamException e) { @@ -348,7 +353,7 @@ public void sedaSchemaValidate(SEDALibProgressLogger sedaLibProgressLogger) thro try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); SEDAXMLStreamWriter ixsw = new SEDAXMLStreamWriter(baos, IndentXMLTool.STANDARD_INDENT)) { toSedaXml(ixsw, true, sedaLibProgressLogger); - manifest = baos.toString("UTF-8"); + manifest = baos.toString(StandardCharsets.UTF_8); } catch (XMLStreamException | IOException e) { throw new SEDALibException("Echec d'écriture XML du manifest", e); } @@ -362,7 +367,7 @@ public void sedaProfileValidate(String profileFileName, SEDALibProgressLogger se try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); SEDAXMLStreamWriter ixsw = new SEDAXMLStreamWriter(baos, IndentXMLTool.STANDARD_INDENT)) { toSedaXml(ixsw, true, sedaLibProgressLogger); - manifest = baos.toString("UTF-8"); + manifest = baos.toString(StandardCharsets.UTF_8); } catch (XMLStreamException | IOException e) { throw new SEDALibException("Echec d'écriture XML du manifest", e); } diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/BinaryDataObject.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/BinaryDataObject.java index 34ea2f94..780153af 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/BinaryDataObject.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/BinaryDataObject.java @@ -28,6 +28,8 @@ package fr.gouv.vitam.tools.sedalib.core; import com.fasterxml.jackson.annotation.JsonIgnore; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.droid.DroidIdentifier; import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata; import fr.gouv.vitam.tools.sedalib.metadata.content.PersistentIdentifier; @@ -110,38 +112,23 @@ private static LinkedHashMap createMetadataMapF return map; } - @ComplexListMetadataMap(seda2Version = {1}) + @ComplexListMetadataMap(sedaVersion = { SedaVersion.V2_1 }) public static final Map METADATA_MAP_V1 = createMetadataMapForVersion(1); - @ComplexListMetadataMap(seda2Version = {2}) + @ComplexListMetadataMap(sedaVersion = { SedaVersion.V2_2 }) public static final Map METADATA_MAP_V2 = createMetadataMapForVersion(2); - @ComplexListMetadataMap(seda2Version = {3}) + @ComplexListMetadataMap(sedaVersion = { SedaVersion.V2_3 }) public static final Map METADATA_MAP_V3 = createMetadataMapForVersion(3); - @SuppressWarnings("unchecked") - private final static LinkedHashMap[] METADATA_MAPS = - new LinkedHashMap[SEDA2Version.MAX_SUPPORTED_VERSION + 1]; - - public final static Boolean[] NON_EXPANDABLE_FLAGS = new Boolean[SEDA2Version.MAX_SUPPORTED_VERSION + 1]; - - static { - for (int i = 0; i <= SEDA2Version.MAX_SUPPORTED_VERSION; i++) { - METADATA_MAPS[i] = createMetadataMapForVersion(i); - } - ComplexListInterface.initMetadataMaps(BinaryDataObject.class, METADATA_MAPS, NON_EXPANDABLE_FLAGS); - } - /** * {@inheritDoc} */ @JsonIgnore @Override public LinkedHashMap getMetadataMap() throws SEDALibException { - LinkedHashMap result = METADATA_MAPS[SEDA2Version.getSeda2Version()]; - if (result == null) - result = METADATA_MAPS[0]; - return result; + return (LinkedHashMap) ComplexListInterface + .getMetadataMap(this.getClass()); } /** @@ -149,11 +136,9 @@ public LinkedHashMap getMetadataMap() throws SE */ @JsonIgnore @Override - public boolean isNotExpandable() throws SEDALibException { - Boolean result = NON_EXPANDABLE_FLAGS[SEDA2Version.getSeda2Version()]; - if (result == null) - result = NON_EXPANDABLE_FLAGS[0]; - return result; + public boolean isNotExpandable() { + return ComplexListInterface + .isNotExpandable(this.getClass()); } // Inner element diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/DataObjectGroup.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/DataObjectGroup.java index e7b2a335..a81bf6ea 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/DataObjectGroup.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/DataObjectGroup.java @@ -28,6 +28,7 @@ package fr.gouv.vitam.tools.sedalib.core; import com.fasterxml.jackson.annotation.JsonIgnore; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext; import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata; import fr.gouv.vitam.tools.sedalib.metadata.management.LogBook; import fr.gouv.vitam.tools.sedalib.metadata.namedtype.StringType; @@ -267,7 +268,7 @@ public static String idFromSedaXml(SEDAXMLEventReader xmlReader, DataObjectPacka if ((bdoDataObjectGroupId != null) || (bdoDataObjectGroupReferenceId != null)) throw new SEDALibException("Le BinaryDataObject [" + bdo.inDataPackageObjectId + "] utilise un raccordement DataObjectGroup mode SEDA2.0 " - + "dans un DataObjectGroup mode SEDA2." + SEDA2Version.getSeda2Version()); + + "dans un DataObjectGroup mode " + SedaContext.getVersion()); StringType bdoUri = (StringType) bdo.getFirstNamedMetadata("Uri"); bdo.setOnDiskPathFromString(rootDir + File.separator + bdoUri.getValue()); dog.addDataObject(bdo); @@ -279,7 +280,7 @@ public static String idFromSedaXml(SEDAXMLEventReader xmlReader, DataObjectPacka if ((dataObjectGroupId != null) || (dataObjectGroupReferenceId != null)) throw new SEDALibException("Le PhysicalDataObject [" + pdo.inDataPackageObjectId + "] utilise un raccordement DataObjectGroup mode SEDA2.0 " - + "dans un DataObjectGroup mode SEDA2."+SEDA2Version.getSeda2Version()); + + "dans un DataObjectGroup mode " + SedaContext.getVersion()); dog.addDataObject(pdo); break; default: diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/PhysicalDataObject.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/PhysicalDataObject.java index 8f88851c..493c96cc 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/PhysicalDataObject.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/PhysicalDataObject.java @@ -28,6 +28,7 @@ package fr.gouv.vitam.tools.sedalib.core; import com.fasterxml.jackson.annotation.JsonIgnore; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.metadata.content.PersistentIdentifier; import fr.gouv.vitam.tools.sedalib.metadata.data.PhysicalDimensions; import fr.gouv.vitam.tools.sedalib.metadata.data.Relationship; @@ -49,7 +50,7 @@ public class PhysicalDataObject extends AbstractUnitaryDataObject implements Dat /** * Init metadata map. */ - @ComplexListMetadataMap(isExpandable = true, seda2Version = {1}) + @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_1 }) public static final Map METADATA_MAP_V1; static { @@ -65,7 +66,7 @@ public class PhysicalDataObject extends AbstractUnitaryDataObject implements Dat METADATA_MAP_V1.put("PhysicalDimensions", new ComplexListMetadataKind(PhysicalDimensions.class, false)); } - @ComplexListMetadataMap(isExpandable = true, seda2Version = {2}) + @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_2 }) public static final Map METADATA_MAP_V2; static { @@ -80,7 +81,7 @@ public class PhysicalDataObject extends AbstractUnitaryDataObject implements Dat METADATA_MAP_V2.put("PhysicalDimensions", new ComplexListMetadataKind(PhysicalDimensions.class, false)); } - @ComplexListMetadataMap(isExpandable = true, seda2Version = {3}) + @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_3 }) public static final Map METADATA_MAP_V3; static { @@ -98,23 +99,14 @@ public class PhysicalDataObject extends AbstractUnitaryDataObject implements Dat METADATA_MAP_V3.put("PhysicalDimensions", new ComplexListMetadataKind(PhysicalDimensions.class, false)); } - private final static LinkedHashMap[] METADATA_MAPS = new LinkedHashMap[SEDA2Version.MAX_SUPPORTED_VERSION + 1]; - private final static Boolean[] NON_EXPANDABLE_FLAGS = new Boolean[SEDA2Version.MAX_SUPPORTED_VERSION + 1]; - - static { - ComplexListInterface.initMetadataMaps(PhysicalDataObject.class, METADATA_MAPS, NON_EXPANDABLE_FLAGS); - } - /** * {@inheritDoc} */ @JsonIgnore @Override public LinkedHashMap getMetadataMap() throws SEDALibException { - LinkedHashMap result = METADATA_MAPS[SEDA2Version.getSeda2Version()]; - if (result == null) - result = METADATA_MAPS[0]; - return result; + return (LinkedHashMap) ComplexListInterface + .getMetadataMap(this.getClass()); } /** @@ -122,15 +114,11 @@ public LinkedHashMap getMetadataMap() throws SE */ @JsonIgnore @Override - public boolean isNotExpandable() throws SEDALibException { - Boolean result = NON_EXPANDABLE_FLAGS[SEDA2Version.getSeda2Version()]; - if (result == null) - result = NON_EXPANDABLE_FLAGS[0]; - return result; + public boolean isNotExpandable() { + return ComplexListInterface + .isNotExpandable(this.getClass()); } - // Constructors - /** * Instantiates a new PhysicalDataObject. */ diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/SEDA2Version.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/SEDA2Version.java deleted file mode 100644 index d7dd7f73..00000000 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/SEDA2Version.java +++ /dev/null @@ -1,160 +0,0 @@ -package fr.gouv.vitam.tools.sedalib.core; - -import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; -import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger; -import fr.gouv.vitam.tools.sedalib.xml.IndentXMLTool; -import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLEventReader; -import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLStreamWriter; - -import javax.xml.stream.XMLStreamException; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.Map; - -/** - * The Seda2 version management class, make it possible to use different Seda2 version if: - *
  • only the ontology and a the xsd declaration are different, not the messages structure
  • - *
  • the Seda2 version has not to be changed when previous version objects exist
- * The global Seda2 version is used in all SEDAMetadata class to adapt to ontology used. - *

Warning: there is a very special method ({@link #convertToSeda2Version(DataObjectPackage, int, SEDALibProgressLogger)}) - * implemented to convert a DataObjectPackage to another Seda2 version. - * This is mostly done to be used in interactive program like Resip.

- */ -public final class SEDA2Version { - /** - * For Seda2.1 SEDA2_1=1 - */ - public static final int SEDA2_1 = 1; - /** - * For Seda2.2 SEDA2_2=2 - */ - public static final int SEDA2_2 = 2; - /** - * For Seda2.2 SEDA2_2=2 - */ - public static final int SEDA2_3 = 3; - /** - * Max Seda2.x supported version MAX_SUPPORTED_VERSION=2 - */ - public static final int MAX_SUPPORTED_VERSION = 3; - - /** - * SEDA2 convention used for all lib processing - * Warning: usage for different SEDA2 versions is not possible in parallel process! - */ - private static int globalSeda2Version = SEDA2_1; - - /** - * Gets Seda2 version. - * - * @return the Seda2 version - */ - public static int getSeda2Version() { - return globalSeda2Version; - } - - /** - * Get seda 2 version string string for a given version. - * - * @param seda2Version the seda 2 version - * @return the string - */ - public static String getSeda2VersionString(int seda2Version){ - return "SEDA 2." + seda2Version; - } - - /** - * Gets Seda2 version string for global current version. - * - * @return the Seda2 version string - */ - public static String getSeda2VersionString() { - return getSeda2VersionString(globalSeda2Version); - } - - private SEDA2Version() { - throw new IllegalStateException("Utility class"); - } - - /** - * Is supported Seda2 version boolean. - * - * @param newSeda2Version the new seda 2 version - * @return the boolean - */ - public static boolean isSupportedSeda2Version(int newSeda2Version) { - switch (newSeda2Version) { - case SEDA2_1: - case SEDA2_2: - case SEDA2_3: - return true; - default: - return false; - } - } - - /** - * Sets Seda2 version. - * - * @param newSeda2Version the new Seda2 version - * @throws SEDALibException if this is not a supported version - */ - public static void setSeda2Version(int newSeda2Version) throws SEDALibException { - if (isSupportedSeda2Version(newSeda2Version)) { - globalSeda2Version = newSeda2Version; - } else - throw new SEDALibException("Unknown Seda 2." + newSeda2Version + " version"); - } - - /** - * Convert à DataObjectPackage to Seda2 version using XML as pivot format. - *

Warning: this very special function is mostly done to be used in interactive program like Resip.

- * - * @param dataObjectPackage the DataObjectPackage - * @param toSeda2Version the destination Seda2 version - * @param sedaLibProgressLogger the seda lib progress logger - * @return the converted DataObjectPackage - * @throws SEDALibException if not supported version or if conversion through XML is not possible - * @throws InterruptedException the interrupted exception - */ - public static DataObjectPackage convertToSeda2Version(DataObjectPackage dataObjectPackage, int toSeda2Version, SEDALibProgressLogger sedaLibProgressLogger) - throws SEDALibException, InterruptedException { - String xmlForm; - DataObjectPackage result; - int originSeda2Version = getSeda2Version(); - - if (!isSupportedSeda2Version(toSeda2Version)) - throw new SEDALibException("Unknown Seda2." + toSeda2Version + " version"); - - SEDALibProgressLogger.doProgressLog(sedaLibProgressLogger, SEDALibProgressLogger.GLOBAL, - "Passage de la version Seda2." + originSeda2Version + " à la version Seda2." + toSeda2Version, null); - SEDALibProgressLogger.doProgressLog(sedaLibProgressLogger, SEDALibProgressLogger.STEP, - "-> Ecriture XML en version Seda2." + originSeda2Version, null); - try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); - SEDAXMLStreamWriter oxsw = new SEDAXMLStreamWriter(baos, IndentXMLTool.STANDARD_INDENT)) { - dataObjectPackage.toSedaXml(oxsw, true, sedaLibProgressLogger); - xmlForm = baos.toString("UTF-8"); - } catch (XMLStreamException | IOException e) { - throw new SEDALibException("Echec d'écriture XML du DataObjectPackage dans la version seda2." + originSeda2Version, e); - } - - SEDALibProgressLogger.doProgressLog(sedaLibProgressLogger, SEDALibProgressLogger.STEP, - "-> Prise en compte à partir de l'XML généré, vers la version Seda2." + toSeda2Version, null); - setSeda2Version(toSeda2Version); - try (ByteArrayInputStream bais = new ByteArrayInputStream(xmlForm.getBytes(StandardCharsets.UTF_8)); - SEDAXMLEventReader ixer = new SEDAXMLEventReader(bais, true)) { - ixer.xmlReader.nextEvent(); // drop the StartDocument event - result = DataObjectPackage.fromSedaXml(ixer, "unknown", sedaLibProgressLogger); - } catch (XMLStreamException | IOException e) { - setSeda2Version(originSeda2Version); - throw new SEDALibException("Echec de conversion à travers XML du DataObjectPackage dans la version seda2." + toSeda2Version, e); - } - for (Map.Entry identifiedDataObject : dataObjectPackage.getBdoInDataObjectPackageIdMap().entrySet()) - result.getBdoInDataObjectPackageIdMap().get(identifiedDataObject.getKey()).setOnDiskPath(identifiedDataObject.getValue().getOnDiskPath()); - setSeda2Version(originSeda2Version); - - return result; - } -} diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaContext.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaContext.java new file mode 100644 index 00000000..e80aceeb --- /dev/null +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaContext.java @@ -0,0 +1,13 @@ +package fr.gouv.vitam.tools.sedalib.core.seda; + +public class SedaContext { + private static SedaVersion _version; + + public static SedaVersion getVersion() { + return _version; + } + + public static void setVersion(SedaVersion version) { + _version = version; + } +} diff --git a/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/SedaVersion.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersion.java similarity index 59% rename from resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/SedaVersion.java rename to sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersion.java index 1cd17668..b7cad80a 100644 --- a/resip/src/main/java/fr/gouv/vitam/tools/resip/frame/preferences/SedaVersion.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersion.java @@ -1,6 +1,7 @@ -package fr.gouv.vitam.tools.resip.frame.preferences; +package fr.gouv.vitam.tools.sedalib.core.seda; public enum SedaVersion { + V2_0(2, 0), V2_1(2, 1), V2_2(2, 2), V2_3(2, 3); @@ -23,6 +24,10 @@ public int getMinor() { @Override public String toString() { + return major + "." + minor; + } + + public String displayString() { return "SEDA " + major + "." + minor; } @@ -34,4 +39,17 @@ public static SedaVersion from(int major, int minor) { } throw new IllegalArgumentException("Unsupported SEDA version: " + major + "." + minor); } + + public static SedaVersion from(String version) { + String[] fragments = version.split("[.]"); + + if (fragments.length != 2) { + throw new IllegalArgumentException("Unsupported SEDA version: " + version); + } + + int major = Integer.parseInt(fragments[0]); + int minor = Integer.parseInt(fragments[1]); + + return from(major, minor); + } } diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersionConverter.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersionConverter.java new file mode 100644 index 00000000..b728bab6 --- /dev/null +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersionConverter.java @@ -0,0 +1,114 @@ +package fr.gouv.vitam.tools.sedalib.core.seda; + +import fr.gouv.vitam.tools.sedalib.core.BinaryDataObject; +import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage; +import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; +import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger; +import fr.gouv.vitam.tools.sedalib.xml.IndentXMLTool; +import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLEventReader; +import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLStreamWriter; + +import javax.xml.stream.XMLStreamException; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +public class SedaVersionConverter { + + private final SEDALibProgressLogger progressLogger; + + public SedaVersionConverter(SEDALibProgressLogger progressLogger) { + this.progressLogger = progressLogger; + } + + /** + * Converts a DataObjectPackage from one SEDA version to another by serializing and re-parsing the XML. + * + * @param originalPackage the original DataObjectPackage + * @param sourceSedaVersion the source SEDA version + * @param targetSedaVersion the target SEDA version + * @return a new DataObjectPackage in the target SEDA version + * @throws SEDALibException if conversion fails + * @throws InterruptedException if the operation is interrupted + */ + public DataObjectPackage convert( + DataObjectPackage originalPackage, + SedaVersion sourceSedaVersion, + SedaVersion targetSedaVersion + ) throws SEDALibException, InterruptedException { + if (sourceSedaVersion.equals(targetSedaVersion)) { + throw new SEDALibException("Source and target SEDA versions are identical: " + sourceSedaVersion); + } + if (!sourceSedaVersion.equals(SedaContext.getVersion())) { + throw new SEDALibException("Source and context SEDA versions are different: " + + "(source: " + sourceSedaVersion + ", context: " + SedaContext.getVersion()); + } + + logGlobal("Conversion from " + sourceSedaVersion + " to " + targetSedaVersion); + + String sedaXml = serializeToSedaXml(originalPackage, sourceSedaVersion); + SedaContext.setVersion(targetSedaVersion); + + try { + DataObjectPackage convertedPackage = deserializeFromSedaXml(sedaXml); + restoreBinaryObjectPaths(originalPackage, convertedPackage); + return convertedPackage; + } catch (Exception e) { + SedaContext.setVersion(sourceSedaVersion); + throw new SEDALibException("Failed to convert DataObjectPackage to " + targetSedaVersion, e); + } + } + + private String serializeToSedaXml(DataObjectPackage dataObjectPackage, SedaVersion sedaVersion) + throws SEDALibException, InterruptedException { + + logStep("-> Serializing DataObjectPackage to " + sedaVersion.displayString() + " XML"); + + try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); + SEDAXMLStreamWriter xmlWriter = new SEDAXMLStreamWriter(baos, IndentXMLTool.STANDARD_INDENT)) { + + dataObjectPackage.toSedaXml(xmlWriter, true, progressLogger); + return baos.toString(StandardCharsets.UTF_8); + + } catch (IOException | XMLStreamException e) { + throw new SEDALibException("Failed to serialize DataObjectPackage to " + sedaVersion.displayString() + " XML", e); + } + } + + private DataObjectPackage deserializeFromSedaXml(String xml) + throws SEDALibException, InterruptedException { + + logStep("-> Deserializing XML to DataObjectPackage"); + + try (ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)); + SEDAXMLEventReader xmlReader = new SEDAXMLEventReader(bais, true)) { + + xmlReader.xmlReader.nextEvent(); // skip StartDocument + return DataObjectPackage.fromSedaXml(xmlReader, "unknown", progressLogger); + + } catch (IOException | XMLStreamException e) { + throw new SEDALibException("Failed to deserialize XML to DataObjectPackage", e); + } + } + + private void restoreBinaryObjectPaths(DataObjectPackage source, DataObjectPackage target) { + for (Map.Entry entry : source.getBdoInDataObjectPackageIdMap().entrySet()) { + String id = entry.getKey(); + BinaryDataObject sourceBdo = entry.getValue(); + BinaryDataObject targetBdo = target.getBdoInDataObjectPackageIdMap().get(id); + if (targetBdo != null) { + targetBdo.setOnDiskPath(sourceBdo.getOnDiskPath()); + } + } + } + + private void logStep(String message) throws InterruptedException { + SEDALibProgressLogger.doProgressLog(progressLogger, SEDALibProgressLogger.STEP, message, null); + } + + private void logGlobal(String message) throws InterruptedException { + SEDALibProgressLogger.doProgressLog(progressLogger, SEDALibProgressLogger.GLOBAL, message, null); + } +} diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/compacted/FileObject.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/compacted/FileObject.java index baf6984f..3538f251 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/compacted/FileObject.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/compacted/FileObject.java @@ -28,6 +28,7 @@ package fr.gouv.vitam.tools.sedalib.metadata.compacted; import fr.gouv.vitam.tools.sedalib.core.BinaryDataObject; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata; import fr.gouv.vitam.tools.sedalib.metadata.content.PersistentIdentifier; import fr.gouv.vitam.tools.sedalib.metadata.data.FileInfo; @@ -73,7 +74,7 @@ public class FileObject extends ComplexListType { METADATA_MAP_V1.put("OtherMetadata", new ComplexListMetadataKind(AnyXMLListType.class, false)); } - @ComplexListMetadataMap(seda2Version = {2}) + @ComplexListMetadataMap(sedaVersion = { SedaVersion.V2_2 }) public static final Map METADATA_MAP_V2; static { @@ -92,7 +93,7 @@ public class FileObject extends ComplexListType { METADATA_MAP_V2.put("OtherMetadata", new ComplexListMetadataKind(AnyXMLListType.class, false)); } - @ComplexListMetadataMap(seda2Version = {3}) + @ComplexListMetadataMap(sedaVersion = { SedaVersion.V2_3 }) public static final Map METADATA_MAP_V3; static { diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/Content.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/Content.java index 289db140..58bf43d1 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/Content.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/Content.java @@ -27,6 +27,7 @@ */ package fr.gouv.vitam.tools.sedalib.metadata.content; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata; import fr.gouv.vitam.tools.sedalib.metadata.compacted.DocumentContainer; import fr.gouv.vitam.tools.sedalib.metadata.compacted.DocumentPack; @@ -56,7 +57,7 @@ public class Content extends ComplexListType { /** * Init metadata map. */ - @ComplexListMetadataMap(isExpandable = true, seda2Version = {1}) + @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_1 }) public static final Map metadataMap; static { @@ -116,7 +117,7 @@ public class Content extends ComplexListType { metadataMap.put("DocumentPack", new ComplexListMetadataKind(DocumentPack.class, false)); } - @ComplexListMetadataMap(isExpandable = true, seda2Version = {2}) + @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_2 }) public static final Map metadataMap_v2; static { @@ -178,7 +179,7 @@ public class Content extends ComplexListType { metadataMap_v2.put("DocumentPack", new ComplexListMetadataKind(DocumentPack.class, false)); } - @ComplexListMetadataMap(isExpandable = true, seda2Version = {3}) + @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_3 }) public static final Map metadataMap_v3; static { diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/Event.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/Event.java index 19361a66..01e410e5 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/Event.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/Event.java @@ -27,6 +27,7 @@ */ package fr.gouv.vitam.tools.sedalib.metadata.content; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.metadata.namedtype.*; import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; @@ -50,7 +51,7 @@ public class Event extends ComplexListType { /** * Init metadata map. */ - @ComplexListMetadataMap(isExpandable = true, seda2Version = {1}) + @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_1 }) public static final Map metadataMap_default; static { @@ -69,7 +70,7 @@ public class Event extends ComplexListType { new ComplexListMetadataKind(StringType.class, false)); } - @ComplexListMetadataMap(isExpandable = true, seda2Version = {2,3}) + @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_2, SedaVersion.V2_3 }) public static final Map metadataMap_v2; static { @@ -87,7 +88,7 @@ public class Event extends ComplexListType { metadataMap_v2.put("EventDetailData", new ComplexListMetadataKind(StringType.class, false)); metadataMap_v2.put("LinkingAgentIdentifier", - new ComplexListMetadataKind(LinkingAgentIdentifierType.class, true)); + new ComplexListMetadataKind(LinkingAgentIdentifier.class, true)); } /** diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/PersistentIdentifier.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/PersistentIdentifier.java index 08241f09..abd1b712 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/PersistentIdentifier.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/PersistentIdentifier.java @@ -27,6 +27,7 @@ */ package fr.gouv.vitam.tools.sedalib.metadata.content; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.metadata.namedtype.ComplexListMetadataKind; import fr.gouv.vitam.tools.sedalib.metadata.namedtype.ComplexListMetadataMap; import fr.gouv.vitam.tools.sedalib.metadata.namedtype.ComplexListType; @@ -52,7 +53,7 @@ public class PersistentIdentifier extends ComplexListType { /** * Init metadata map. */ - @ComplexListMetadataMap (seda2Version = 3) + @ComplexListMetadataMap (sedaVersion = { SedaVersion.V2_3 }) public static final Map metadataMap; static { diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/SigningInformation.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/SigningInformation.java index 662c686b..1b271837 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/SigningInformation.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/content/SigningInformation.java @@ -27,6 +27,7 @@ */ package fr.gouv.vitam.tools.sedalib.metadata.content; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.metadata.namedtype.*; import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; @@ -48,7 +49,7 @@ public class SigningInformation extends ComplexListType { /** * Init metadata map. */ - @ComplexListMetadataMap(seda2Version = {3}) + @ComplexListMetadataMap(sedaVersion = { SedaVersion.V2_3 }) public static final Map metadataMap; static { diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListInterface.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListInterface.java index 84909207..1ccc430d 100644 --- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListInterface.java +++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListInterface.java @@ -27,7 +27,8 @@ */ package fr.gouv.vitam.tools.sedalib.metadata.namedtype; -import fr.gouv.vitam.tools.sedalib.core.SEDA2Version; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext; +import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion; import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata; import fr.gouv.vitam.tools.sedalib.metadata.content.Gps; import fr.gouv.vitam.tools.sedalib.utils.SEDALibException; @@ -63,7 +64,7 @@ * Example of a metadata map definition: *
  * {@code
- * @ComplexListMetadataMap(isExpandable = true, seda2Version = {3})
+ * @ComplexListMetadataMap(isExpandable = true, sedaVersion = { SedaVersion.V2_3 })
  * public static final Map metadataMap_v3;
  *
  * static {
@@ -96,6 +97,20 @@ static private List getFieldsWithAnnotationComplexListMetadataMap(Class getSedaVersions(ComplexListMetadataMap annotation) {
+        SedaVersion[] explicit = annotation.sedaVersion();
+        return explicit.length == 0
+            ? Arrays.asList(SedaVersion.values())
+            : Arrays.asList(explicit);
+    }
+
     /**
      * Initializes the metadata map array by populating it with metadata maps
      * defined with the {@link ComplexListMetadataMap} annotation in the specified class.
@@ -109,7 +124,7 @@ static private List getFieldsWithAnnotationComplexListMetadataMap(Class metadataMap_v3;
      *   ...
      * }
@@ -119,10 +134,11 @@ static private List getFieldsWithAnnotationComplexListMetadataMap(Class targetClass,
-            LinkedHashMap[] metadataMaps,
-            Boolean[] nonExpandableFlags) {
+            Map> versionedMetadataDefinitions,
+            Map versionedNotExpandableFlags
+    ) {
         try {
             List annotatedFields = getFieldsWithAnnotationComplexListMetadataMap(targetClass);
             for (Field field : annotatedFields) {
@@ -133,9 +149,9 @@ public static void initMetadataMaps(
                         (LinkedHashMap) field.get(null);
 
                 boolean isExpandable = ann.isExpandable();
-                for (int version : ann.seda2Version()) {
-                    metadataMaps[version] = map;
-                    nonExpandableFlags[version] = !isExpandable;
+                for (SedaVersion version : getSedaVersions(ann)) {
+                    versionedMetadataDefinitions.put(version, map);
+                    versionedNotExpandableFlags.put(version, !isExpandable);
                 }
             }
         } catch (ReflectiveOperationException | ClassCastException e) {
@@ -144,34 +160,122 @@ public static void initMetadataMaps(
         }
     }
 
+    static Map> metadataDefinitions(Class clazz) {
+        Map> versionedMetadataDefinitions = new LinkedHashMap<>();
+
+        try {
+            List annotatedFields = getFieldsWithAnnotationComplexListMetadataMap(clazz);
+            for (Field field : annotatedFields) {
+                ComplexListMetadataMap ann = field.getAnnotation(ComplexListMetadataMap.class);
+
+                @SuppressWarnings("unchecked")
+                LinkedHashMap map =
+                    (LinkedHashMap) field.get(null);
+
+                for (SedaVersion version : getSedaVersions(ann)) {
+                    versionedMetadataDefinitions.put(version, map);
+                }
+            }
+        } catch (ReflectiveOperationException | ClassCastException e) {
+            throw new RuntimeException(
+                "Erreur d'initialisation des metadata pour la classe " + clazz.getName(), e);
+        }
+
+        return versionedMetadataDefinitions;
+    }
+
+    static Map notExpandableFlags(Class clazz) {
+        Map versionedNotExpandableFlags = new LinkedHashMap<>();
+
+        try {
+            List annotatedFields = getFieldsWithAnnotationComplexListMetadataMap(clazz);
+            for (Field field : annotatedFields) {
+                ComplexListMetadataMap ann = field.getAnnotation(ComplexListMetadataMap.class);
+
+                for (SedaVersion version : getSedaVersions(ann)) {
+                    versionedNotExpandableFlags.put(version, !ann.isExpandable());
+                }
+            }
+        } catch (ClassCastException e) {
+            throw new RuntimeException(
+                "Erreur d'initialisation des metadata pour la classe " + clazz.getName(), e);
+        }
+
+        return versionedNotExpandableFlags;
+    }
+
+    /**
+     * Gets the metadata map, which link xml element name with metadata class and
+     * cardinality for a given ComplexListType subclass.
+     *
+     * @param complexListTypeMetadataClass the complex list type metadata class
+     * @return the metadata map
+     * @throws SEDALibException if the @ComplexListMetadataMap annotated static variable doesn't exist or is badly formed
+     */
+    static Map getMetadataMap(Class complexListTypeMetadataClass) throws SEDALibException {
+        final Map> metadataDefinitions = ComplexListInterface
+            .metadataDefinitions(complexListTypeMetadataClass);
+
+        if (metadataDefinitions.containsKey(SedaContext.getVersion())) {
+            return metadataDefinitions.get(SedaContext.getVersion());
+        }
+
+        return metadataDefinitions.values().stream()
+            .findFirst()
+            .orElseThrow(() -> {
+                final String errorMessage = "Le type "
+                    + complexListTypeMetadataClass.getName()
+                    + " ne dispose pas de définitions seda versionnée";
+
+                return new SEDALibException(errorMessage);
+            });
+    }
+
+    /**
+     * Checks if the metadata list is closed for a given ComplexListType subclass.
+     *
+     * @param complexListTypeMetadataClass the complex list type metadata class
+     * @return true, if is not expendable
+     */
+    static Boolean isNotExpandable(Class complexListTypeMetadataClass) {
+        final Map notExpandableFlags = ComplexListInterface
+            .notExpandableFlags(complexListTypeMetadataClass);
+
+        if (notExpandableFlags.containsKey(SedaContext.getVersion())) {
+            return notExpandableFlags.get(SedaContext.getVersion());
+        }
+
+        return false;
+    }
+
     /**
      * Gets the metadata map associated with this metadata type.
      * The map links XML element names with their corresponding metadata class and cardinality information.
      *
      * @return the metadata map containing element name to metadata kind mappings
      */
-    abstract public LinkedHashMap getMetadataMap() throws SEDALibException;
+    LinkedHashMap getMetadataMap() throws SEDALibException;
 
     /**
      * Checks if this metadata type is not expandable, meaning it has a fixed set of allowed metadata elements.
      *
      * @return true if the metadata list is not expandable, false if new elements can be added
      */
-    abstract public boolean isNotExpandable() throws SEDALibException;
+    boolean isNotExpandable();
 
     /**
      * Gets the list of metadata elements contained in this metadata type.
      *
      * @return the list of SEDAMetadata elements
      */
-    abstract public List getMetadataList();
+    List getMetadataList();
 
     /**
      * Sets the list of metadata elements for this metadata type.
      *
      * @param metadataList the list of SEDAMetadata elements to set
      */
-    abstract public void setMetadataList(List metadataList);
+    void setMetadataList(List metadataList);
 
     /**
      * Gets the XML element name associated with this metadata type.
@@ -183,7 +287,7 @@ public static void initMetadataMaps(
      *
      * @return the XML element name for this metadata type
      */
-    abstract public String getXmlElementName();
+    String getXmlElementName();
 
     /**
      * Wraps primitive types in their corresponding object wrapper classes.
@@ -307,9 +411,7 @@ static private Object[] prepareConstructorArgs(
      * @throws InstantiationException    if the metadataClass cannot be instantiated
      */
     static private SEDAMetadata getClassMemberConstructedFromArgs(Class metadataClass, String elementName, Object[] args) throws SEDALibException, IllegalAccessException, InvocationTargetException, InstantiationException {
-        Object[] newArgs;
-        boolean isNamedType
-                = metadataClass.getName().contains(".namedtype.");
+        boolean isNamedType = metadataClass.getName().contains(".namedtype.");
         SEDAMetadata sm;
 
         Object[] constructorArgs = prepareConstructorArgs(isNamedType, elementName, args);
@@ -352,7 +454,7 @@ static private SEDAMetadata getClassMemberConstructedFromArgs(Class metadataC
     default SEDAMetadata newSEDAMetadata(String elementName, Object[] args) throws SEDALibException {
         LinkedHashMap metadataMap = this.getMetadataMap();
         if (metadataMap == null)
-            throw new SEDALibException("Impossible de construire l'élément [" + elementName + "] en seda 2."+ SEDA2Version.getSeda2Version(), null);
+            throw new SEDALibException("Impossible de construire l'élément [" + elementName + "] en "+ SedaContext.getVersion(), null);
         ComplexListMetadataKind metadataKind = metadataMap.get(elementName);
         try {
             Class metadataClass = (metadataKind != null ? metadataKind.getMetadataClass() : AnyXMLType.class);
@@ -402,7 +504,7 @@ default int indexOfMetadata(String elementName) throws SEDALibException {
      * @param args        the arguments passed to the metadata constructor
      * @throws SEDALibException if the element cannot be added due to invalid arguments or schema constraints
      */
-    default public void addNewMetadata(String elementName, Object... args) throws SEDALibException {
+    default void addNewMetadata(String elementName, Object... args) throws SEDALibException {
         if (args.length > 0) {
             try  {
                 SEDAMetadata sm = newSEDAMetadata(elementName, args);
@@ -410,7 +512,7 @@ default public void addNewMetadata(String elementName, Object... args) throws SE
             }
             catch(SEDALibException e) {
                 throw new SEDALibException("Impossible d'ajouter l'élément [" + elementName + "] au type composé ["
-                        +this.getXmlElementName()+"] en seda 2."+ SEDA2Version.getSeda2Version(), e);
+                        +this.getXmlElementName()+"] en "+ SedaContext.getVersion(), e);
             }
         }
     }
@@ -419,7 +521,7 @@ default public void addNewMetadata(String elementName, Object... args) throws SE
      * Helper class that stores information about where to insert a new metadata item
      * into the metadata list.
      */
-    static class InsertionInfo {
+    class InsertionInfo {
         /**
          * The index position where the new metadata should be inserted
          */
@@ -513,7 +615,7 @@ private InsertionInfo computeInsertionInfoForUnknownType(
      * @param metadata the metadata to add or replace
      * @throws SEDALibException if adding unknown metadata to a non-expandable type or if other constraints are violated
      */
-    default public void addMetadata(SEDAMetadata metadata) throws SEDALibException {
+    default void addMetadata(SEDAMetadata metadata) throws SEDALibException {
         if (metadata == null)
             return;
 
@@ -540,7 +642,7 @@ default public void addMetadata(SEDAMetadata metadata) throws SEDALibException {
      * @param elementName the name of the metadata element to find
      * @return true if the metadata is not present, false otherwise
      */
-    default public boolean isMetadataLacking(String elementName) {
+    default boolean isMetadataLacking(String elementName) {
         List metadataList = this.getMetadataList();
         for (SEDAMetadata sm : metadataList) {
             if (sm.getXmlElementName().equals(elementName))
@@ -598,7 +700,7 @@ default LinkedHashMap toCsvList() throws SEDALibException {
      * @return true, if it finds something convenient, false if not
      * @throws SEDALibException if the XML can't be read or the SEDA scheme is not respected, for example
      */
-    default public boolean fillFromSedaXmlMetadataList(SEDAXMLEventReader xmlReader) throws SEDALibException {
+    default boolean fillFromSedaXmlMetadataList(SEDAXMLEventReader xmlReader) throws SEDALibException {
         List metadataList = getMetadataList();
         LinkedHashMap metadataMap = getMetadataMap();
         boolean isNotExpandable = isNotExpandable();
@@ -660,7 +762,7 @@ static private Class resolveMetadataClass(String name,
      * @param xmlData the xml data
      * @throws SEDALibException if the XML can't be read or the SEDA scheme is not respected
      */
-    default public void addSedaXmlFragments(String xmlData) throws SEDALibException {
+    default void addSedaXmlFragments(String xmlData) throws SEDALibException {
         LinkedHashMap metadataMap = this.getMetadataMap();
         boolean isNotExpandable = this.isNotExpandable();
 
@@ -686,7 +788,7 @@ default public void addSedaXmlFragments(String xmlData) throws SEDALibException
      * @param elementName the name of the metadata element to retrieve
      * @return the first matching metadata or null if not found
      */
-    default public SEDAMetadata getFirstNamedMetadata(String elementName) {
+    default SEDAMetadata getFirstNamedMetadata(String elementName) {
         List metadataList = this.getMetadataList();
         for (SEDAMetadata sm : metadataList) {
             if (elementName.equals(sm.getXmlElementName()))
@@ -701,7 +803,7 @@ default public SEDAMetadata getFirstNamedMetadata(String elementName) {
      * @param elementName the name of the metadata element to retrieve and remove
      * @return the first matching metadata or null if not found
      */
-    default public boolean removeFirstNamedMetadata(String elementName) {
+    default boolean removeFirstNamedMetadata(String elementName) {
         List metadataList = this.getMetadataList();
         for (int i = 0; i < metadataList.size(); i++) {
             if (elementName.equals(metadataList.get(i).getXmlElementName())) {
@@ -718,7 +820,7 @@ default public boolean removeFirstNamedMetadata(String elementName) {
      * @param metadataName the name of the metadata to retrieve
      * @return the value of the metadata as a String, or null if not found
      */
-    default public String getSimpleMetadata(String metadataName) {
+    default String getSimpleMetadata(String metadataName) {
         List metadataList = this.getMetadataList();
         String langText = null;
         for (SEDAMetadata sm : metadataList) {
@@ -749,7 +851,7 @@ else if (sm instanceof DateTimeType) {
      * @return true if the metadata allows multiple values, false otherwise
      * @throws SEDALibException if the metadata map is malformed or does not exist
      */
-    default public boolean isAMultiValuedMetadata(String metadataName) throws SEDALibException {
+    default boolean isAMultiValuedMetadata(String metadataName) throws SEDALibException {
         LinkedHashMap metadataMap = getMetadataMap();
         ComplexListMetadataKind clmk = metadataMap.get(metadataName);
         if (clmk == null)
diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListMetadataMap.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListMetadataMap.java
index 789313d9..3b6ba686 100644
--- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListMetadataMap.java
+++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListMetadataMap.java
@@ -1,10 +1,13 @@
 package fr.gouv.vitam.tools.sedalib.metadata.namedtype;
 
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
 
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ComplexListMetadataMap {
     boolean isExpandable() default false;
-    int[] seda2Version() default {0}; // NON_SPECIFIC_SEDA2_VERSION
+    SedaVersion[] sedaVersion() default {};
 }
diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListType.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListType.java
index ed5b5429..248408bc 100644
--- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListType.java
+++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/ComplexListType.java
@@ -28,7 +28,7 @@
 package fr.gouv.vitam.tools.sedalib.metadata.namedtype;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
-import fr.gouv.vitam.tools.sedalib.core.SEDA2Version;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
 import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLEventReader;
@@ -47,13 +47,12 @@ public abstract class ComplexListType extends NamedTypeMetadata implements Compl
     /**
      * The Sub type metadata map map by versions.
      */
-    protected static HashMap, LinkedHashMap[]> subTypeMetadataMapsMap =
-            new HashMap<>();
+    protected static Map, Map>> subTypeMetadataMapsMap = new HashMap<>();
 
     /**
      * The Sub type expandable map by versions.
      */
-    protected static HashMap, Boolean[]> subTypeNotExpandablesMap = new HashMap<>();
+    protected static Map, Map> subTypeNotExpandablesMap = new HashMap<>();
 
     /**
      * The metadata list.
@@ -119,7 +118,6 @@ public LinkedHashMap toCsvList() throws SEDALibException {
      * @throws SEDALibException if the XML can't be read or the SEDA scheme is not respected, for example
      */
     public boolean fillFromSedaXml(SEDAXMLEventReader xmlReader) throws SEDALibException {
-        Class metadataClass;
         try {
             if (xmlReader.nextBlockIfNamed(elementName)) {
                 fillFromSedaXmlMetadataList(xmlReader);
@@ -133,19 +131,13 @@ public boolean fillFromSedaXml(SEDAXMLEventReader xmlReader) throws SEDALibExcep
     }
 
     /**
-     * Creates new metadata map and expandable arrays for a ComplexListType subclass.
-     * Initializes them by calling ComplexListInterface.initMetadataMaps() and stores
-     * them in the static maps.
+     * Checks if the metadata list is closed.
      *
-     * @param subClass the ComplexListType subclass to initialize
+     * @return true, if is not expendable
      */
-    private static void getNewComplexListSubType(Class subClass) {
-        LinkedHashMap[] metadataMaps = new LinkedHashMap[SEDA2Version.MAX_SUPPORTED_VERSION + 1];
-        Boolean[] isNotExpandables = new Boolean[SEDA2Version.MAX_SUPPORTED_VERSION + 1];
-
-        ComplexListInterface.initMetadataMaps(subClass, metadataMaps, isNotExpandables);
-        subTypeMetadataMapsMap.put(subClass, metadataMaps);
-        subTypeNotExpandablesMap.put(subClass, isNotExpandables);
+    @JsonIgnore
+    public boolean isNotExpandable() {
+        return ComplexListInterface.isNotExpandable(this.getClass());
     }
 
     /**
@@ -157,64 +149,11 @@ private static void getNewComplexListSubType(Class subClass) {
      */
     @JsonIgnore
     public LinkedHashMap getMetadataMap() throws SEDALibException {
-        LinkedHashMap[] metadataMaps = subTypeMetadataMapsMap.get(this.getClass());
-        if (metadataMaps == null) {
-            getNewComplexListSubType(this.getClass());
-            metadataMaps = subTypeMetadataMapsMap.get(this.getClass());
-        }
-        LinkedHashMap metadataMap = metadataMaps[SEDA2Version.getSeda2Version()];
-        return metadataMap != null ? metadataMap : metadataMaps[0];
+        return (LinkedHashMap) ComplexListInterface.getMetadataMap(this.getClass());
     }
 
-    /**
-     * Gets the metadata map, which link xml element name with metadata class and
-     * cardinality for a given ComplexListType sub class.
-     *
-     * @param complexListTypeMetadataClass the complex list type metadata class
-     * @return the metadata map
-     * @throws SEDALibException if the @ComplexListMetadataMap annotated static variable doesn't exist or is badly formed
-     */
-    public static Map getMetadataMap(Class complexListTypeMetadataClass) throws SEDALibException {
-        LinkedHashMap[] metadataMaps = subTypeMetadataMapsMap.get(complexListTypeMetadataClass);
-        if (metadataMaps == null) {
-            getNewComplexListSubType(complexListTypeMetadataClass);
-            metadataMaps = subTypeMetadataMapsMap.get(complexListTypeMetadataClass);
-        }
-        HashMap metadataMap = metadataMaps[SEDA2Version.getSeda2Version()];
-        return metadataMap != null ? metadataMap : metadataMaps[0];
-    }
-
-    /**
-     * Checks if the metadata list is closed.
-     *
-     * @return true, if is not expendable
-     * @throws SEDALibException if the @ComplexListMetadataMap annotated static variable doesn't exist or is badly formed
-     */
     @JsonIgnore
-    public boolean isNotExpandable() throws SEDALibException {
-        Boolean[] notExpandables = subTypeNotExpandablesMap.get(this.getClass());
-        if (notExpandables == null) {
-            getNewComplexListSubType(this.getClass());
-            notExpandables = subTypeNotExpandablesMap.get(this.getClass());
-        }
-        Boolean notExpandable = notExpandables[SEDA2Version.getSeda2Version()];
-        return (notExpandable != null ? notExpandable : notExpandables[0]);
-    }
-
-    /**
-     * Checks if it the metadata list is closed for a given ComplexListType sub class.
-     *
-     * @param complexListTypeMetadataClass the complex list type metadata class
-     * @return true, if is not expendable
-     * @throws SEDALibException if the @ComplexListMetadataMap annotated static variable doesn't exist or is badly formed
-     */
-    public static Boolean isNotExpandable(Class complexListTypeMetadataClass) throws SEDALibException {
-        Boolean[] notExpandables = subTypeNotExpandablesMap.get(complexListTypeMetadataClass);
-        if (notExpandables == null) {
-            getNewComplexListSubType(complexListTypeMetadataClass);
-            notExpandables = subTypeNotExpandablesMap.get(complexListTypeMetadataClass);
-        }
-        Boolean notExpandable = notExpandables[SEDA2Version.getSeda2Version()];
-        return (notExpandable != null ? notExpandable : notExpandables[0]);
+    public static LinkedHashMap getMetadataMap(Class clazz) throws SEDALibException {
+        return (LinkedHashMap) ComplexListInterface.getMetadataMap(clazz);
     }
 }
diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/LinkingAgentIdentifierType.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/LinkingAgentIdentifier.java
similarity index 86%
rename from sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/LinkingAgentIdentifierType.java
rename to sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/LinkingAgentIdentifier.java
index e68ed20b..61dc0292 100644
--- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/LinkingAgentIdentifierType.java
+++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/metadata/namedtype/LinkingAgentIdentifier.java
@@ -1,15 +1,16 @@
 package fr.gouv.vitam.tools.sedalib.metadata.namedtype;
 
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-public class LinkingAgentIdentifierType extends ComplexListType {
+public class LinkingAgentIdentifier extends ComplexListType {
     /**
      * Init metadata map.
      */
-    @ComplexListMetadataMap(seda2Version = {2,3})
+    @ComplexListMetadataMap(sedaVersion = { SedaVersion.V2_2, SedaVersion.V2_3 })
     public static final Map metadataMap;
 
     static {
@@ -24,7 +25,7 @@ public class LinkingAgentIdentifierType extends ComplexListType {
      *
      * @param elementName the element name
      */
-    public LinkingAgentIdentifierType(String elementName) {
+    public LinkingAgentIdentifier(String elementName) {
         super(elementName);
     }
 
@@ -37,7 +38,7 @@ public LinkingAgentIdentifierType(String elementName) {
      * @param linkingAgentRole            the linking agent role
      * @throws SEDALibException if sub elements construction is not possible (not supposed to occur)
      */
-    public LinkingAgentIdentifierType(String elementName,
+    public LinkingAgentIdentifier(String elementName,
                                       String linkingAgentIdentifierType,
                                       String linkingAgentIdentifierValue,
                                       String linkingAgentRole) throws SEDALibException{
diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/xml/SEDAXMLEventReader.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/xml/SEDAXMLEventReader.java
index af08a1d8..06abb9b0 100644
--- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/xml/SEDAXMLEventReader.java
+++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/xml/SEDAXMLEventReader.java
@@ -44,6 +44,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeParseException;
+import java.util.Optional;
 
 import static java.time.format.DateTimeFormatter.ISO_DATE;
 import static java.time.format.DateTimeFormatter.ISO_DATE_TIME;
@@ -368,11 +369,15 @@ public boolean peekBlockIfNamed(String tag) throws XMLStreamException {
      */
     public String peekAttributeBlockIfNamed(String tag, String attribute) throws XMLStreamException {
         XMLEvent peek = peekUsefullEvent();
-        String result = null;
 
-        if (peek.isStartElement() && tag.equals(peek.asStartElement().getName().getLocalPart()))
-            result = peek.asStartElement().getAttributeByName(new QName(attribute)).getValue();
-        return result;
+        if (!peek.isStartElement()) return null;
+        if (!tag.equals(peek.asStartElement().getName().getLocalPart())) return null;
+
+        final QName qName = new QName(attribute);
+        final StartElement startElement = peek.asStartElement();
+        final Attribute attr = startElement.getAttributeByName(qName);
+
+        return Optional.ofNullable(attr).map(Attribute::getValue).orElse(null);
     }
 
     /**
diff --git a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/xml/SEDAXMLValidator.java b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/xml/SEDAXMLValidator.java
index 652ba239..29ccbc10 100644
--- a/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/xml/SEDAXMLValidator.java
+++ b/sedalib/src/main/java/fr/gouv/vitam/tools/sedalib/xml/SEDAXMLValidator.java
@@ -1,6 +1,6 @@
 package fr.gouv.vitam.tools.sedalib.xml;
 
-import fr.gouv.vitam.tools.sedalib.core.SEDA2Version;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.apache.xerces.util.XMLCatalogResolver;
 import org.xml.sax.SAXException;
@@ -26,34 +26,23 @@ public class SEDAXMLValidator {
 
     private static final String SEDA_VITAM_VALIDATION_RESOURCE_2_1 = "seda2_1/seda-vitam-2.1-main.xsd";
     private static final String SEDA_VITAM_VALIDATION_RESOURCE_2_2 = "seda2_2/seda-vitam-2.2-main.xsd";
-    // TODO mettre la version vitam du seda2.3 si nécessaire
     private static final String SEDA_VITAM_VALIDATION_RESOURCE_2_3 = "seda2_3/seda-2.3-main.xsd";
     private static final String HTTP_WWW_W3_ORG_XML_XML_SCHEMA_V1_1 = "http://www.w3.org/XML/XMLSchema/v1.1";
     private static final String CATALOG_FILENAME = "xsd_validation/catalog.xml";
     private static final String RNG_FACTORY = "com.thaiopensource.relaxng.jaxp.XMLSyntaxSchemaFactory";
     private static final String RNG_PROPERTY_KEY = "javax.xml.validation.SchemaFactory:" + XMLConstants.RELAXNG_NS_URI;
 
-    private static Schema sedaSchema = null;
-    private static int sedaVersion = 0;
-
     public static Schema getSEDASchema() throws SEDALibException {
-        if ((sedaSchema == null) || (sedaVersion != SEDA2Version.getSeda2Version())) {
-            switch (SEDA2Version.getSeda2Version()) {
-                case 1:
-                    sedaSchema = getSchemaFromXSDResource(SEDAXMLValidator.class.getClassLoader().getResource(SEDA_VITAM_VALIDATION_RESOURCE_2_1));
-                    break;
-                case 2:
-                    sedaSchema = getSchemaFromXSDResource(SEDAXMLValidator.class.getClassLoader().getResource(SEDA_VITAM_VALIDATION_RESOURCE_2_2));
-                    break;
-                case 3:
-                    sedaSchema = getSchemaFromXSDResource(SEDAXMLValidator.class.getClassLoader().getResource(SEDA_VITAM_VALIDATION_RESOURCE_2_3));
-                    break;
-                default:
-                    throw new SEDALibException("Version du SEDA [" + SEDA2Version.getSeda2VersionString() + "] sans schéma", null);
-            }
-            sedaVersion = SEDA2Version.getSeda2Version();
+        switch (SedaContext.getVersion()) {
+            case V2_1:
+                return getSchemaFromXSDResource(SEDAXMLValidator.class.getClassLoader().getResource(SEDA_VITAM_VALIDATION_RESOURCE_2_1));
+            case V2_2:
+                return getSchemaFromXSDResource(SEDAXMLValidator.class.getClassLoader().getResource(SEDA_VITAM_VALIDATION_RESOURCE_2_2));
+            case V2_3:
+                return getSchemaFromXSDResource(SEDAXMLValidator.class.getClassLoader().getResource(SEDA_VITAM_VALIDATION_RESOURCE_2_3));
+            default:
+                throw new SEDALibException("Version [" + SedaContext.getVersion() + "] sans schéma", null);
         }
-        return sedaSchema;
     }
 
     public static Schema getSchemaFromXSDResource(URL xsdResource) throws SEDALibException {
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/SedaContextExtension.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/SedaContextExtension.java
new file mode 100644
index 00000000..fdc11be3
--- /dev/null
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/SedaContextExtension.java
@@ -0,0 +1,21 @@
+package fr.gouv.vitam.tools.sedalib;
+
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
+import org.junit.jupiter.api.extension.AfterEachCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+public class SedaContextExtension implements BeforeEachCallback, AfterEachCallback {
+
+    @Override
+    public void beforeEach(ExtensionContext context) {
+        SedaContext.setVersion(SedaVersion.V2_1);
+    }
+
+    @Override
+    public void afterEach(ExtensionContext context) {
+        SedaContext.setVersion(null);
+    }
+}
+
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/BinaryDataObjectTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/BinaryDataObjectTest.java
index 9967564c..467ad1fb 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/BinaryDataObjectTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/BinaryDataObjectTest.java
@@ -3,18 +3,20 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.TestUtilities;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageDeserializer;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageSerializer;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
 import fr.gouv.vitam.tools.sedalib.inout.importer.SIPToArchiveTransferImporter;
 import fr.gouv.vitam.tools.sedalib.metadata.content.PersistentIdentifier;
-import fr.gouv.vitam.tools.sedalib.metadata.namedtype.ComplexListInterface;
 import fr.gouv.vitam.tools.sedalib.metadata.namedtype.IntegerType;
 import fr.gouv.vitam.tools.sedalib.metadata.namedtype.StringType;
 import fr.gouv.vitam.tools.sedalib.utils.ResourceUtils;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.parallel.Execution;
 import org.junit.jupiter.api.parallel.ExecutionMode;
 
@@ -24,15 +26,10 @@
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
 
+@ExtendWith(SedaContextExtension.class)
 @Execution(value = ExecutionMode.SAME_THREAD,reason= "Can't execute different SedaVersion treatment in parallel")
 class BinaryDataObjectTest {
 
-    @BeforeEach
-    void setUp() throws SEDALibException {
-        // Reset default seda version
-        SEDA2Version.setSeda2Version(1);
-    }
-
     @Test
     void testJson() throws SEDALibException, InterruptedException, IOException {
         // Given
@@ -164,7 +161,7 @@ void testXMLFragment() throws SEDALibException, InterruptedException, FileNotFou
         SIPToArchiveTransferImporter si = new SIPToArchiveTransferImporter(
                 "src/test/resources/PacketSamples/TestSip.zip", "target/tmpJunit/TestSIP.zip-tmpdir", null);
 
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
         si.doImport();
         BinaryDataObject bdo = si.getArchiveTransfer().getDataObjectPackage().getBdoInDataObjectPackageIdMap()
                 .get("ID7");
@@ -189,7 +186,7 @@ void testXMLFragment() throws SEDALibException, InterruptedException, FileNotFou
     void testXMLFragmentForSedaVersion2() throws SEDALibException, InterruptedException, FileNotFoundException {
 
         // Given
-        SEDA2Version.setSeda2Version(2);
+        SedaContext.setVersion(SedaVersion.V2_2);
         ObjectMapper mapper = new ObjectMapper();
         SimpleModule module = new SimpleModule();
         module.addSerializer(DataObjectPackage.class, new DataObjectPackageSerializer());
@@ -212,14 +209,14 @@ void testXMLFragmentForSedaVersion2() throws SEDALibException, InterruptedExcept
 
         // Then
         assertThat(bdoNextOut).isEqualToIgnoringWhitespace(ResourceUtils.getResourceAsString("import/binary_data_object_ID7_seda2.2.xml"));
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
     }
 
     @Test
     void testXMLFragmentForSedaVersion3() throws SEDALibException, InterruptedException, FileNotFoundException {
 
         // Given
-        SEDA2Version.setSeda2Version(3);
+        SedaContext.setVersion(SedaVersion.V2_3);
         ObjectMapper mapper = new ObjectMapper();
         SimpleModule module = new SimpleModule();
         module.addSerializer(DataObjectPackage.class, new DataObjectPackageSerializer());
@@ -245,6 +242,6 @@ void testXMLFragmentForSedaVersion3() throws SEDALibException, InterruptedExcept
 
         // Then
         assertThat(bdoNextOut).isEqualToIgnoringWhitespace(ResourceUtils.getResourceAsString("import/binary_data_object_ID7_seda2.3.xml"));
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
     }
 }
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/DataObjectPackageTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/DataObjectPackageTest.java
index 93990b45..a3a51845 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/DataObjectPackageTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/DataObjectPackageTest.java
@@ -4,16 +4,19 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageDeserializer;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageSerializer;
 import fr.gouv.vitam.tools.sedalib.inout.importer.SIPToArchiveTransferImporter;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.jupiter.api.Assertions.fail;
 
+@ExtendWith(SedaContextExtension.class)
 class DataObjectPackageTest {
 
     @Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/GlobalMetadataTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/GlobalMetadataTest.java
index 687396b2..eac20580 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/GlobalMetadataTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/GlobalMetadataTest.java
@@ -1,10 +1,13 @@
 package fr.gouv.vitam.tools.sedalib.core;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class GlobalMetadataTest {
 
 	@Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/PhysicalDataObjectTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/PhysicalDataObjectTest.java
index affa4e59..c6125a98 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/PhysicalDataObjectTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/PhysicalDataObjectTest.java
@@ -3,33 +3,29 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageDeserializer;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageSerializer;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
 import fr.gouv.vitam.tools.sedalib.inout.importer.SIPToArchiveTransferImporter;
-import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata;
 import fr.gouv.vitam.tools.sedalib.metadata.content.PersistentIdentifier;
 import fr.gouv.vitam.tools.sedalib.metadata.namedtype.IntegerType;
 import fr.gouv.vitam.tools.sedalib.metadata.namedtype.StringType;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.parallel.Execution;
 import org.junit.jupiter.api.parallel.ExecutionMode;
 
 import java.io.IOException;
 
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
 
+@ExtendWith(SedaContextExtension.class)
 @Execution(value = ExecutionMode.SAME_THREAD,reason= "Can't execute different SedaVersion treatment in parallel")
 class PhysicalDataObjectTest {
 
-    @BeforeEach
-    void setUp() throws SEDALibException {
-        // Reset default seda version
-        SEDA2Version.setSeda2Version(1);
-    }
-
     @Test
     void testJson() throws SEDALibException, InterruptedException, IOException {
         // Given
@@ -135,7 +131,7 @@ void testXMLFragment() throws SEDALibException, InterruptedException {
         SIPToArchiveTransferImporter si = new SIPToArchiveTransferImporter(
                 "src/test/resources/PacketSamples/TestSip.zip", "target/tmpJunit/TestSIP.zip-tmpdir", null);
 
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
         si.doImport();
         PhysicalDataObject pdo = si.getArchiveTransfer().getDataObjectPackage().getPdoInDataObjectPackageIdMap()
                 .get("ID18");
@@ -191,7 +187,7 @@ void testXMLFragment() throws SEDALibException, InterruptedException {
     @Test
     void testXMLFragmentForSedaVersion2() throws SEDALibException, InterruptedException {
         // Given
-        SEDA2Version.setSeda2Version(2);
+        SedaContext.setVersion(SedaVersion.V2_2);
         ObjectMapper mapper = new ObjectMapper();
         SimpleModule module = new SimpleModule();
         module.addSerializer(DataObjectPackage.class, new DataObjectPackageSerializer());
@@ -229,13 +225,13 @@ void testXMLFragmentForSedaVersion2() throws SEDALibException, InterruptedExcept
                 "  Paysage\n" +
                 "  Phototypie";
         assertThat(pdoNextOut).isEqualToNormalizingNewlines(testOut);
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
     }
 
     @Test
     void testXMLFragmentForSedaVersion3() throws SEDALibException, InterruptedException {
         // Given
-        SEDA2Version.setSeda2Version(3);
+        SedaContext.setVersion(SedaVersion.V2_3);
         ObjectMapper mapper = new ObjectMapper();
         SimpleModule module = new SimpleModule();
         module.addSerializer(DataObjectPackage.class, new DataObjectPackageSerializer());
@@ -284,6 +280,6 @@ void testXMLFragmentForSedaVersion3() throws SEDALibException, InterruptedExcept
                 "  Paysage\n" +
                 "  Phototypie";
         assertThat(pdoNextOut).isEqualToNormalizingNewlines(testOut);
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
     }
 }
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/SEDA2VersionTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/SEDA2VersionTest.java
index 7536e462..dd9d76d4 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/SEDA2VersionTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/SEDA2VersionTest.java
@@ -1,12 +1,16 @@
 package fr.gouv.vitam.tools.sedalib.core;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersionConverter;
 import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata;
 import fr.gouv.vitam.tools.sedalib.metadata.content.*;
 import fr.gouv.vitam.tools.sedalib.metadata.namedtype.*;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLEventReader;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import javax.xml.stream.XMLStreamException;
 import java.io.ByteArrayInputStream;
@@ -15,19 +19,14 @@
 
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class SEDA2VersionTest {
 
-    @BeforeEach
-    void setUp() throws SEDALibException {
-        // Reset default seda version
-        SEDA2Version.setSeda2Version(1);
-    }
-
     @Test
         // Test the SEDA2.1 and 2.2 construct from xml string (fromSedaXML)
     void testSeda2VersionComplianceTest() throws SEDALibException {
         // Given
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
         Content c = new Content();
 
         String xmlFragments="  \n" +
@@ -57,19 +56,19 @@ void testSeda2VersionComplianceTest() throws SEDALibException {
 
         // But in Seda2.2 version the LinkingAgentIdentifier is a recognized XML element and re-ordered before the
         // expansion field
-        SEDA2Version.setSeda2Version(2);
+        SedaContext.setVersion(SedaVersion.V2_2);
         c = new Content();
         c.addSedaXmlFragments(xmlFragments);
         cOut = c.toString();
         assertThat(cOut).isNotEqualTo(testOut);
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
     }
 
     @Test
         // Test the SEDA2.1 to and from 2.2 conversion
     void testSeda2VersionConversionTest() throws SEDALibException {
         // Given
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
         String xmlFragments="    \n" +
                 "    \n" +
                 "      \n" +
@@ -117,7 +116,7 @@ void testSeda2VersionConversionTest() throws SEDALibException {
             if (sm.getXmlElementName().equals("Event")){
                 Event event=(Event) sm;
                 for (SEDAMetadata osm : event.getMetadataList()){
-                    if (osm instanceof LinkingAgentIdentifierType) {
+                    if (osm instanceof LinkingAgentIdentifier) {
                         foundLinking = true;
                         break;
                     }
@@ -130,10 +129,10 @@ void testSeda2VersionConversionTest() throws SEDALibException {
         // Then the Event in ArchiveUnit has a LinkingAgentIdentifierType metadata
 
         try {
-            dop= SEDA2Version.convertToSeda2Version(dop,2,null);
+            dop= new SedaVersionConverter(null).convert(dop, SedaVersion.V2_1, SedaVersion.V2_2);
         } catch (InterruptedException ignored) {
         }
-        SEDA2Version.setSeda2Version(2);
+        SedaContext.setVersion(SedaVersion.V2_2);
 
         c=dop.getArchiveUnitById("ID10").getContent();
         foundLinking=false;
@@ -141,7 +140,7 @@ void testSeda2VersionConversionTest() throws SEDALibException {
             if (sm.getXmlElementName().equals("Event")){
                 Event event=(Event) sm;
                 for (SEDAMetadata osm : event.getMetadataList()){
-                    if (osm instanceof LinkingAgentIdentifierType) {
+                    if (osm instanceof LinkingAgentIdentifier) {
                         foundLinking = true;
                         break;
                     }
@@ -149,6 +148,6 @@ void testSeda2VersionConversionTest() throws SEDALibException {
             }
         }
         assertThat(foundLinking).isTrue();
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
     }
 }
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/json/ArchiveTransferSerDeserializerTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/json/ArchiveTransferSerDeserializerTest.java
index 55a27902..7c75a86a 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/json/ArchiveTransferSerDeserializerTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/json/ArchiveTransferSerDeserializerTest.java
@@ -3,6 +3,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.UseTestFiles;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveTransfer;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage;
@@ -10,12 +11,14 @@
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibJsonProcessingException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.IOException;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+@ExtendWith(SedaContextExtension.class)
 class ArchiveTransferSerDeserializerTest implements UseTestFiles {
 
 	@Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersionConverterTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersionConverterTest.java
new file mode 100644
index 00000000..b21c6165
--- /dev/null
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/core/seda/SedaVersionConverterTest.java
@@ -0,0 +1,138 @@
+package fr.gouv.vitam.tools.sedalib.core.seda;
+
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
+import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage;
+import fr.gouv.vitam.tools.sedalib.metadata.SEDAMetadata;
+import fr.gouv.vitam.tools.sedalib.metadata.content.Content;
+import fr.gouv.vitam.tools.sedalib.metadata.content.Event;
+import fr.gouv.vitam.tools.sedalib.metadata.namedtype.LinkingAgentIdentifier;
+import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
+import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger;
+import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLEventReader;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+
+@ExtendWith(SedaContextExtension.class)
+public class SedaVersionConverterTest {
+
+    private SEDALibProgressLogger logger;
+    private SedaVersionConverter converter;
+
+    @BeforeEach
+    public void setUp() {
+        logger = mock(SEDALibProgressLogger.class);
+        converter = new SedaVersionConverter(logger);
+    }
+
+    @Test
+    public void testConvert_successful() throws Exception {
+        // Given
+        final String xmlFragments =
+            "\n" +
+            "  \n" +
+            "    \n" +
+            "      \n" +
+            "        RecordGrp\n" +
+            "        Nouvelle ArchiveUnit\n" +
+            "        Ce test est pour voir ce qui se passe après 20 espaces\n" +
+            "        \n" +
+            "          TyE\n" +
+            "          2022-05-10T00:00:00.000\n" +
+            "          DetE\n" +
+            "          \n" +
+            "            ty\n" +
+            "            va\n" +
+            "            ro\n" +
+            "          \n" +
+            "          123\n" +
+            "        \n" +
+            "      \n" +
+            "    \n" +
+            "  \n" +
+            "  \n" +
+            "    Acquisition Information\n" +
+            "    Public Archive\n" +
+            "    Service_producteur\n" +
+            "    Service_versant\n" +
+            "  \n" +
+            "";
+
+        DataObjectPackage dop;
+        try (ByteArrayInputStream bais = new ByteArrayInputStream(xmlFragments.getBytes(StandardCharsets.UTF_8));
+            SEDAXMLEventReader xmlReader = new SEDAXMLEventReader(bais)) {
+
+            xmlReader.nextUsefullEvent(); // skip StartDocument
+            dop = DataObjectPackage.fromSedaXml(xmlReader, "", logger);
+        }
+
+        // When
+        SedaVersionConverter converter = new SedaVersionConverter(logger);
+        DataObjectPackage convertedDop = converter.convert(dop, SedaVersion.V2_1, SedaVersion.V2_2);
+
+        // Then
+        SedaContext.setVersion(SedaVersion.V2_2); // Required to use correct metadata definitions
+        Content content = convertedDop.getArchiveUnitById("ID10").getContent();
+        boolean foundLinking = false;
+
+        for (SEDAMetadata metadata : content.getMetadataList()) {
+            if (metadata instanceof Event) {
+                Event event = (Event) metadata;
+                for (SEDAMetadata subMetadata : event.getMetadataList()) {
+                    if (subMetadata instanceof LinkingAgentIdentifier) {
+                        foundLinking = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        assertThat(foundLinking)
+            .as("LinkingAgentIdentifierType should be present after conversion")
+            .isTrue();
+    }
+
+    @Test
+    public void testConvert_sameVersion_throwsException() {
+        DataObjectPackage original = new DataObjectPackage();
+
+        SEDALibException thrown = assertThrows(SEDALibException.class, () -> {
+            converter.convert(original, SedaVersion.V2_2, SedaVersion.V2_2);
+        });
+
+        assertTrue(thrown.getMessage().contains("identical"));
+    }
+
+    @Test
+    public void testConvert_interruptedDuringSerialization_propagates() throws Exception {
+        // Given a DataObjectPackage that throws InterruptedException during toSedaXml
+        DataObjectPackage mockPackage = mock(DataObjectPackage.class);
+        doThrow(new InterruptedException("interrupted")).when(mockPackage).toSedaXml(any(), eq(true), any());
+
+        // When + Then
+        assertThrows(InterruptedException.class, () -> {
+            converter.convert(mockPackage, SedaVersion.V2_1, SedaVersion.V2_3);
+        });
+    }
+
+    @Test
+    public void shouldFailWhenSourceVersionAndContextVersionAreDifferent() {
+        DataObjectPackage original = new DataObjectPackage();
+
+        /**
+         * @see SedaContextExtension initial SEDA version is SedaVersion.V2_1
+         */
+        SEDALibException thrown = assertThrows(SEDALibException.class, () -> {
+            converter.convert(original, SedaVersion.V2_2, SedaVersion.V2_3);
+        });
+
+        assertTrue(thrown.getMessage().contains("different"));
+    }
+}
\ No newline at end of file
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/ArchiveDeliveryRequestReplyFromXmlTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/ArchiveDeliveryRequestReplyFromXmlTest.java
index 01418965..d6c19f60 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/ArchiveDeliveryRequestReplyFromXmlTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/ArchiveDeliveryRequestReplyFromXmlTest.java
@@ -4,6 +4,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectGroup;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageDeserializer;
@@ -11,9 +12,11 @@
 import fr.gouv.vitam.tools.sedalib.inout.importer.DIPToArchiveDeliveryRequestReplyImporter;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class ArchiveDeliveryRequestReplyFromXmlTest {
 
 	@Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/ArchiveTransferToFromXmlTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/ArchiveTransferToFromXmlTest.java
index 201d1389..fcf22be2 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/ArchiveTransferToFromXmlTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/ArchiveTransferToFromXmlTest.java
@@ -1,11 +1,13 @@
 package fr.gouv.vitam.tools.sedalib.inout;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.UseTestFiles;
 import fr.gouv.vitam.tools.sedalib.core.GlobalMetadata;
 import fr.gouv.vitam.tools.sedalib.inout.importer.DiskToArchiveTransferImporter;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLStreamWriter;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import javax.xml.stream.XMLStreamException;
 import java.io.ByteArrayOutputStream;
@@ -16,6 +18,7 @@
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class ArchiveTransferToFromXmlTest implements UseTestFiles {
 
     private static String readFileToString(String path) throws IOException {
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVMetadataExporterTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVMetadataExporterTest.java
index 41e275b2..1ae72307 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVMetadataExporterTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVMetadataExporterTest.java
@@ -1,5 +1,6 @@
 package fr.gouv.vitam.tools.sedalib.inout;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.TestUtilities;
 import fr.gouv.vitam.tools.sedalib.inout.exporter.DataObjectPackageToCSVMetadataExporter;
 import fr.gouv.vitam.tools.sedalib.inout.importer.DiskToArchiveTransferImporter;
@@ -8,6 +9,7 @@
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.apache.commons.io.FileUtils;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.*;
 import java.nio.file.Files;
@@ -23,6 +25,7 @@
 import static fr.gouv.vitam.tools.sedalib.inout.exporter.DataObjectPackageToCSVMetadataExporter.ALL_DATAOBJECTS;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class CSVMetadataExporterTest {
 
     private static final String TEMPORARY_FILE = "target/tmpJunit/CSVMetadataExporterCSV/ExportedMetadata.csv";
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVMetadataToDataObjectPackageImporterTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVMetadataToDataObjectPackageImporterTest.java
index 8a43bc24..b183c0e9 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVMetadataToDataObjectPackageImporterTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVMetadataToDataObjectPackageImporterTest.java
@@ -4,6 +4,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageDeserializer;
@@ -12,12 +13,14 @@
 import fr.gouv.vitam.tools.sedalib.utils.ResourceUtils;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.FileNotFoundException;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class CSVMetadataToDataObjectPackageImporterTest {
 
 	@Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVTreeToDataObjectPackageImporterTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVTreeToDataObjectPackageImporterTest.java
index 9614912c..335c432a 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVTreeToDataObjectPackageImporterTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CSVTreeToDataObjectPackageImporterTest.java
@@ -4,6 +4,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageDeserializer;
@@ -11,10 +12,12 @@
 import fr.gouv.vitam.tools.sedalib.inout.importer.CSVTreeToDataObjectPackageImporter;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class CSVTreeToDataObjectPackageImporterTest {
 
 	@Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CompressedFileImportTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CompressedFileImportTest.java
index 4c2d6376..ba46f052 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CompressedFileImportTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/CompressedFileImportTest.java
@@ -3,6 +3,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.UseTestFiles;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectGroup;
@@ -11,6 +12,7 @@
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageSerializer;
 import fr.gouv.vitam.tools.sedalib.inout.importer.CompressedFileToArchiveTransferImporter;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -19,6 +21,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@ExtendWith(SedaContextExtension.class)
 class CompressedFileImportTest implements UseTestFiles {
 
     @Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/DiskImportExportTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/DiskImportExportTest.java
index 6436f495..34c722d0 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/DiskImportExportTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/DiskImportExportTest.java
@@ -3,6 +3,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.UseTestFiles;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectGroup;
@@ -11,6 +12,7 @@
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageSerializer;
 import fr.gouv.vitam.tools.sedalib.inout.importer.DiskToArchiveTransferImporter;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.util.function.Function;
 import java.util.regex.Matcher;
@@ -20,6 +22,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@ExtendWith(SedaContextExtension.class)
 class DiskImportExportTest implements UseTestFiles {
 
     @Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SEDAValidationTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SEDAValidationTest.java
index 9d34522a..177cf216 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SEDAValidationTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SEDAValidationTest.java
@@ -1,19 +1,21 @@
 package fr.gouv.vitam.tools.sedalib.inout;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.TestUtilities;
 import fr.gouv.vitam.tools.sedalib.UseTestFiles;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.core.BinaryDataObject;
 import fr.gouv.vitam.tools.sedalib.core.GlobalMetadata;
-import fr.gouv.vitam.tools.sedalib.core.SEDA2Version;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
 import fr.gouv.vitam.tools.sedalib.inout.importer.DiskToArchiveTransferImporter;
 import fr.gouv.vitam.tools.sedalib.inout.importer.SIPToArchiveTransferImporter;
 import fr.gouv.vitam.tools.sedalib.metadata.namedtype.StringType;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLStreamWriter;
 import org.apache.commons.io.output.ByteArrayOutputStream;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import javax.xml.stream.XMLStreamException;
 import java.io.IOException;
@@ -23,14 +25,9 @@
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 import static org.junit.jupiter.api.Assertions.assertAll;
 
+@ExtendWith(SedaContextExtension.class)
 class SEDAValidationTest implements UseTestFiles {
 
-	@BeforeEach
-	void setUp() throws SEDALibException {
-		// Reset default seda version
-		SEDA2Version.setSeda2Version(1);
-	}
-
 	@Test
 	void testSedaXmlValidationOK()
 			throws IllegalArgumentException, SEDALibException, InterruptedException {
@@ -83,7 +80,7 @@ void testSedaXmlArchiveTransferGenerationAndValidationForSedaVersion2()
             throws IllegalArgumentException, SEDALibException, InterruptedException {
 
         // do import of test directory
-        SEDA2Version.setSeda2Version(2);
+        SedaContext.setVersion(SedaVersion.V2_2);
         DiskToArchiveTransferImporter di = new DiskToArchiveTransferImporter(
                 "src/test/resources/PacketSamples/SampleWithLinksModelV2", null);
         di.addIgnorePattern("Thumbs.db");
@@ -138,7 +135,7 @@ void testSedaXmlArchiveTransferGenerationAndValidationForSedaVersion2()
         } catch (XMLStreamException | IOException e) {
             throw new RuntimeException(e);
         }
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
     }
 
 	@Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SIPBuilderTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SIPBuilderTest.java
index e0d66667..53a46010 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SIPBuilderTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SIPBuilderTest.java
@@ -1,5 +1,6 @@
 package fr.gouv.vitam.tools.sedalib.inout;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.TestUtilities;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.metadata.content.Content;
@@ -11,6 +12,7 @@
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibProgressLogger;
 import fr.gouv.vitam.tools.sedalib.xml.SEDAXMLEventReader;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
@@ -26,6 +28,7 @@
 import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
 import static org.junit.jupiter.api.Assertions.assertAll;
 
+@ExtendWith(SedaContextExtension.class)
 class SIPBuilderTest {
 
     private static String stripFileName(String fileName) {
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SIPImportTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SIPImportTest.java
index a0e98f3e..f09eecb4 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SIPImportTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/SIPImportTest.java
@@ -4,12 +4,12 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.TestUtilities;
 import fr.gouv.vitam.tools.sedalib.UseTestFiles;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectGroup;
 import fr.gouv.vitam.tools.sedalib.core.DataObjectPackage;
-import fr.gouv.vitam.tools.sedalib.core.SEDA2Version;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageDeserializer;
 import fr.gouv.vitam.tools.sedalib.core.json.DataObjectPackageSerializer;
 import fr.gouv.vitam.tools.sedalib.inout.exporter.ArchiveTransferToDiskExporter;
@@ -17,10 +17,9 @@
 import fr.gouv.vitam.tools.sedalib.inout.importer.DiskToArchiveTransferImporter;
 import fr.gouv.vitam.tools.sedalib.inout.importer.SIPToArchiveTransferImporter;
 import fr.gouv.vitam.tools.sedalib.utils.ResourceUtils;
-import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.apache.commons.io.FileUtils;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.File;
 import java.util.regex.Matcher;
@@ -30,14 +29,9 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@ExtendWith(SedaContextExtension.class)
 class SIPImportTest implements UseTestFiles {
 
-    @BeforeEach
-    void setUp() throws SEDALibException {
-        // Reset default seda version
-        SEDA2Version.setSeda2Version(1);
-    }
-
     @Test
     void TestSIPOKImport() throws Exception {
 
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/importer/CSVMetadataFormatterTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/importer/CSVMetadataFormatterTest.java
index c62e9055..39f64e61 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/importer/CSVMetadataFormatterTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/inout/importer/CSVMetadataFormatterTest.java
@@ -1,13 +1,16 @@
 package fr.gouv.vitam.tools.sedalib.inout.importer;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.utils.ResourceUtils;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.FileNotFoundException;
 import java.nio.file.Paths;
 
+@ExtendWith(SedaContextExtension.class)
 class CSVMetadataFormatterTest {
 
     @Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ArchiveUnitProfileTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ArchiveUnitProfileTest.java
index 68abc1b4..c9705b01 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ArchiveUnitProfileTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ArchiveUnitProfileTest.java
@@ -1,10 +1,13 @@
 package fr.gouv.vitam.tools.sedalib.metadata;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
 
 // test ArchveUnitProfile
+@ExtendWith(SedaContextExtension.class)
 class ArchiveUnitProfileTest {
 
     @Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ContentTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ContentTest.java
index 3017729e..43eabc3c 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ContentTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ContentTest.java
@@ -1,12 +1,14 @@
 package fr.gouv.vitam.tools.sedalib.metadata;
 
-import fr.gouv.vitam.tools.sedalib.core.SEDA2Version;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
 import fr.gouv.vitam.tools.sedalib.metadata.content.*;
 import fr.gouv.vitam.tools.sedalib.metadata.namedtype.*;
 import fr.gouv.vitam.tools.sedalib.utils.ResourceUtils;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.FileNotFoundException;
 import java.time.LocalDate;
@@ -19,14 +21,9 @@
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class ContentTest {
 
-    @BeforeEach
-    void setUp() throws SEDALibException {
-        // Reset default seda version
-        SEDA2Version.setSeda2Version(1);
-    }
-
     @Test
         // Test Content and ComplexListType subclass
     void testConstructors() throws SEDALibException, FileNotFoundException {
@@ -265,7 +262,7 @@ void testSeda2Version() throws SEDALibException {
                 .isInstanceOf(SEDALibException.class).hasStackTraceContaining("Pas de constructeur de l'élément [Agent]");
 
         // and add Agent in SEDA 2.1 version then
-        SEDA2Version.setSeda2Version(2);
+        SedaContext.setVersion(SedaVersion.V2_2);
         c.addNewMetadata("Agent", "TestFirstName", "TestBirthName", "TestIdentifier");
         String cOut = c.toString();
         String testOut = "\n" +
@@ -285,7 +282,7 @@ void testSeda2Version() throws SEDALibException {
                 "  \n" +
                 "";
         assertThat(cOut).isEqualTo(testOut);
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
     }
 
 
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/DataTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/DataTest.java
index 57801e59..99c6a14c 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/DataTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/DataTest.java
@@ -1,5 +1,6 @@
 package fr.gouv.vitam.tools.sedalib.metadata;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.metadata.data.FileInfo;
 import fr.gouv.vitam.tools.sedalib.metadata.data.FormatIdentification;
 import fr.gouv.vitam.tools.sedalib.metadata.data.Metadata;
@@ -7,6 +8,7 @@
 import fr.gouv.vitam.tools.sedalib.utils.ResourceUtils;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.FileNotFoundException;
 import java.nio.file.attribute.FileTime;
@@ -15,6 +17,7 @@
 import static java.time.format.DateTimeFormatter.ISO_DATE_TIME;
 import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class DataTest {
 
     @Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ManagementMetadataTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ManagementMetadataTest.java
index cc407564..80ec4326 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ManagementMetadataTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ManagementMetadataTest.java
@@ -1,15 +1,18 @@
 package fr.gouv.vitam.tools.sedalib.metadata;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.metadata.management.AppraisalRule;
 import fr.gouv.vitam.tools.sedalib.metadata.management.HoldRule;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.time.LocalDate;
 import java.util.Collections;
 
 import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class ManagementMetadataTest {
 
     @Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ManagementTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ManagementTest.java
index 7041908c..7b55be54 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ManagementTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/metadata/ManagementTest.java
@@ -1,9 +1,11 @@
 package fr.gouv.vitam.tools.sedalib.metadata;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.metadata.management.*;
 import fr.gouv.vitam.tools.sedalib.utils.ResourceUtils;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.FileNotFoundException;
 import java.time.LocalDate;
@@ -12,6 +14,7 @@
 
 import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class ManagementTest {
 
 	@Test
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/process/CompactorTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/process/CompactorTest.java
index c8c5bbd2..0b6c9e0a 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/process/CompactorTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/process/CompactorTest.java
@@ -1,16 +1,17 @@
 package fr.gouv.vitam.tools.sedalib.process;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.TestUtilities;
 import fr.gouv.vitam.tools.sedalib.UseTestFiles;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.core.BinaryDataObject;
-import fr.gouv.vitam.tools.sedalib.core.SEDA2Version;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
 import fr.gouv.vitam.tools.sedalib.inout.importer.DiskToArchiveTransferImporter;
 import fr.gouv.vitam.tools.sedalib.utils.ResourceUtils;
-import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.apache.commons.io.FileUtils;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.File;
 import java.nio.file.Files;
@@ -19,14 +20,9 @@
 
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class CompactorTest implements UseTestFiles {
 
-    @BeforeEach
-    void setUp() throws SEDALibException {
-        // Reset default seda version
-        SEDA2Version.setSeda2Version(1);
-    }
-
     private void eraseAll(String dirOrFile) {
         try {
             Files.delete(Paths.get(dirOrFile));
@@ -87,7 +83,7 @@ void TestCompactor() throws Exception {
     void TestCompactorSeda2V3() throws Exception {
 
         // Given this test directory imported
-        SEDA2Version.setSeda2Version(3);
+        SedaContext.setVersion(SedaVersion.V2_3);
         DiskToArchiveTransferImporter di = new DiskToArchiveTransferImporter(
                 "src/test/resources/PacketSamples/SampleWithoutLinksModelV1", null);
         di.addIgnorePattern("Thumbs.db");
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/process/DeCompactorTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/process/DeCompactorTest.java
index 07465db1..14e68a25 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/process/DeCompactorTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/process/DeCompactorTest.java
@@ -1,5 +1,6 @@
 package fr.gouv.vitam.tools.sedalib.process;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import fr.gouv.vitam.tools.sedalib.UseTestFiles;
 import fr.gouv.vitam.tools.sedalib.core.ArchiveUnit;
 import fr.gouv.vitam.tools.sedalib.core.BinaryDataObject;
@@ -11,6 +12,7 @@
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
 import org.apache.commons.io.FileUtils;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.io.File;
 import java.nio.file.Files;
@@ -19,6 +21,7 @@
 
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 class DeCompactorTest implements UseTestFiles {
 
     private void eraseAll(String dirOrFile) {
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/ArchTests.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/ArchTests.java
index ea963ffd..d243fdc3 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/ArchTests.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/ArchTests.java
@@ -33,11 +33,14 @@
 import com.tngtech.archunit.core.domain.JavaModifier;
 import com.tngtech.archunit.core.importer.ClassFileImporter;
 import com.tngtech.archunit.lang.syntax.ArchRuleDefinition;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.time.LocalDateTime;
 
+@ExtendWith(SedaContextExtension.class)
 public class ArchTests {
 
 
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/LocalDateTimeUtilTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/LocalDateTimeUtilTest.java
index 80917f84..16c52781 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/LocalDateTimeUtilTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/LocalDateTimeUtilTest.java
@@ -1,17 +1,18 @@
 package fr.gouv.vitam.tools.sedalib.utils;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.nio.file.attribute.FileTime;
-import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeParseException;
 
-import static java.time.format.DateTimeFormatter.ISO_DATE_TIME;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
+@ExtendWith(SedaContextExtension.class)
 class LocalDateTimeUtilTest {
 
 
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/ResourceUtils.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/ResourceUtils.java
index 88852d59..968bbbcf 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/ResourceUtils.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/utils/ResourceUtils.java
@@ -1,5 +1,8 @@
 package fr.gouv.vitam.tools.sedalib.utils;
 
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
+import org.junit.jupiter.api.extension.ExtendWith;
+
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -11,6 +14,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 
+@ExtendWith(SedaContextExtension.class)
 public class ResourceUtils {
 
     private static final String FILE_NOT_FOUND_IN_RESOURCES = "File not found in Resources: ";
diff --git a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/xml/SEDAValidationTest.java b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/xml/SEDAValidationTest.java
index 1f549565..f21eb635 100644
--- a/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/xml/SEDAValidationTest.java
+++ b/sedalib/src/test/java/fr/gouv/vitam/tools/sedalib/xml/SEDAValidationTest.java
@@ -1,27 +1,24 @@
 package fr.gouv.vitam.tools.sedalib.xml;
 
-import fr.gouv.vitam.tools.sedalib.core.SEDA2Version;
+import fr.gouv.vitam.tools.sedalib.SedaContextExtension;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaContext;
+import fr.gouv.vitam.tools.sedalib.core.seda.SedaVersion;
 import fr.gouv.vitam.tools.sedalib.utils.SEDALibException;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 import static fr.gouv.vitam.tools.sedalib.TestUtilities.readFileToString;
 import static org.assertj.core.api.Assertions.assertThat;
 
+@ExtendWith(SedaContextExtension.class)
 public class SEDAValidationTest {
 
-    @BeforeEach
-    void setUp() throws SEDALibException {
-        // Reset default seda version
-        SEDA2Version.setSeda2Version(1);
-    }
-
     @Test
     public void testSeda2_1ArchiveTransferCompliance() throws SEDALibException {
 
         // Given
         String sedaFilePath = "src/test/resources/xml/seda2_1ArchiveTransfer.xml"; // Modify with actual path
-        SEDA2Version.setSeda2Version(1);
+        SedaContext.setVersion(SedaVersion.V2_1);
         SEDAXMLValidator validator = new SEDAXMLValidator();
         String sedaContent = readFileToString(sedaFilePath);