From 38c83ae8bf936eee231aec0e1297d945ef445f51 Mon Sep 17 00:00:00 2001
From: sebastien curt <sebastien.curt@tetras-libre.fr>
Date: Tue, 2 Jun 2020 23:20:58 +0200
Subject: [PATCH] Integration of PicoContainer IOC

---
 .idea/compiler.xml                            | 12 +++--
 .idea/encodings.xml                           |  6 ++-
 .idea/misc.xml                                |  1 +
 .idea/modules.xml                             |  3 +-
 pom.xml                                       |  9 ++--
 unl-tools-application/pom.xml                 | 23 +++++++++
 .../CommandHandlerResolverBuilder.java        | 25 ++++++++++
 .../unltools/Convert/ExportUnlDocuments.java  | 31 ++++++++++++
 .../Convert/ExportUnlDocumentsHandler.java    | 27 ++++++++++
 .../DefaultCommandHandlerResolverFactory.java | 14 ++++++
 .../unl-tools-application.iml                 | 24 +++++++++
 unl-tools-core/pom.xml                        |  4 +-
 .../tetras_libre/unltools/cqrs/Command.java   |  4 ++
 .../unltools/cqrs/CommandHandler.java         |  5 ++
 .../unltools/cqrs/CommandHandlerResolver.java | 20 ++++++++
 .../tetras_libre/unltools/cqrs/Mediator.java  | 16 ++++++
 .../fr/tetras_libre/unltools/cqrs/Result.java | 42 ++++++++++++++++
 .../unltools/cqrs/ServiceProvider.java        |  7 +++
 .../fr/tetras_libre/unltools/unl/Graph.java   |  6 +--
 .../unltools/unl/GraphImporter.java           |  7 +++
 .../unltools/unl/GraphRelation.java           |  4 +-
 .../unltools/unl/UnlDocument.java             |  8 +--
 .../unltools/unl/UnlDocumentNode.java         |  4 +-
 .../unltools/unl/EqualsBuilderTest.java       | 30 ++++++------
 unl-tools-infrastructure/pom.xml              | 14 +++++-
 .../unltools/ApplicationStartup.java          | 29 +++++++++++
 .../unltools/cqrs/ServiceProviderImpl.java    | 26 ++++++++++
 .../unltools/unl/GraphExtensions.java         |  3 --
 .../unl/SubGraphReferenceNodeExtensions.java  |  4 --
 .../RelationLabelToUnlPropertyConverter.java  |  2 +-
 .../rdf/UnlDocumentToRdfConverter.java        |  2 -
 .../unl/exporters/rdf/UtilGraphNodeUri.java   |  2 +-
 .../parser/UnlGraphImporterFromUnlParser.java | 33 +++++++++++++
 .../unltools/ApplicationStartupTest.java      | 49 +++++++++++++++++++
 .../fr/tetras_libre/unltools/TestCommand.java |  8 +++
 .../unltools/TestCommandHandler.java          | 16 ++++++
 .../AbstractFlyweightUnlArgumentProvider.java |  6 ++-
 .../fr/tetras_libre/unltools/unl/AllUnl.java  |  1 -
 .../fr/tetras_libre/unltools/unl/CatsUnl.java |  2 +-
 .../fr/tetras_libre/unltools/unl/R1Unl.java   | 29 ++++++-----
 .../fr/tetras_libre/unltools/unl/R2Unl.java   | 24 ++++-----
 ...ntenceWithExpectedDotArgumentProvider.java |  4 --
 ...lationLabelToUnlPropertyConverterTest.java |  5 +-
 .../unltools/unl/parser/UnlParserTest.java    | 17 +++----
 .../unltools/unl/parser/WrapperUnlParser.java |  3 ++
 .../unl-tools-infrastructure.iml              |  2 +
 {unl-tools-app => unl-tools-main}/pom.xml     | 18 +++++--
 .../src/main/java/unl2rdf/Options.java        |  0
 .../src/main/java/unl2rdf/OutFileType.java    |  0
 .../src/main/java/unl2rdf/Unl2Rdf.java        | 40 +++++++--------
 .../src/main/resources/META-INF/MANIFEST.MF   |  0
 .../src/test/java/unl2rdf/Unl2RdfTest.java    |  8 +--
 .../unl-tools-main.iml                        |  2 +
 53 files changed, 554 insertions(+), 127 deletions(-)
 create mode 100644 unl-tools-application/pom.xml
 create mode 100644 unl-tools-application/src/main/java/fr/tetras_libre/unltools/CommandHandlerResolverBuilder.java
 create mode 100644 unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocuments.java
 create mode 100644 unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocumentsHandler.java
 create mode 100644 unl-tools-application/src/main/java/fr/tetras_libre/unltools/DefaultCommandHandlerResolverFactory.java
 create mode 100644 unl-tools-application/unl-tools-application.iml
 create mode 100644 unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Command.java
 create mode 100644 unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandler.java
 create mode 100644 unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandlerResolver.java
 create mode 100644 unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Mediator.java
 create mode 100644 unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Result.java
 create mode 100644 unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProvider.java
 create mode 100644 unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphImporter.java
 create mode 100644 unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/ApplicationStartup.java
 create mode 100644 unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProviderImpl.java
 create mode 100644 unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlGraphImporterFromUnlParser.java
 create mode 100644 unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/ApplicationStartupTest.java
 create mode 100644 unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommand.java
 create mode 100644 unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommandHandler.java
 rename {unl-tools-app => unl-tools-main}/pom.xml (85%)
 rename {unl-tools-app => unl-tools-main}/src/main/java/unl2rdf/Options.java (100%)
 rename {unl-tools-app => unl-tools-main}/src/main/java/unl2rdf/OutFileType.java (100%)
 rename {unl-tools-app => unl-tools-main}/src/main/java/unl2rdf/Unl2Rdf.java (56%)
 rename {unl-tools-app => unl-tools-main}/src/main/resources/META-INF/MANIFEST.MF (100%)
 rename {unl-tools-app => unl-tools-main}/src/test/java/unl2rdf/Unl2RdfTest.java (92%)
 rename unl-tools-app/unl-tools-app.iml => unl-tools-main/unl-tools-main.iml (97%)

diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 112be42..9266127 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -6,26 +6,29 @@
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
         <outputRelativeToContentRoot value="true" />
-        <module name="unl-tools-infrastructure" />
+        <module name="unl-tools-application" />
         <module name="unl-tools-core" />
+        <module name="unl-tools-infrastructure" />
       </profile>
-      <profile name="Annotation profile for unl-tools-main" enabled="true">
+      <profile name="Annotation profile for unl-tools" enabled="true">
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
         <outputRelativeToContentRoot value="true" />
-        <option name="project" value="fr.tetras_libre.unl/unl-tools-app" />
+        <option name="project" value="fr.tetras_libre.unl/unl-tools-main" />
         <processorPath useClasspath="false">
           <entry name="$MAVEN_REPOSITORY$/info/picocli/picocli-codegen/4.2.0/picocli-codegen-4.2.0.jar" />
           <entry name="$MAVEN_REPOSITORY$/info/picocli/picocli/4.2.0/picocli-4.2.0.jar" />
         </processorPath>
-        <module name="unl-tools-app" />
+        <module name="unl-tools-main" />
       </profile>
     </annotationProcessing>
     <bytecodeTargetLevel target="11">
       <module name="unl-parser" target="11" />
       <module name="unl-tools-app" target="11" />
+      <module name="unl-tools-application" target="11" />
       <module name="unl-tools-core" target="11" />
       <module name="unl-tools-infrastructure" target="11" />
+      <module name="unl-tools-main" target="11" />
       <module name="unl2rdf" target="11" />
       <module name="unl2rdf-app" target="11" />
       <module name="unlTools" target="11" />
@@ -35,6 +38,7 @@
     <option name="ADDITIONAL_OPTIONS_OVERRIDE">
       <module name="unl-parser" options="" />
       <module name="unl-tools-app" options="-Aproject=fr.tetras_libre.unl/unl-tools-app" />
+      <module name="unl-tools-main" options="-Aproject=fr.tetras_libre.unl/unl-tools-main" />
       <module name="unl2rdf" options="-Aproject=unl2rdf/unl2rdf" />
       <module name="unl2rdf-app" options="-Aproject=fr.tetras_libre.unl/unl2rdf-app" />
     </option>
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 6301566..06ab4d0 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -1,10 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="Encoding">
-    <file url="file://$PROJECT_DIR$/unl-tools-app/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/unl-tools-app/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/unl-tools-application/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/unl-tools-application/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/unl-tools-core/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/unl-tools-infrastructure/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/unl-tools-infrastructure/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/unl-tools-main/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/unl-tools-main/src/main/resources" charset="UTF-8" />
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index ba348da..dbdc2e0 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -5,6 +5,7 @@
       <list>
         <option value="$PROJECT_DIR$/pom.xml" />
         <option value="$PROJECT_DIR$/../rdf/pom.xml" />
+        <option value="$PROJECT_DIR$/unl-tools-main/pom.xml" />
       </list>
     </option>
   </component>
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 7e06cd3..4e2ba7a 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,9 +2,10 @@
 <project version="4">
   <component name="ProjectModuleManager">
     <modules>
-      <module fileurl="file://$PROJECT_DIR$/unl-tools-app/unl-tools-app.iml" filepath="$PROJECT_DIR$/unl-tools-app/unl-tools-app.iml" />
+      <module fileurl="file://$PROJECT_DIR$/unl-tools-application/unl-tools-application.iml" filepath="$PROJECT_DIR$/unl-tools-application/unl-tools-application.iml" />
       <module fileurl="file://$PROJECT_DIR$/unl-tools-core/unl-tools-core.iml" filepath="$PROJECT_DIR$/unl-tools-core/unl-tools-core.iml" />
       <module fileurl="file://$PROJECT_DIR$/unl-tools-infrastructure/unl-tools-infrastructure.iml" filepath="$PROJECT_DIR$/unl-tools-infrastructure/unl-tools-infrastructure.iml" />
+      <module fileurl="file://$PROJECT_DIR$/unl-tools-main/unl-tools-main.iml" filepath="$PROJECT_DIR$/unl-tools-main/unl-tools-main.iml" />
       <module fileurl="file://$PROJECT_DIR$/unlTools.iml" filepath="$PROJECT_DIR$/unlTools.iml" />
     </modules>
   </component>
diff --git a/pom.xml b/pom.xml
index cd3992a..a344dcf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -13,12 +13,13 @@
 
     <packaging>pom</packaging>
 
-    <name>unl-tools-main</name>
+    <name>unl-tools</name>
 
     <modules>
         <module>unl-tools-core</module>
-        <module>unl-tools-app</module>
+        <module>unl-tools-main</module>
         <module>unl-tools-infrastructure</module>
+        <module>unl-tools-application</module>
     </modules>
 
     <build>
diff --git a/unl-tools-application/pom.xml b/unl-tools-application/pom.xml
new file mode 100644
index 0000000..f6d18dd
--- /dev/null
+++ b/unl-tools-application/pom.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>unlTools</artifactId>
+        <groupId>fr.tetras_libre.unl</groupId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>unl-tools-application</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>fr.tetras_libre.unl</groupId>
+            <artifactId>unl-tools-core</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/unl-tools-application/src/main/java/fr/tetras_libre/unltools/CommandHandlerResolverBuilder.java b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/CommandHandlerResolverBuilder.java
new file mode 100644
index 0000000..692e47e
--- /dev/null
+++ b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/CommandHandlerResolverBuilder.java
@@ -0,0 +1,25 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.cqrs.Command;
+import fr.tetras_libre.unltools.cqrs.CommandHandler;
+import fr.tetras_libre.unltools.cqrs.CommandHandlerResolver;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+public class CommandHandlerResolverBuilder {
+    private final Dictionary<Class<? extends Command>, Class<? extends CommandHandler>> map;
+
+    public CommandHandlerResolverBuilder() {
+        this.map = new Hashtable<>();
+    }
+
+    public <TResult, THandler extends CommandHandler<TCommand, TResult>, TCommand extends Command<TResult>> CommandHandlerResolverBuilder addHandler(Class<THandler> handler, Class<TCommand> command) {
+        this.map.put(command, handler);
+        return this;
+    }
+
+    public CommandHandlerResolver createCommandResolver() {
+        return new CommandHandlerResolver(this.map);
+    }
+}
diff --git a/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocuments.java b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocuments.java
new file mode 100644
index 0000000..efec7a1
--- /dev/null
+++ b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocuments.java
@@ -0,0 +1,31 @@
+package fr.tetras_libre.unltools.Convert;
+
+import fr.tetras_libre.unltools.cqrs.Command;
+import fr.tetras_libre.unltools.cqrs.Result;
+import fr.tetras_libre.unltools.unl.GraphImporter;
+
+import java.io.Writer;
+
+public class ExportUnlDocuments implements Command<Result> {
+    private final GraphImporter graphImporter;
+    private final String exporterName;
+    private final Writer writer;
+
+    public ExportUnlDocuments(GraphImporter graphImporter, String exporterName, Writer writer) {
+        this.graphImporter = graphImporter;
+        this.exporterName = exporterName;
+        this.writer = writer;
+    }
+
+    public GraphImporter getGraphImporter() {
+        return this.graphImporter;
+    }
+
+    public String getExporterName() {
+        return this.exporterName;
+    }
+
+    public Writer getWriter() {
+        return this.writer;
+    }
+}
diff --git a/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocumentsHandler.java b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocumentsHandler.java
new file mode 100644
index 0000000..62ed343
--- /dev/null
+++ b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/Convert/ExportUnlDocumentsHandler.java
@@ -0,0 +1,27 @@
+package fr.tetras_libre.unltools.Convert;
+
+import fr.tetras_libre.unltools.cqrs.CommandHandler;
+import fr.tetras_libre.unltools.cqrs.Result;
+import fr.tetras_libre.unltools.unl.GraphExporterFactory;
+
+import java.io.IOException;
+
+public class ExportUnlDocumentsHandler implements CommandHandler<ExportUnlDocuments, Result> {
+    private final GraphExporterFactory factory;
+
+    public ExportUnlDocumentsHandler(GraphExporterFactory factory) {
+        this.factory = factory;
+    }
+
+    @Override
+    public Result handle(ExportUnlDocuments command) {
+        try {
+            var graphExporter = factory.createGraphExporter(command.getWriter(), command.getExporterName());
+            graphExporter.write(command.getGraphImporter().Import());
+        } catch (IOException e) {
+            return Result.Failure(String.format("Cannot export unl documents to format '%s'", command.getExporterName()),
+                    e);
+        }
+        return Result.Success();
+    }
+}
diff --git a/unl-tools-application/src/main/java/fr/tetras_libre/unltools/DefaultCommandHandlerResolverFactory.java b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/DefaultCommandHandlerResolverFactory.java
new file mode 100644
index 0000000..5c0f95e
--- /dev/null
+++ b/unl-tools-application/src/main/java/fr/tetras_libre/unltools/DefaultCommandHandlerResolverFactory.java
@@ -0,0 +1,14 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.Convert.ExportUnlDocuments;
+import fr.tetras_libre.unltools.Convert.ExportUnlDocumentsHandler;
+import fr.tetras_libre.unltools.cqrs.CommandHandlerResolver;
+
+public class DefaultCommandHandlerResolverFactory {
+    public static CommandHandlerResolver create() {
+        var builder = new CommandHandlerResolverBuilder()
+                .addHandler(ExportUnlDocumentsHandler.class, ExportUnlDocuments.class);
+
+        return builder.createCommandResolver();
+    }
+}
diff --git a/unl-tools-application/unl-tools-application.iml b/unl-tools-application/unl-tools-application.iml
new file mode 100644
index 0000000..200cdea
--- /dev/null
+++ b/unl-tools-application/unl-tools-application.iml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="unl-tools-core" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.7.0-M1" level="project" />
+    <orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.7.0-M1" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/unl-tools-core/pom.xml b/unl-tools-core/pom.xml
index cbdcd7d..5a2eb25 100644
--- a/unl-tools-core/pom.xml
+++ b/unl-tools-core/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Command.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Command.java
new file mode 100644
index 0000000..edf837f
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Command.java
@@ -0,0 +1,4 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public interface Command<TResult> {
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandler.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandler.java
new file mode 100644
index 0000000..2efdaef
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandler.java
@@ -0,0 +1,5 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public interface CommandHandler<Cmd extends Command<TResult>, TResult> {
+    TResult handle(Cmd command);
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandlerResolver.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandlerResolver.java
new file mode 100644
index 0000000..671d579
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/CommandHandlerResolver.java
@@ -0,0 +1,20 @@
+package fr.tetras_libre.unltools.cqrs;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+
+public class CommandHandlerResolver {
+    private Dictionary<Class<? extends Command>, Class<? extends CommandHandler>> associations;
+
+    public CommandHandlerResolver(Dictionary<Class<? extends Command>, Class<? extends CommandHandler>> associations) {
+        this.associations = associations;
+    }
+
+    public Class<? extends CommandHandler> getHandler(Class<?> cmd) {
+        return associations.get(cmd);
+    }
+
+    public Enumeration<Class<? extends CommandHandler>> getHandlers() {
+        return associations.elements();
+    }
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Mediator.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Mediator.java
new file mode 100644
index 0000000..091200f
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Mediator.java
@@ -0,0 +1,16 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public class Mediator {
+
+    private final ServiceProvider serviceProvider;
+
+    public Mediator(ServiceProvider serviceProvider) {
+        this.serviceProvider = serviceProvider;
+    }
+
+    public <TCmd extends Command<TResult>, TResult> TResult Dispatch(TCmd cmd) {
+        var handlerResolver = (CommandHandlerResolver) serviceProvider.getService(CommandHandlerResolver.class);
+        var handler = (CommandHandler<Command<TResult>, TResult>) serviceProvider.getService(handlerResolver.getHandler(cmd.getClass()));
+        return handler.handle(cmd);
+    }
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Result.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Result.java
new file mode 100644
index 0000000..c9bd9c7
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/Result.java
@@ -0,0 +1,42 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public class Result {
+    private static Result success = new Result(true);
+
+    private boolean isSuccess;
+    private String message;
+    private Exception e;
+
+    private Result(boolean isSuccess) {
+        this(isSuccess, null, null);
+    }
+
+    private Result(boolean isSuccess, String message, Exception e) {
+        if (isSuccess) {
+            this.isSuccess = true;
+        }
+
+        if (!isSuccess && null != message) {
+            this.message = message;
+        }
+
+        if (!isSuccess && null != e) {
+            this.e = e;
+            if (null == this.message || this.message.isBlank()) {
+                this.message = e.getMessage();
+            }
+        }
+    }
+
+    public static Result Success() {
+        return success;
+    }
+
+    public static Result Failure(String message) {
+        return new Result(false, message, null);
+    }
+
+    public static Result Failure(String message, Exception exception) {
+        return new Result(false, message, exception);
+    }
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProvider.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProvider.java
new file mode 100644
index 0000000..3d6ca41
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProvider.java
@@ -0,0 +1,7 @@
+package fr.tetras_libre.unltools.cqrs;
+
+public interface ServiceProvider {
+    Object getService(Class<?> service);
+
+    <TCmd extends Command<TResult>, TResult> CommandHandler<Command<TResult>, TResult> getHandler(Class<? extends TCmd> command);
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/Graph.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/Graph.java
index 6d710a7..33197d0 100644
--- a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/Graph.java
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/Graph.java
@@ -142,18 +142,18 @@ public class Graph {
 
     @Override
     public boolean equals(Object obj) {
-        if(null == obj) {
+        if (null == obj) {
             return false;
         }
 
-        if(!(obj instanceof Graph)) {
+        if (!(obj instanceof Graph)) {
             return false;
         }
 
         return equals((Graph) obj);
     }
 
-    private boolean equals(Graph other){
+    private boolean equals(Graph other) {
         return this.nodes.equals(other.nodes)
                 && this.relations.equals(other.relations);
     }
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphImporter.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphImporter.java
new file mode 100644
index 0000000..001f250
--- /dev/null
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphImporter.java
@@ -0,0 +1,7 @@
+package fr.tetras_libre.unltools.unl;
+
+import java.util.List;
+
+public interface GraphImporter {
+    List<UnlDocument> Import();
+}
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphRelation.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphRelation.java
index 7b56dc5..2af3468 100644
--- a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphRelation.java
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/GraphRelation.java
@@ -52,11 +52,11 @@ public class GraphRelation {
 
     @Override
     public boolean equals(Object obj) {
-        if(null == obj) {
+        if (null == obj) {
             return false;
         }
 
-        if(!(obj instanceof GraphRelation)) {
+        if (!(obj instanceof GraphRelation)) {
             return false;
         }
 
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocument.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocument.java
index eb55529..ed9116a 100644
--- a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocument.java
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocument.java
@@ -73,17 +73,17 @@ public class UnlDocument {
 
     @Override
     public boolean equals(Object obj) {
-        if(obj == null) {
+        if (obj == null) {
             return false;
         }
 
-        if(!(obj instanceof UnlDocument)){
+        if (!(obj instanceof UnlDocument)) {
             return false;
         }
-        return equals((UnlDocument)obj);
+        return equals((UnlDocument) obj);
     }
 
-    private boolean equals(UnlDocument other){
+    private boolean equals(UnlDocument other) {
         return this.docElements.equals(other.docElements)
                 && (this.hasError() == other.hasError());
     }
diff --git a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocumentNode.java b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocumentNode.java
index 08e63d8..6d4c9f2 100644
--- a/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocumentNode.java
+++ b/unl-tools-core/src/main/java/fr/tetras_libre/unltools/unl/UnlDocumentNode.java
@@ -75,11 +75,11 @@ public class UnlDocumentNode {
 
     @Override
     public boolean equals(Object obj) {
-        if(null == obj){
+        if (null == obj) {
             return false;
         }
 
-        if(!(obj instanceof UnlDocumentNode)){
+        if (!(obj instanceof UnlDocumentNode)) {
             return false;
         }
 
diff --git a/unl-tools-core/src/test/java/fr/tetras_libre/unltools/unl/EqualsBuilderTest.java b/unl-tools-core/src/test/java/fr/tetras_libre/unltools/unl/EqualsBuilderTest.java
index 9918265..8fd693d 100644
--- a/unl-tools-core/src/test/java/fr/tetras_libre/unltools/unl/EqualsBuilderTest.java
+++ b/unl-tools-core/src/test/java/fr/tetras_libre/unltools/unl/EqualsBuilderTest.java
@@ -4,21 +4,21 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 class EqualsBuilderTest {
-        @Test
-        void isEqual() {
-            String s1 = "qdfsf";
-            int i1 = 1;
-            long l1 = 2L;
-            EqualsBuilder builder = new EqualsBuilder()
-                    .append(s1)
-                    .append(i1)
-                    .append(l1);
+    @Test
+    void isEqual() {
+        String s1 = "qdfsf";
+        int i1 = 1;
+        long l1 = 2L;
+        EqualsBuilder builder = new EqualsBuilder()
+                .append(s1)
+                .append(i1)
+                .append(l1);
 
-            EqualsBuilder builder2 = new EqualsBuilder()
-                    .append(s1)
-                    .append(i1)
-                    .append(l1);
+        EqualsBuilder builder2 = new EqualsBuilder()
+                .append(s1)
+                .append(i1)
+                .append(l1);
 
-            Assertions.assertTrue(() -> builder.isEqual(builder2));
-        }
+        Assertions.assertTrue(() -> builder.isEqual(builder2));
+    }
 }
\ No newline at end of file
diff --git a/unl-tools-infrastructure/pom.xml b/unl-tools-infrastructure/pom.xml
index 537df2b..4a0f7f5 100644
--- a/unl-tools-infrastructure/pom.xml
+++ b/unl-tools-infrastructure/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -38,6 +38,16 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.picocontainer</groupId>
+            <artifactId>picocontainer</artifactId>
+            <version>2.15</version>
+        </dependency>
+        <dependency>
+            <groupId>fr.tetras_libre.unl</groupId>
+            <artifactId>unl-tools-application</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
 
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/ApplicationStartup.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/ApplicationStartup.java
new file mode 100644
index 0000000..d3654e7
--- /dev/null
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/ApplicationStartup.java
@@ -0,0 +1,29 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.cqrs.CommandHandlerResolver;
+import fr.tetras_libre.unltools.cqrs.Mediator;
+import fr.tetras_libre.unltools.cqrs.ServiceProvider;
+import fr.tetras_libre.unltools.cqrs.ServiceProviderImpl;
+import fr.tetras_libre.unltools.unl.GraphExporterFactory;
+import fr.tetras_libre.unltools.unl.exporters.DefaultGraphExporterFactory;
+import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.containers.TransientPicoContainer;
+
+public class ApplicationStartup {
+
+    public static ServiceProvider Initialize(CommandHandlerResolver commandHandlerResolver) {
+        MutablePicoContainer picoContainer = new TransientPicoContainer();
+
+        picoContainer.addComponent(commandHandlerResolver);
+        for (var handlerToRegister = commandHandlerResolver.getHandlers(); handlerToRegister.hasMoreElements(); ) {
+            picoContainer.addComponent(handlerToRegister.nextElement());
+        }
+
+        picoContainer.addComponent(GraphExporterFactory.class, DefaultGraphExporterFactory.class);
+
+        var result = new ServiceProviderImpl(picoContainer);
+        picoContainer.addComponent(ServiceProvider.class, result);
+        picoContainer.addComponent(Mediator.class);
+        return result;
+    }
+}
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProviderImpl.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProviderImpl.java
new file mode 100644
index 0000000..918647b
--- /dev/null
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/cqrs/ServiceProviderImpl.java
@@ -0,0 +1,26 @@
+package fr.tetras_libre.unltools.cqrs;
+
+import org.picocontainer.PicoContainer;
+
+public class ServiceProviderImpl implements ServiceProvider {
+    PicoContainer container;
+
+    public ServiceProviderImpl(PicoContainer container) {
+        this.container = container;
+    }
+
+    @Override
+    public Object getService(Class<?> service) {
+        return this.container.getComponent(service);
+    }
+
+    public <T> T getInternalService(Class<T> s) {
+        return (T) getService(s);
+    }
+
+    @Override
+    public <TCmd extends Command<TResult>, TResult> CommandHandler<Command<TResult>, TResult> getHandler(Class<? extends TCmd> command) {
+        var commandResolver = getInternalService(CommandHandlerResolver.class);
+        return getInternalService(commandResolver.getHandler(command));
+    }
+}
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/GraphExtensions.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/GraphExtensions.java
index 73bf85d..a7f838e 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/GraphExtensions.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/GraphExtensions.java
@@ -1,8 +1,5 @@
 package fr.tetras_libre.unltools.unl;
 
-import fr.tetras_libre.unltools.unl.Graph;
-import fr.tetras_libre.unltools.unl.GraphRelation;
-
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.stream.Stream;
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/SubGraphReferenceNodeExtensions.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/SubGraphReferenceNodeExtensions.java
index 19144d2..34ae9f7 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/SubGraphReferenceNodeExtensions.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/SubGraphReferenceNodeExtensions.java
@@ -1,9 +1,5 @@
 package fr.tetras_libre.unltools.unl;
 
-import fr.tetras_libre.unltools.unl.Graph;
-import fr.tetras_libre.unltools.unl.NoEntryNodeException;
-import fr.tetras_libre.unltools.unl.SubGraphReferenceNode;
-
 public class SubGraphReferenceNodeExtensions {
     public static String getScopeNameFromSubGraphReferenceNode(SubGraphReferenceNode g) {
         return g.getReferenceNumber().substring(1);
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverter.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverter.java
index 8715202..2ab59e8 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverter.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverter.java
@@ -1,8 +1,8 @@
 package fr.tetras_libre.unltools.unl.exporters.rdf;
 
+import fr.tetras_libre.rdf.vocabulary.UNL;
 import org.apache.jena.ontology.ObjectProperty;
 import org.apache.jena.ontology.OntModel;
-import fr.tetras_libre.rdf.vocabulary.UNL;
 
 
 public class RelationLabelToUnlPropertyConverter {
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UnlDocumentToRdfConverter.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UnlDocumentToRdfConverter.java
index 1966719..5b778b4 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UnlDocumentToRdfConverter.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UnlDocumentToRdfConverter.java
@@ -2,8 +2,6 @@ package fr.tetras_libre.unltools.unl.exporters.rdf;
 
 import fr.tetras_libre.rdf.vocabulary.UNL;
 import fr.tetras_libre.unltools.unl.*;
-import fr.tetras_libre.unltools.unl.GraphExtensions;
-import fr.tetras_libre.unltools.unl.SubGraphReferenceNodeExtensions;
 import org.apache.jena.ontology.Individual;
 import org.apache.jena.ontology.OntModel;
 import org.apache.jena.ontology.Ontology;
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UtilGraphNodeUri.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UtilGraphNodeUri.java
index f8d5e5c..5c20e56 100644
--- a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UtilGraphNodeUri.java
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/exporters/rdf/UtilGraphNodeUri.java
@@ -2,8 +2,8 @@ package fr.tetras_libre.unltools.unl.exporters.rdf;
 
 import fr.tetras_libre.unltools.unl.GraphNode;
 import fr.tetras_libre.unltools.unl.SubGraphReferenceNode;
-import fr.tetras_libre.unltools.unl.UniversalWordNode;
 import fr.tetras_libre.unltools.unl.SubGraphReferenceNodeExtensions;
+import fr.tetras_libre.unltools.unl.UniversalWordNode;
 
 import static fr.tetras_libre.unltools.unl.exporters.rdf.Slugify.slugify;
 
diff --git a/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlGraphImporterFromUnlParser.java b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlGraphImporterFromUnlParser.java
new file mode 100644
index 0000000..f293807
--- /dev/null
+++ b/unl-tools-infrastructure/src/main/java/fr/tetras_libre/unltools/unl/parser/UnlGraphImporterFromUnlParser.java
@@ -0,0 +1,33 @@
+package fr.tetras_libre.unltools.unl.parser;
+
+import fr.tetras_libre.unltools.unl.GraphImporter;
+import fr.tetras_libre.unltools.unl.UnlDocument;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.List;
+
+public class UnlGraphImporterFromUnlParser implements GraphImporter {
+    private List<UnlDocument> documents;
+    private BufferedReader bufferedReader;
+
+    public UnlGraphImporterFromUnlParser(BufferedReader bufferedReader) {
+        this.bufferedReader = bufferedReader;
+    }
+
+    public static UnlGraphImporterFromUnlParser FromInputReader(InputStreamReader inputStreamReader) {
+        return new UnlGraphImporterFromUnlParser(new BufferedReader(inputStreamReader));
+    }
+
+    @Override
+    public List<UnlDocument> Import() {
+        if (documents == null) {
+            try {
+                documents = new UnlParser(this.bufferedReader).createUnlDocumentList();
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+        return documents;
+    }
+}
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/ApplicationStartupTest.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/ApplicationStartupTest.java
new file mode 100644
index 0000000..e03137e
--- /dev/null
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/ApplicationStartupTest.java
@@ -0,0 +1,49 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.Convert.ExportUnlDocuments;
+import fr.tetras_libre.unltools.Convert.ExportUnlDocumentsHandler;
+import fr.tetras_libre.unltools.cqrs.CommandHandlerResolver;
+import fr.tetras_libre.unltools.cqrs.Result;
+import fr.tetras_libre.unltools.unl.CatsUnl;
+import fr.tetras_libre.unltools.unl.exporters.GraphExporterNames;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.concurrent.atomic.AtomicReference;
+
+public class ApplicationStartupTest {
+
+    @Test
+    public void ApplicationShouldCreateSimpleHandlerWithoutException() {
+        var appService = ApplicationStartup.Initialize(CreateDefaultCommandResolver());
+        var testCommand = new TestCommand();
+        var handler = appService.getHandler(TestCommand.class);
+
+
+        AtomicReference<Result> resultAtomicReference = new AtomicReference<>();
+        Assertions.assertDoesNotThrow(() -> resultAtomicReference.set(handler.handle(testCommand)));
+        Assertions.assertSame(resultAtomicReference.get(), Result.Success());
+    }
+
+    @Test
+    public void ApplicationShouldCreateHandlerWithContructorInjectionWithoutException() throws IOException {
+        var appService = ApplicationStartup.Initialize(CreateDefaultCommandResolver());
+        var stringWriter = new StringWriter();
+        var exportCommand = new ExportUnlDocuments(new CatsUnl(), GraphExporterNames.DOT_EXPORTER, stringWriter);
+        var handler = appService.getHandler(ExportUnlDocuments.class);
+        AtomicReference<Result> resultAtomicReference = new AtomicReference<>();
+
+        Assertions.assertDoesNotThrow(() -> resultAtomicReference.set(handler.handle(exportCommand)));
+        Assertions.assertFalse(stringWriter.toString().isBlank());
+        stringWriter.close();
+    }
+
+    CommandHandlerResolver CreateDefaultCommandResolver() {
+        return new CommandHandlerResolverBuilder()
+                .addHandler(TestCommandHandler.class, TestCommand.class)
+                .addHandler(ExportUnlDocumentsHandler.class, ExportUnlDocuments.class)
+                .createCommandResolver();
+    }
+}
\ No newline at end of file
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommand.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommand.java
new file mode 100644
index 0000000..fc18c3f
--- /dev/null
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommand.java
@@ -0,0 +1,8 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.cqrs.Command;
+import fr.tetras_libre.unltools.cqrs.Result;
+
+public class TestCommand implements Command<Result> {
+
+}
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommandHandler.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommandHandler.java
new file mode 100644
index 0000000..6cfccd0
--- /dev/null
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/TestCommandHandler.java
@@ -0,0 +1,16 @@
+package fr.tetras_libre.unltools;
+
+import fr.tetras_libre.unltools.cqrs.CommandHandler;
+import fr.tetras_libre.unltools.cqrs.Result;
+
+public class TestCommandHandler implements CommandHandler<TestCommand, Result> {
+
+    public TestCommandHandler() {
+
+    }
+
+    @Override
+    public Result handle(TestCommand command) {
+        return Result.Success();
+    }
+}
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AbstractFlyweightUnlArgumentProvider.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AbstractFlyweightUnlArgumentProvider.java
index f09f058..b1569e8 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AbstractFlyweightUnlArgumentProvider.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AbstractFlyweightUnlArgumentProvider.java
@@ -4,7 +4,7 @@ import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
 
-public abstract class AbstractFlyweightUnlArgumentProvider extends AbstractUnlArgumentProvider {
+public abstract class AbstractFlyweightUnlArgumentProvider extends AbstractUnlArgumentProvider implements GraphImporter {
     private static final Dictionary<Class<?>, List<UnlDocument>> values = new Hashtable<>();
 
     protected abstract List<UnlDocument> buildUnlDocuments();
@@ -21,5 +21,7 @@ public abstract class AbstractFlyweightUnlArgumentProvider extends AbstractUnlAr
         return values.get(this.getClass());
     }
 
-
+    final public List<UnlDocument> Import() {
+        return getUnlDocuments();
+    }
 }
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AllUnl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AllUnl.java
index 106890e..43274be 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AllUnl.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/AllUnl.java
@@ -1,6 +1,5 @@
 package fr.tetras_libre.unltools.unl;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java
index d656209..951f79d 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/CatsUnl.java
@@ -2,7 +2,7 @@ package fr.tetras_libre.unltools.unl;
 
 import java.util.*;
 
-public class CatsUnl extends AbstractFlyweightUnlArgumentProvider {
+public class CatsUnl extends AbstractFlyweightUnlArgumentProvider implements GraphImporter {
     public static UnlDocumentNode buildSentenceNode() {
         var graph = new Graph();
 
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R1Unl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R1Unl.java
index 323ed47..8d8af44 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R1Unl.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R1Unl.java
@@ -1,21 +1,12 @@
 package fr.tetras_libre.unltools.unl;
 
-import java.util.*;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.TreeSet;
 
 public class R1Unl extends AbstractFlyweightUnlArgumentProvider {
 
-    @Override
-    final protected List<UnlDocument> buildUnlDocuments() {
-
-        var unlDocument = new UnlDocument("[D]");
-
-        UnlDocumentNode unlDocumentNode = buildSentenceNode();
-
-        unlDocument.add(unlDocumentNode);
-
-        return Collections.singletonList(unlDocument);
-    }
-
     public static UnlDocumentNode buildSentenceNode() {
         var graph = new Graph();
 
@@ -143,4 +134,16 @@ public class R1Unl extends AbstractFlyweightUnlArgumentProvider {
 
         return new UnlDocumentNode(UnlDocumentNodeType.Sentence, "[S:R1]", graph);
     }
+
+    @Override
+    final protected List<UnlDocument> buildUnlDocuments() {
+
+        var unlDocument = new UnlDocument("[D]");
+
+        UnlDocumentNode unlDocumentNode = buildSentenceNode();
+
+        unlDocument.add(unlDocumentNode);
+
+        return Collections.singletonList(unlDocument);
+    }
 }
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R2Unl.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R2Unl.java
index 7b0ad0d..78bf753 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R2Unl.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/R2Unl.java
@@ -4,18 +4,6 @@ import java.util.*;
 
 public class R2Unl extends AbstractFlyweightUnlArgumentProvider {
 
-    @Override
-    final protected List<UnlDocument> buildUnlDocuments() {
-
-        var unlDocument = new UnlDocument("[D]");
-
-        UnlDocumentNode unlDocumentNode = buildSentenceNode();
-
-        unlDocument.add(unlDocumentNode);
-
-        return Collections.singletonList(unlDocument);
-    }
-
     public static UnlDocumentNode buildSentenceNode() {
         var graph = new Graph();
 
@@ -142,4 +130,16 @@ public class R2Unl extends AbstractFlyweightUnlArgumentProvider {
 
         return new UnlDocumentNode(UnlDocumentNodeType.Sentence, "[S:R2]", graph);
     }
+
+    @Override
+    final protected List<UnlDocument> buildUnlDocuments() {
+
+        var unlDocument = new UnlDocument("[D]");
+
+        UnlDocumentNode unlDocumentNode = buildSentenceNode();
+
+        unlDocument.add(unlDocumentNode);
+
+        return Collections.singletonList(unlDocument);
+    }
 }
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/dot/SentenceWithExpectedDotArgumentProvider.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/dot/SentenceWithExpectedDotArgumentProvider.java
index 6245169..769aae6 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/dot/SentenceWithExpectedDotArgumentProvider.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/dot/SentenceWithExpectedDotArgumentProvider.java
@@ -1,9 +1,5 @@
 package fr.tetras_libre.unltools.unl.exporters.dot;
 
-import fr.tetras_libre.unltools.unl.exporters.dot.AllSetenceWithExpectedDotChecker;
-import fr.tetras_libre.unltools.unl.exporters.dot.CatSentenceWithExpectedDotChecker;
-import fr.tetras_libre.unltools.unl.exporters.dot.R1SentenceWithExpectedDotChecker;
-import fr.tetras_libre.unltools.unl.exporters.dot.R2SentenceWithExpectedDotChecker;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.ArgumentsProvider;
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverterTest.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverterTest.java
index 4a7c80f..a6d4200 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverterTest.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/exporters/rdf/RelationLabelToUnlPropertyConverterTest.java
@@ -1,7 +1,6 @@
 package fr.tetras_libre.unltools.unl.exporters.rdf;
 
 import org.apache.jena.ontology.ObjectProperty;
-import org.apache.jena.ontology.OntModel;
 import org.apache.jena.rdf.model.ModelFactory;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -11,14 +10,14 @@ import java.util.concurrent.atomic.AtomicReference;
 class RelationLabelToUnlPropertyConverterTest {
 
     @Test
-    public void getObjectPropertyShouldGiveAssociatedUNLressource(){
+    public void getObjectPropertyShouldGiveAssociatedUNLressource() {
         var relationLabelToUnlProperty = new RelationLabelToUnlPropertyConverter();
 
         Assertions.assertDoesNotThrow(() -> relationLabelToUnlProperty.getObjectProperty("aoj", null));
     }
 
     @Test
-    public void getObjectPropertyShouldNotThrowOnUnknownResource(){
+    public void getObjectPropertyShouldNotThrowOnUnknownResource() {
         AtomicReference<ObjectProperty> objectPropertyAtomicReference = new AtomicReference<>();
         var relationLabelToUnlProperty = new RelationLabelToUnlPropertyConverter();
         var unknownProperty = "dfadsfijoplknkjadfljgliukjelkjkdm";
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java
index 28dd3e0..7bc9410 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/UnlParserTest.java
@@ -4,7 +4,6 @@ import fr.tetras_libre.unltools.unl.UnlDocument;
 import fr.tetras_libre.unltools.unl.UnlSentences;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ArgumentsSources;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.jupiter.params.provider.ValueSource;
 
@@ -13,6 +12,13 @@ import java.util.stream.Stream;
 
 class UnlParserTest {
 
+    private static Stream<SentenceWithExpectedUnlDocumentsChecker> unlParserShouldParseSentenceAndGetExpectedUnlDocuments() {
+        return Stream.of(new R1SentenceWithExpectedUnlDocumentsChecker(),
+                new R2SentenceWithExpectedUnlDocumentsChecker(),
+                new CatsSentenceWithExpectedUnlDocumentsChecker(),
+                new AllSentenceWithExpectedUnlDocumentsChecker());
+    }
+
     @ParameterizedTest
     @ValueSource(strings = {UnlSentences.R1, UnlSentences.R2, UnlSentences.Cats, UnlSentences.All})
     void unlParserShouldParseSimpleSentenceWithoutException(String input) {
@@ -43,8 +49,6 @@ class UnlParserTest {
         return unlParser.get();
     }
 
-
-
     @ParameterizedTest
     @MethodSource
     void unlParserShouldParseSentenceAndGetExpectedUnlDocuments(SentenceWithExpectedUnlDocumentsChecker input) {
@@ -55,11 +59,4 @@ class UnlParserTest {
         input.assetSameAsExpected();
     }
 
-    private static Stream<SentenceWithExpectedUnlDocumentsChecker> unlParserShouldParseSentenceAndGetExpectedUnlDocuments(){
-        return Stream.of(new R1SentenceWithExpectedUnlDocumentsChecker(),
-                new R2SentenceWithExpectedUnlDocumentsChecker(),
-                new CatsSentenceWithExpectedUnlDocumentsChecker(),
-                new AllSentenceWithExpectedUnlDocumentsChecker());
-    }
-
 }
\ No newline at end of file
diff --git a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/WrapperUnlParser.java b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/WrapperUnlParser.java
index 97c487f..cd4cb33 100644
--- a/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/WrapperUnlParser.java
+++ b/unl-tools-infrastructure/src/test/java/fr/tetras_libre/unltools/unl/parser/WrapperUnlParser.java
@@ -17,6 +17,7 @@ public class WrapperUnlParser {
 
     /**
      * get UnlDocuments once the parsing is done
+     *
      * @return A list of UnlDocuments
      */
     public Vector<UnlDocument> getUnlDocumentList() {
@@ -68,6 +69,7 @@ public class WrapperUnlParser {
 
     /**
      * An error as occured during the parsing
+     *
      * @return true if an error occured, false otherwise
      */
     public boolean hasError() {
@@ -77,6 +79,7 @@ public class WrapperUnlParser {
 
     /**
      * Get errors of parsing
+     *
      * @return A vector of errors
      */
     public Vector<String> getErrors() {
diff --git a/unl-tools-infrastructure/unl-tools-infrastructure.iml b/unl-tools-infrastructure/unl-tools-infrastructure.iml
index 095605e..8b05d4f 100644
--- a/unl-tools-infrastructure/unl-tools-infrastructure.iml
+++ b/unl-tools-infrastructure/unl-tools-infrastructure.iml
@@ -46,6 +46,8 @@
     <orderEntry type="library" name="Maven: fr.tetras_libre.rdf:rdf-unl-java-vocabulary:1.0-SNAPSHOT" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.slf4j:slf4j-nop:1.7.30" level="project" />
     <orderEntry type="module" module-name="unl-tools-core" />
+    <orderEntry type="library" name="Maven: org.picocontainer:picocontainer:2.15" level="project" />
+    <orderEntry type="module" module-name="unl-tools-application" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.0-M1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.0-M1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
diff --git a/unl-tools-app/pom.xml b/unl-tools-main/pom.xml
similarity index 85%
rename from unl-tools-app/pom.xml
rename to unl-tools-main/pom.xml
index 450e947..e4b966e 100644
--- a/unl-tools-app/pom.xml
+++ b/unl-tools-main/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -10,7 +10,7 @@
         <version>1.0-SNAPSHOT</version>
     </parent>
 
-    <artifactId>unl-tools-app</artifactId>
+    <artifactId>unl-tools-main</artifactId>
 
     <packaging>jar</packaging>
 
@@ -66,13 +66,15 @@
                                 </excludes>
                             </artifactSet>
                             <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                     <ManifestEntries>
                                         <mainClass>unl2rdf.Unl2Rdf</mainClass>
                                         <Build-Number>1</Build-Number>
                                     </ManifestEntries>
                                 </transformer>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
                                 </transformer>
                             </transformers>
                             <relocations>
@@ -104,6 +106,12 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>fr.tetras_libre.unl</groupId>
+            <artifactId>unl-tools-application</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 
diff --git a/unl-tools-app/src/main/java/unl2rdf/Options.java b/unl-tools-main/src/main/java/unl2rdf/Options.java
similarity index 100%
rename from unl-tools-app/src/main/java/unl2rdf/Options.java
rename to unl-tools-main/src/main/java/unl2rdf/Options.java
diff --git a/unl-tools-app/src/main/java/unl2rdf/OutFileType.java b/unl-tools-main/src/main/java/unl2rdf/OutFileType.java
similarity index 100%
rename from unl-tools-app/src/main/java/unl2rdf/OutFileType.java
rename to unl-tools-main/src/main/java/unl2rdf/OutFileType.java
diff --git a/unl-tools-app/src/main/java/unl2rdf/Unl2Rdf.java b/unl-tools-main/src/main/java/unl2rdf/Unl2Rdf.java
similarity index 56%
rename from unl-tools-app/src/main/java/unl2rdf/Unl2Rdf.java
rename to unl-tools-main/src/main/java/unl2rdf/Unl2Rdf.java
index 2761d69..555b7e7 100644
--- a/unl-tools-app/src/main/java/unl2rdf/Unl2Rdf.java
+++ b/unl-tools-main/src/main/java/unl2rdf/Unl2Rdf.java
@@ -1,22 +1,21 @@
 package unl2rdf;
 
-import fr.tetras_libre.unltools.unl.GraphExporter;
-import fr.tetras_libre.unltools.unl.UnlDocument;
-import fr.tetras_libre.unltools.unl.exporters.DefaultGraphExporterFactory;
+import fr.tetras_libre.unltools.ApplicationStartup;
+import fr.tetras_libre.unltools.Convert.ExportUnlDocuments;
+import fr.tetras_libre.unltools.DefaultCommandHandlerResolverFactory;
+import fr.tetras_libre.unltools.cqrs.ServiceProvider;
 import fr.tetras_libre.unltools.unl.exporters.GraphExporterNames;
-import fr.tetras_libre.unltools.unl.parser.ParseException;
-import fr.tetras_libre.unltools.unl.parser.UnlParser;
+import fr.tetras_libre.unltools.unl.parser.UnlGraphImporterFromUnlParser;
 import picocli.CommandLine;
 
-import java.io.BufferedReader;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.util.Vector;
 
 public class Unl2Rdf {
 
-    private static DefaultGraphExporterFactory defaultGraphExporterFactory = new DefaultGraphExporterFactory();
-    public static void main(String[] args) throws IOException, ParseException {
+    private static ServiceProvider serviceProvider;
+
+    public static void main(String[] args) throws IOException {
 
         Options options = new Options();
 
@@ -24,6 +23,7 @@ public class Unl2Rdf {
             CommandLine.ParseResult parseResult = new CommandLine(options).parseArgs(args);
 
             if (!CommandLine.printHelpIfRequested(parseResult)) {
+                serviceProvider = ApplicationStartup.Initialize(DefaultCommandHandlerResolverFactory.create());
                 runProgram(options);
             }
         } catch (CommandLine.ParameterException e) {
@@ -32,17 +32,19 @@ public class Unl2Rdf {
         }
     }
 
-    private static void runProgram(Options options) throws ParseException, IOException {
+    private static void runProgram(Options options) throws IOException {
         System.out.println(String.format("Source file :  '%s'", options.getInputFile().getAbsolutePath()));
-        BufferedReader bufferedReader = new BufferedReader(options.getInputStream());
-        UnlParser parser = new UnlParser(bufferedReader);
-        Vector<UnlDocument> documents = parser.createUnlDocumentList();
+
+
+        var importer = UnlGraphImporterFromUnlParser.FromInputReader(options.getInputStream());
+        var handler = serviceProvider.getHandler(ExportUnlDocuments.class);
 
         for (OutFileType outType : options.getOutputFileType()) {
             String extension = ToExtension(outType);
             String outfileName = options.getOutputFile() + extension;
             FileWriter fileWriter = new FileWriter(outfileName, false);
-            GetExporter(outType, fileWriter).write(documents);
+            var convertCommand = new ExportUnlDocuments(importer, GetExporterName(outType), fileWriter);
+            handler.handle(convertCommand);
             fileWriter.close();
             System.out.println(String.format("Graph writen into file '%s'", outfileName));
         }
@@ -59,18 +61,16 @@ public class Unl2Rdf {
         throw new IllegalArgumentException(String.format("unknown fileType '%s", outFileType.toString()));
     }
 
-    private static GraphExporter GetExporter(OutFileType fileType, FileWriter writer) {
+    private static String GetExporterName(OutFileType fileType) {
         String exporterName = null;
         switch (fileType) {
             case rdf:
-                exporterName = GraphExporterNames.RDF_EXPORTER;
-                break;
+                return GraphExporterNames.RDF_EXPORTER;
             case dot:
-                exporterName = GraphExporterNames.DOT_EXPORTER;
-                break;
+                return GraphExporterNames.DOT_EXPORTER;
         }
 
-        return defaultGraphExporterFactory.createGraphExporter(writer, exporterName);
+        throw new IllegalArgumentException();
     }
 
 }
diff --git a/unl-tools-app/src/main/resources/META-INF/MANIFEST.MF b/unl-tools-main/src/main/resources/META-INF/MANIFEST.MF
similarity index 100%
rename from unl-tools-app/src/main/resources/META-INF/MANIFEST.MF
rename to unl-tools-main/src/main/resources/META-INF/MANIFEST.MF
diff --git a/unl-tools-app/src/test/java/unl2rdf/Unl2RdfTest.java b/unl-tools-main/src/test/java/unl2rdf/Unl2RdfTest.java
similarity index 92%
rename from unl-tools-app/src/test/java/unl2rdf/Unl2RdfTest.java
rename to unl-tools-main/src/test/java/unl2rdf/Unl2RdfTest.java
index b0d28da..4a9dfb9 100644
--- a/unl-tools-app/src/test/java/unl2rdf/Unl2RdfTest.java
+++ b/unl-tools-main/src/test/java/unl2rdf/Unl2RdfTest.java
@@ -22,25 +22,25 @@ class Unl2RdfTest {
 
     @Tag("integration")
     @Test
-    public void r1ShouldBeConvertedToRdfFile(){
+    public void r1ShouldBeConvertedToRdfFile() {
         Assertions.assertDoesNotThrow(() -> Unl2Rdf.main(new String[]{"--input-file", "../Examples/r1.txt", "--output-file", "r1", "--output-type", "rdf"}));
     }
 
     @Tag("integration")
     @Test
-    public void r2ShouldBeConvertedToRdfFile(){
+    public void r2ShouldBeConvertedToRdfFile() {
         Assertions.assertDoesNotThrow(() -> Unl2Rdf.main(new String[]{"--input-file", "../Examples/r2.txt", "--output-file", "r2", "--output-type", "rdf"}));
     }
 
     @Tag("integration")
     @Test
-    public void catShouldBeConvertedToRdfFile(){
+    public void catShouldBeConvertedToRdfFile() {
         Assertions.assertDoesNotThrow(() -> Unl2Rdf.main(new String[]{"--input-file", "../Examples/cat.txt", "--output-file", "cat", "--output-type", "rdf"}));
     }
 
     @Tag("integration")
     @Test
-    public void exemplesShouldBeConvertedToRdfFile(){
+    public void exemplesShouldBeConvertedToRdfFile() {
         Assertions.assertDoesNotThrow(() -> Unl2Rdf.main(new String[]{"--input-file", "../Examples/exemples_unl.txt", "--output-file", "exemples_unl", "--output-type", "rdf"}));
     }
 
diff --git a/unl-tools-app/unl-tools-app.iml b/unl-tools-main/unl-tools-main.iml
similarity index 97%
rename from unl-tools-app/unl-tools-app.iml
rename to unl-tools-main/unl-tools-main.iml
index f7b5b3c..a4c45eb 100644
--- a/unl-tools-app/unl-tools-app.iml
+++ b/unl-tools-main/unl-tools-main.iml
@@ -48,6 +48,8 @@
     <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
     <orderEntry type="library" name="Maven: fr.tetras_libre.rdf:rdf-unl-java-vocabulary:1.0-SNAPSHOT" level="project" />
     <orderEntry type="module" module-name="unl-tools-core" />
+    <orderEntry type="library" name="Maven: org.picocontainer:picocontainer:2.15" level="project" />
+    <orderEntry type="module" module-name="unl-tools-application" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.0-M1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.0-M1" level="project" />
     <orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
-- 
GitLab