From 9b3ac8da4d712f0db726bef48dacb5364737482f Mon Sep 17 00:00:00 2001
From: LB-C <lucas.bertrand-christen1@etu.univ-lorraine.fr>
Date: Fri, 24 Nov 2023 15:01:03 +0100
Subject: [PATCH] td5

---
 .idea/compiler.xml                            |  4 +-
 pom.xml                                       | 94 +++++++++++++-----
 .../filestore/api/dto/InputNodeDto.java       | 29 ------
 .../filestore/api/dto/OutputNodeDto.java      | 17 ----
 .../NodeNotFoundExceptionMapper.java          | 16 ---
 .../miage}/api/FilestoreApplication.java      |  2 +-
 .../miage}/api/dto/CollectionDto.java         |  2 +-
 .../miage}/api/dto/ErrorDto.java              |  2 +-
 .../miage/api/dto/InputNodeDto.java}          |  6 +-
 .../miage/api/dto/OutputNodeDto.java}         | 11 +--
 .../api/exception/ContentExceptionMapper.java |  8 +-
 .../IllegalArgumentExceptionMapper.java       |  2 +-
 .../NodeAlreadyExistsExceptionMapper.java     |  8 +-
 .../NodeNotEmptyExceptionMapper.java          |  9 +-
 .../NodeNotFoundExceptionMapper.java          |  8 +-
 .../exception/NodeTypeExceptionMapper.java    |  8 +-
 .../WebApplicationExceptionMapper.java        |  6 +-
 .../miage}/api/filter/VersionFilter.java      |  2 +-
 .../miage}/api/resources/NodesResource.java   | 47 +++------
 .../miage}/api/template/Template.java         |  2 +-
 .../api/template/TemplateBodyWriter.java      |  2 +-
 .../miage}/api/template/TemplateContent.java  |  2 +-
 .../miage}/api/template/TemplateHelper.java   |  2 +-
 .../miage}/api/validation/Filename.java       |  2 +-
 .../api/validation/ValidationPattern.java     |  2 +-
 .../miage}/auth/AuthenticationService.java    |  4 +-
 .../miage}/auth/entity/Profile.java           |  4 +-
 .../miage}/config/FilestoreConfig.java        |  2 +-
 .../miage}/config/FilestoreConfigBean.java    | 10 +-
 .../miage}/files/FileService.java             |  6 +-
 .../miage/files/FileServiceBean.java}         | 31 +++---
 .../miage}/files/entity/Node.java             |  5 +-
 .../miage}/files/entity/TypeNode.java         |  2 +-
 .../files/exceptions/ContentException.java    |  2 +-
 .../NodeAlreadyExistsException.java           |  2 +-
 .../exceptions/NodeNotEmptyException.java     |  2 +-
 .../exceptions/NodeNotFoundException.java     |  2 +-
 .../files/exceptions/NodeTypeException.java   |  2 +-
 .../fr/ul/miage/store/data/DataStore.java     | 17 ++++
 .../fr/ul/miage/store/data/DataStoreBean.java | 98 +++++++++++++++++++
 .../data/exception/DataNotFoundException.java |  6 ++
 .../data/exception/DataStoreException.java    | 11 +++
 .../miage/config/TestFilestoreConfigBean.java | 68 +++++++++++++
 .../java/fr/ul/miage/data/DataStoreTest.java  | 63 ++++++++++++
 src/test/resources/arquilian.xml              | 13 +++
 src/test/resources/test-beans.xml             |  8 ++
 46 files changed, 454 insertions(+), 197 deletions(-)
 delete mode 100644 src/main/java/fr/miage23/filestore/api/dto/InputNodeDto.java
 delete mode 100644 src/main/java/fr/miage23/filestore/api/dto/OutputNodeDto.java
 delete mode 100644 src/main/java/fr/miage23/filestore/api/exceptions/NodeNotFoundExceptionMapper.java
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/FilestoreApplication.java (87%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/dto/CollectionDto.java (95%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/dto/ErrorDto.java (97%)
 rename src/main/java/fr/{miage23/filestore/api/dto/NodeCreateDto.java => ul/miage/api/dto/InputNodeDto.java} (91%)
 rename src/main/java/fr/{miage23/filestore/api/dto/NodeDto.java => ul/miage/api/dto/OutputNodeDto.java} (90%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/exception/ContentExceptionMapper.java (76%)
 rename src/main/java/fr/{miage23/filestore/api/exceptions => ul/miage/api/exception}/IllegalArgumentExceptionMapper.java (90%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/exception/NodeAlreadyExistsExceptionMapper.java (76%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/exception/NodeNotEmptyExceptionMapper.java (71%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/exception/NodeNotFoundExceptionMapper.java (76%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/exception/NodeTypeExceptionMapper.java (76%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/exception/WebApplicationExceptionMapper.java (84%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/filter/VersionFilter.java (93%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/resources/NodesResource.java (77%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/template/Template.java (86%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/template/TemplateBodyWriter.java (98%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/template/TemplateContent.java (94%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/template/TemplateHelper.java (97%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/validation/Filename.java (93%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/api/validation/ValidationPattern.java (68%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/auth/AuthenticationService.java (70%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/auth/entity/Profile.java (94%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/config/FilestoreConfig.java (87%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/config/FilestoreConfigBean.java (95%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/files/FileService.java (86%)
 rename src/main/java/fr/{miage23/filestore/files/InMemoryFileServiceBean.java => ul/miage/files/FileServiceBean.java} (88%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/files/entity/Node.java (97%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/files/entity/TypeNode.java (51%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/files/exceptions/ContentException.java (82%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/files/exceptions/NodeAlreadyExistsException.java (76%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/files/exceptions/NodeNotEmptyException.java (74%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/files/exceptions/NodeNotFoundException.java (83%)
 rename src/main/java/fr/{miage23/filestore => ul/miage}/files/exceptions/NodeTypeException.java (73%)
 create mode 100644 src/main/java/fr/ul/miage/store/data/DataStore.java
 create mode 100644 src/main/java/fr/ul/miage/store/data/DataStoreBean.java
 create mode 100644 src/main/java/fr/ul/miage/store/data/exception/DataNotFoundException.java
 create mode 100644 src/main/java/fr/ul/miage/store/data/exception/DataStoreException.java
 create mode 100644 src/test/java/fr/ul/miage/config/TestFilestoreConfigBean.java
 create mode 100644 src/test/java/fr/ul/miage/data/DataStoreTest.java
 create mode 100644 src/test/resources/arquilian.xml
 create mode 100644 src/test/resources/test-beans.xml

diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index f1d745e..0cdf532 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -7,12 +7,14 @@
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
         <outputRelativeToContentRoot value="true" />
-        <module name="TD4" />
+        <module name="filestore" />
       </profile>
     </annotationProcessing>
     <bytecodeTargetLevel>
+      <module name="filestroe" target="17" />
       <module name="jayblanc" target="17" />
       <module name="td2" target="17" />
+      <module name="TD4" target="17" />
     </bytecodeTargetLevel>
   </component>
 </project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 1bb9b74..2796274 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,35 +3,23 @@
          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>
 
-    <groupId>fr.miage23.filestore</groupId>
-    <artifactId>jayblanc</artifactId>
+    <groupId>fr.ul.miage</groupId>
+    <artifactId>filestore</artifactId>
     <version>0.1-SNAPSHOT</version>
     <packaging>war</packaging>
 
     <name>The FileStore Application</name>
     <organization>
-        <name>Miage Nancy</name>
-        <url>http://www.miage-nancy.fr</url>
+        <name>IDMC</name>
+        <url>http://www.idmc.fr</url>
     </organization>
-    <developers>
-        <developer>
-            <id>jayblanc</id>
-            <name>Jerome Blanchard</name>
-            <email>jayblanc@gmail.com</email>
-            <url>http://wiki.jayblanc.fr</url>
-            <organization>Equasens</organization>
-            <organizationUrl>http://www.equasens.fr</organizationUrl>
-            <roles>
-                <role>developer</role>
-            </roles>
-            <timezone>Europe/Paris</timezone>
-        </developer>
-    </developers>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.report.sourceEncoding>UTF-8</project.report.sourceEncoding>
         <maven.compiler.release>17</maven.compiler.release>
+
+        <jboss.home>C:\Users\LB-C\Bureau\Logiciels\wildfly-29.0.1.Final</jboss.home>
         <jakartaee-api.version>10.0.0</jakartaee-api.version>
         <wildfly.version>30.0.0.Final</wildfly.version>
         <compiler-plugin.version>3.11.0</compiler-plugin.version>
@@ -40,9 +28,12 @@
 
         <version.wildfly-bom>30.0.0.Final</version.wildfly-bom>
         <version.tika>2.5.0</version.tika>
-        <version.apache-commons-io>2.11.0</version.apache-commons-io>
         <version.apache-commons-codec>1.15</version.apache-commons-codec>
         <version.freemarker>2.3.30</version.freemarker>
+
+        <version.junit>4.13.2</version.junit>
+        <version.arquillian>1.8.0.Final</version.arquillian>
+        <version.wildfly-arquillian>5.0.1.Final</version.wildfly-arquillian>
     </properties>
 
     <repositories>
@@ -67,9 +58,17 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
+            <dependency>
+                <groupId>org.jboss.arquillian</groupId>
+                <artifactId>arquillian-bom</artifactId>
+                <version>${version.arquillian}</version>
+                <scope>import</scope>
+                <type>pom</type>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
+
     <dependencies>
         <dependency>
             <groupId>jakarta.platform</groupId>
@@ -77,13 +76,11 @@
             <version>${jakartaee-api.version}</version>
             <scope>provided</scope>
         </dependency>
-
         <dependency>
             <groupId>org.jboss.resteasy</groupId>
             <artifactId>resteasy-multipart-provider</artifactId>
             <scope>provided</scope>
         </dependency>
-
         <dependency>
             <groupId>org.freemarker</groupId>
             <artifactId>freemarker</artifactId>
@@ -94,16 +91,59 @@
             <artifactId>commons-codec</artifactId>
             <version>${version.apache-commons-codec}</version>
         </dependency>
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>${version.apache-commons-io}</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.tika</groupId>
             <artifactId>tika-core</artifactId>
             <version>${version.tika}</version>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${version.junit}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.shrinkwrap</groupId>
+            <artifactId>shrinkwrap-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.shrinkwrap.resolver</groupId>
+            <artifactId>shrinkwrap-resolver-depchain</artifactId>
+            <type>pom</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.shrinkwrap</groupId>
+            <artifactId>shrinkwrap-impl-base</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.shrinkwrap</groupId>
+            <artifactId>shrinkwrap-spi</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.wildfly.arquillian</groupId>
+            <artifactId>wildfly-arquillian-common</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.arquillian.junit</groupId>
+            <artifactId>arquillian-junit-container</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.jboss.arquillian.protocol</groupId>
+            <artifactId>arquillian-protocol-servlet-jakarta</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.wildfly.arquillian</groupId>
+            <artifactId>wildfly-arquillian-container-managed</artifactId>
+            <version>${version.wildfly-arquillian}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -131,7 +171,7 @@
                 <configuration>
                     <version>${wildfly.version}</version>
                     <server-config>standalone-full.xml</server-config>
-                    <jbossHome>/opt/wildfly</jbossHome>
+                    <jbossHome>${jboss.home}</jbossHome>
                 </configuration>
             </plugin>
         </plugins>
diff --git a/src/main/java/fr/miage23/filestore/api/dto/InputNodeDto.java b/src/main/java/fr/miage23/filestore/api/dto/InputNodeDto.java
deleted file mode 100644
index b714528..0000000
--- a/src/main/java/fr/miage23/filestore/api/dto/InputNodeDto.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package fr.miage23.filestore.api.dto;
-
-import fr.miage23.filestore.api.validation.Filename;
-import jakarta.validation.constraints.Pattern;
-import jakarta.validation.constraints.Size;
-import jakarta.ws.rs.FormParam;
-import jakarta.ws.rs.core.MediaType;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.jboss.resteasy.annotations.providers.multipart.PartType;
-
-import java.io.InputStream;
-
-@Data
-@NoArgsConstructor // Default constructor needed for JAX-RS
-public class InputNodeDto {
-
-    @FormParam("name")
-    @PartType(MediaType.TEXT_PLAIN)
-    @Filename
-    private String name;
-    @FormParam("data")
-    @PartType(MediaType.APPLICATION_OCTET_STREAM)
-    private InputStream data = null;
-    @Size(max=2000000, message="content size is 2Mo max, for larger content use a multipart-form-data with data parameter")
-    private byte[] content;
-
-}
-
diff --git a/src/main/java/fr/miage23/filestore/api/dto/OutputNodeDto.java b/src/main/java/fr/miage23/filestore/api/dto/OutputNodeDto.java
deleted file mode 100644
index 2899cb3..0000000
--- a/src/main/java/fr/miage23/filestore/api/dto/OutputNodeDto.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package fr.miage23.filestore.api.dto;
-
-import fr.miage23.filestore.files.entity.TypeNode;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class OutputNodeDto {
-    private TypeNode type;
-    private String id;
-    private String parent;
-    private String name;
-    private long size;
-    private long creation;
-    private long modification;
-}
diff --git a/src/main/java/fr/miage23/filestore/api/exceptions/NodeNotFoundExceptionMapper.java b/src/main/java/fr/miage23/filestore/api/exceptions/NodeNotFoundExceptionMapper.java
deleted file mode 100644
index 09ca011..0000000
--- a/src/main/java/fr/miage23/filestore/api/exceptions/NodeNotFoundExceptionMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package fr.miage23.filestore.api.exceptions;
-
-import fr.miage23.filestore.files.exceptions.NodeNotFoundException;
-import jakarta.ws.rs.core.Response;
-import jakarta.ws.rs.ext.ExceptionMapper;
-import jakarta.ws.rs.ext.Provider;
-
-@Provider
-public class NodeNotFoundExceptionMapper implements ExceptionMapper<NodeNotFoundException> {
-
-    @Override
-    public Response toResponse(NodeNotFoundException e) {
-        return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
-    }
-}
-
diff --git a/src/main/java/fr/miage23/filestore/api/FilestoreApplication.java b/src/main/java/fr/ul/miage/api/FilestoreApplication.java
similarity index 87%
rename from src/main/java/fr/miage23/filestore/api/FilestoreApplication.java
rename to src/main/java/fr/ul/miage/api/FilestoreApplication.java
index ecd8bf0..a78169b 100644
--- a/src/main/java/fr/miage23/filestore/api/FilestoreApplication.java
+++ b/src/main/java/fr/ul/miage/api/FilestoreApplication.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api;
+package fr.ul.miage.api;
 
 import jakarta.servlet.annotation.MultipartConfig;
 import jakarta.ws.rs.ApplicationPath;
diff --git a/src/main/java/fr/miage23/filestore/api/dto/CollectionDto.java b/src/main/java/fr/ul/miage/api/dto/CollectionDto.java
similarity index 95%
rename from src/main/java/fr/miage23/filestore/api/dto/CollectionDto.java
rename to src/main/java/fr/ul/miage/api/dto/CollectionDto.java
index a5a304e..ded7c1c 100644
--- a/src/main/java/fr/miage23/filestore/api/dto/CollectionDto.java
+++ b/src/main/java/fr/ul/miage/api/dto/CollectionDto.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.dto;
+package fr.ul.miage.api.dto;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/main/java/fr/miage23/filestore/api/dto/ErrorDto.java b/src/main/java/fr/ul/miage/api/dto/ErrorDto.java
similarity index 97%
rename from src/main/java/fr/miage23/filestore/api/dto/ErrorDto.java
rename to src/main/java/fr/ul/miage/api/dto/ErrorDto.java
index ff7c964..f215c4c 100644
--- a/src/main/java/fr/miage23/filestore/api/dto/ErrorDto.java
+++ b/src/main/java/fr/ul/miage/api/dto/ErrorDto.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.dto;
+package fr.ul.miage.api.dto;
 
 import java.util.UUID;
 
diff --git a/src/main/java/fr/miage23/filestore/api/dto/NodeCreateDto.java b/src/main/java/fr/ul/miage/api/dto/InputNodeDto.java
similarity index 91%
rename from src/main/java/fr/miage23/filestore/api/dto/NodeCreateDto.java
rename to src/main/java/fr/ul/miage/api/dto/InputNodeDto.java
index 1f2ec41..4447ef4 100644
--- a/src/main/java/fr/miage23/filestore/api/dto/NodeCreateDto.java
+++ b/src/main/java/fr/ul/miage/api/dto/InputNodeDto.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.dto;
+package fr.ul.miage.api.dto;
 
 import jakarta.validation.constraints.Pattern;
 import jakarta.validation.constraints.Size;
@@ -8,7 +8,7 @@ import org.jboss.resteasy.annotations.providers.multipart.PartType;
 
 import java.io.InputStream;
 
-public class NodeCreateDto {
+public class InputNodeDto {
 
     @FormParam("name")
     @PartType(MediaType.TEXT_PLAIN)
@@ -20,7 +20,7 @@ public class NodeCreateDto {
     @Size(max=2000000, message="content size is 2Mo max, for larger content use a multipart-form-data with data parameter")
     private byte[] content;
 
-    public NodeCreateDto() {
+    public InputNodeDto() {
     }
 
     public String getName() {
diff --git a/src/main/java/fr/miage23/filestore/api/dto/NodeDto.java b/src/main/java/fr/ul/miage/api/dto/OutputNodeDto.java
similarity index 90%
rename from src/main/java/fr/miage23/filestore/api/dto/NodeDto.java
rename to src/main/java/fr/ul/miage/api/dto/OutputNodeDto.java
index 575e990..33b81ec 100644
--- a/src/main/java/fr/miage23/filestore/api/dto/NodeDto.java
+++ b/src/main/java/fr/ul/miage/api/dto/OutputNodeDto.java
@@ -1,11 +1,8 @@
-package fr.miage23.filestore.api.dto;
+package fr.ul.miage.api.dto;
 
-import fr.miage23.filestore.files.entity.Node;
+import fr.ul.miage.files.entity.Node;
 
-import java.util.ArrayList;
-import java.util.List;
-
-public class NodeDto {
+public class OutputNodeDto {
 
     private Node.Type type;
     private String id;
@@ -16,7 +13,7 @@ public class NodeDto {
     private long creation;
     private long modification;
 
-    public NodeDto() {
+    public OutputNodeDto() {
     }
 
     public void setNode(Node node) {
diff --git a/src/main/java/fr/miage23/filestore/api/exception/ContentExceptionMapper.java b/src/main/java/fr/ul/miage/api/exception/ContentExceptionMapper.java
similarity index 76%
rename from src/main/java/fr/miage23/filestore/api/exception/ContentExceptionMapper.java
rename to src/main/java/fr/ul/miage/api/exception/ContentExceptionMapper.java
index 06681ea..a3b6402 100644
--- a/src/main/java/fr/miage23/filestore/api/exception/ContentExceptionMapper.java
+++ b/src/main/java/fr/ul/miage/api/exception/ContentExceptionMapper.java
@@ -1,8 +1,8 @@
-package fr.miage23.filestore.api.exception;
+package fr.ul.miage.api.exception;
 
-import fr.miage23.filestore.api.FilestoreApplication;
-import fr.miage23.filestore.api.dto.ErrorDto;
-import fr.miage23.filestore.files.exceptions.ContentException;
+import fr.ul.miage.api.FilestoreApplication;
+import fr.ul.miage.api.dto.ErrorDto;
+import fr.ul.miage.files.exceptions.ContentException;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.ext.ExceptionMapper;
 import jakarta.ws.rs.ext.Provider;
diff --git a/src/main/java/fr/miage23/filestore/api/exceptions/IllegalArgumentExceptionMapper.java b/src/main/java/fr/ul/miage/api/exception/IllegalArgumentExceptionMapper.java
similarity index 90%
rename from src/main/java/fr/miage23/filestore/api/exceptions/IllegalArgumentExceptionMapper.java
rename to src/main/java/fr/ul/miage/api/exception/IllegalArgumentExceptionMapper.java
index 4e5e9ce..149e820 100644
--- a/src/main/java/fr/miage23/filestore/api/exceptions/IllegalArgumentExceptionMapper.java
+++ b/src/main/java/fr/ul/miage/api/exception/IllegalArgumentExceptionMapper.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.exceptions;
+package fr.ul.miage.api.exception;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.ext.ExceptionMapper;
 import jakarta.ws.rs.ext.Provider;
diff --git a/src/main/java/fr/miage23/filestore/api/exception/NodeAlreadyExistsExceptionMapper.java b/src/main/java/fr/ul/miage/api/exception/NodeAlreadyExistsExceptionMapper.java
similarity index 76%
rename from src/main/java/fr/miage23/filestore/api/exception/NodeAlreadyExistsExceptionMapper.java
rename to src/main/java/fr/ul/miage/api/exception/NodeAlreadyExistsExceptionMapper.java
index d082e1f..61e51f1 100644
--- a/src/main/java/fr/miage23/filestore/api/exception/NodeAlreadyExistsExceptionMapper.java
+++ b/src/main/java/fr/ul/miage/api/exception/NodeAlreadyExistsExceptionMapper.java
@@ -1,8 +1,8 @@
-package fr.miage23.filestore.api.exception;
+package fr.ul.miage.api.exception;
 
-import fr.miage23.filestore.api.FilestoreApplication;
-import fr.miage23.filestore.api.dto.ErrorDto;
-import fr.miage23.filestore.files.exceptions.NodeAlreadyExistsException;
+import fr.ul.miage.api.FilestoreApplication;
+import fr.ul.miage.api.dto.ErrorDto;
+import fr.ul.miage.files.exceptions.NodeAlreadyExistsException;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.ext.ExceptionMapper;
 import jakarta.ws.rs.ext.Provider;
diff --git a/src/main/java/fr/miage23/filestore/api/exception/NodeNotEmptyExceptionMapper.java b/src/main/java/fr/ul/miage/api/exception/NodeNotEmptyExceptionMapper.java
similarity index 71%
rename from src/main/java/fr/miage23/filestore/api/exception/NodeNotEmptyExceptionMapper.java
rename to src/main/java/fr/ul/miage/api/exception/NodeNotEmptyExceptionMapper.java
index 86e1b85..ea7b0e4 100644
--- a/src/main/java/fr/miage23/filestore/api/exception/NodeNotEmptyExceptionMapper.java
+++ b/src/main/java/fr/ul/miage/api/exception/NodeNotEmptyExceptionMapper.java
@@ -1,9 +1,8 @@
-package fr.miage23.filestore.api.exception;
+package fr.ul.miage.api.exception;
 
-import fr.miage23.filestore.api.FilestoreApplication;
-import fr.miage23.filestore.api.dto.ErrorDto;
-import fr.miage23.filestore.files.exceptions.NodeNotEmptyException;
-import fr.miage23.filestore.files.exceptions.NodeNotFoundException;
+import fr.ul.miage.api.FilestoreApplication;
+import fr.ul.miage.api.dto.ErrorDto;
+import fr.ul.miage.files.exceptions.NodeNotEmptyException;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.ext.ExceptionMapper;
 import jakarta.ws.rs.ext.Provider;
diff --git a/src/main/java/fr/miage23/filestore/api/exception/NodeNotFoundExceptionMapper.java b/src/main/java/fr/ul/miage/api/exception/NodeNotFoundExceptionMapper.java
similarity index 76%
rename from src/main/java/fr/miage23/filestore/api/exception/NodeNotFoundExceptionMapper.java
rename to src/main/java/fr/ul/miage/api/exception/NodeNotFoundExceptionMapper.java
index 746050c..bb3de88 100644
--- a/src/main/java/fr/miage23/filestore/api/exception/NodeNotFoundExceptionMapper.java
+++ b/src/main/java/fr/ul/miage/api/exception/NodeNotFoundExceptionMapper.java
@@ -1,8 +1,8 @@
-package fr.miage23.filestore.api.exception;
+package fr.ul.miage.api.exception;
 
-import fr.miage23.filestore.api.FilestoreApplication;
-import fr.miage23.filestore.api.dto.ErrorDto;
-import fr.miage23.filestore.files.exceptions.NodeNotFoundException;
+import fr.ul.miage.api.FilestoreApplication;
+import fr.ul.miage.api.dto.ErrorDto;
+import fr.ul.miage.files.exceptions.NodeNotFoundException;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.ext.ExceptionMapper;
 import jakarta.ws.rs.ext.Provider;
diff --git a/src/main/java/fr/miage23/filestore/api/exception/NodeTypeExceptionMapper.java b/src/main/java/fr/ul/miage/api/exception/NodeTypeExceptionMapper.java
similarity index 76%
rename from src/main/java/fr/miage23/filestore/api/exception/NodeTypeExceptionMapper.java
rename to src/main/java/fr/ul/miage/api/exception/NodeTypeExceptionMapper.java
index 5efdf17..0f4a95e 100644
--- a/src/main/java/fr/miage23/filestore/api/exception/NodeTypeExceptionMapper.java
+++ b/src/main/java/fr/ul/miage/api/exception/NodeTypeExceptionMapper.java
@@ -1,8 +1,8 @@
-package fr.miage23.filestore.api.exception;
+package fr.ul.miage.api.exception;
 
-import fr.miage23.filestore.api.FilestoreApplication;
-import fr.miage23.filestore.api.dto.ErrorDto;
-import fr.miage23.filestore.files.exceptions.NodeTypeException;
+import fr.ul.miage.api.FilestoreApplication;
+import fr.ul.miage.api.dto.ErrorDto;
+import fr.ul.miage.files.exceptions.NodeTypeException;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.ext.ExceptionMapper;
 import jakarta.ws.rs.ext.Provider;
diff --git a/src/main/java/fr/miage23/filestore/api/exception/WebApplicationExceptionMapper.java b/src/main/java/fr/ul/miage/api/exception/WebApplicationExceptionMapper.java
similarity index 84%
rename from src/main/java/fr/miage23/filestore/api/exception/WebApplicationExceptionMapper.java
rename to src/main/java/fr/ul/miage/api/exception/WebApplicationExceptionMapper.java
index 65847bd..6a06829 100644
--- a/src/main/java/fr/miage23/filestore/api/exception/WebApplicationExceptionMapper.java
+++ b/src/main/java/fr/ul/miage/api/exception/WebApplicationExceptionMapper.java
@@ -1,7 +1,7 @@
-package fr.miage23.filestore.api.exception;
+package fr.ul.miage.api.exception;
 
-import fr.miage23.filestore.api.FilestoreApplication;
-import fr.miage23.filestore.api.dto.ErrorDto;
+import fr.ul.miage.api.FilestoreApplication;
+import fr.ul.miage.api.dto.ErrorDto;
 import jakarta.ws.rs.WebApplicationException;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.ext.ExceptionMapper;
diff --git a/src/main/java/fr/miage23/filestore/api/filter/VersionFilter.java b/src/main/java/fr/ul/miage/api/filter/VersionFilter.java
similarity index 93%
rename from src/main/java/fr/miage23/filestore/api/filter/VersionFilter.java
rename to src/main/java/fr/ul/miage/api/filter/VersionFilter.java
index 92bb753..ab3342d 100644
--- a/src/main/java/fr/miage23/filestore/api/filter/VersionFilter.java
+++ b/src/main/java/fr/ul/miage/api/filter/VersionFilter.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.filter;
+package fr.ul.miage.api.filter;
 
 import jakarta.ws.rs.container.ContainerRequestContext;
 import jakarta.ws.rs.container.ContainerResponseContext;
diff --git a/src/main/java/fr/miage23/filestore/api/resources/NodesResource.java b/src/main/java/fr/ul/miage/api/resources/NodesResource.java
similarity index 77%
rename from src/main/java/fr/miage23/filestore/api/resources/NodesResource.java
rename to src/main/java/fr/ul/miage/api/resources/NodesResource.java
index e54397d..87880ff 100644
--- a/src/main/java/fr/miage23/filestore/api/resources/NodesResource.java
+++ b/src/main/java/fr/ul/miage/api/resources/NodesResource.java
@@ -1,15 +1,15 @@
-package fr.miage23.filestore.api.resources;
-
-import fr.miage23.filestore.api.dto.CollectionDto;
-import fr.miage23.filestore.api.dto.NodeCreateDto;
-import fr.miage23.filestore.api.template.Template;
-import fr.miage23.filestore.api.template.TemplateContent;
-import fr.miage23.filestore.auth.entity.Profile;
-import fr.miage23.filestore.config.FilestoreConfig;
-import fr.miage23.filestore.files.FileService;
-import fr.miage23.filestore.files.InMemoryFileServiceBean;
-import fr.miage23.filestore.files.entity.Node;
-import fr.miage23.filestore.files.exceptions.*;
+package fr.ul.miage.api.resources;
+
+import fr.ul.miage.api.dto.CollectionDto;
+import fr.ul.miage.api.dto.InputNodeDto;
+import fr.ul.miage.api.template.Template;
+import fr.ul.miage.api.template.TemplateContent;
+import fr.ul.miage.auth.entity.Profile;
+import fr.ul.miage.config.FilestoreConfig;
+import fr.ul.miage.files.FileService;
+import fr.ul.miage.files.FileServiceBean;
+import fr.ul.miage.files.entity.Node;
+import fr.ul.miage.files.exceptions.*;
 import jakarta.inject.Inject;
 import jakarta.validation.Valid;
 import jakarta.ws.rs.*;
@@ -32,7 +32,7 @@ public class NodesResource {
 
     private static final Logger LOGGER = Logger.getLogger(NodesResource.class.getName());
 
-    private FileService service = InMemoryFileServiceBean.getInstance();
+    private FileService service = FileServiceBean.getInstance();
     @Inject
     private FilestoreConfig config;
 
@@ -112,7 +112,7 @@ public class NodesResource {
     @Path("{id}")
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
-    public Response create(@PathParam("id") final String id, @Valid NodeCreateDto dto, @Context UriInfo info) throws NodeNotFoundException, NodeTypeException, NodeAlreadyExistsException, ContentException {
+    public Response create(@PathParam("id") final String id, @Valid InputNodeDto dto, @Context UriInfo info) throws NodeNotFoundException, NodeTypeException, NodeAlreadyExistsException, ContentException {
         LOGGER.log(Level.INFO, "POST /api/nodes/" + id);
         String nid;
         if (dto.getContent() != null) {
@@ -128,7 +128,7 @@ public class NodesResource {
     @Path("{id}")
     @Produces(MediaType.TEXT_HTML)
     @Consumes(MediaType.MULTIPART_FORM_DATA)
-    public Response createView(@PathParam("id") final String id, @MultipartForm @Valid NodeCreateDto dto, @Context UriInfo info) throws NodeNotFoundException, NodeTypeException, NodeAlreadyExistsException, ContentException, IOException {
+    public Response createView(@PathParam("id") final String id, @MultipartForm @Valid InputNodeDto dto, @Context UriInfo info) throws NodeNotFoundException, NodeTypeException, NodeAlreadyExistsException, ContentException, IOException {
         LOGGER.log(Level.INFO, "POST /api/nodes/" + id + " (html)");
         if (dto.getData() != null) {
             service.add(id, dto.getName(), dto.getData());
@@ -139,23 +139,6 @@ public class NodesResource {
         return Response.seeOther(createdUri).build();
     }
 
-    /*
-    @POST
-    @Path("{id}")
-    @Produces(MediaType.TEXT_HTML)
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    public Response createView(@PathParam("id") final String id, @FormParam("name") EntityPart name, @FormParam("data") EntityPart data, @Context UriInfo info) throws NodeNotFoundException, NodeTypeException, NodeAlreadyExistsException, ContentException, IOException {
-        LOGGER.log(Level.INFO, "POST /api/nodes/" + id + " (html)");
-        if (data != null) {
-            service.add(id, name.getContent(String.class), data.getContent());
-        } else {
-            service.add(id, name.getContent(String.class));
-        }
-        URI createdUri = info.getBaseUriBuilder().path(NodesResource.class).path(id).path("content").build();
-        return Response.seeOther(createdUri).build();
-    }
-     */
-
     @PUT
     @Path("{id}/{name}")
     @Produces(MediaType.APPLICATION_JSON)
diff --git a/src/main/java/fr/miage23/filestore/api/template/Template.java b/src/main/java/fr/ul/miage/api/template/Template.java
similarity index 86%
rename from src/main/java/fr/miage23/filestore/api/template/Template.java
rename to src/main/java/fr/ul/miage/api/template/Template.java
index 3458727..e506592 100644
--- a/src/main/java/fr/miage23/filestore/api/template/Template.java
+++ b/src/main/java/fr/ul/miage/api/template/Template.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.template;
+package fr.ul.miage.api.template;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/src/main/java/fr/miage23/filestore/api/template/TemplateBodyWriter.java b/src/main/java/fr/ul/miage/api/template/TemplateBodyWriter.java
similarity index 98%
rename from src/main/java/fr/miage23/filestore/api/template/TemplateBodyWriter.java
rename to src/main/java/fr/ul/miage/api/template/TemplateBodyWriter.java
index 4d57223..d67e2c8 100644
--- a/src/main/java/fr/miage23/filestore/api/template/TemplateBodyWriter.java
+++ b/src/main/java/fr/ul/miage/api/template/TemplateBodyWriter.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.template;
+package fr.ul.miage.api.template;
 
 import freemarker.template.Configuration;
 import freemarker.template.TemplateException;
diff --git a/src/main/java/fr/miage23/filestore/api/template/TemplateContent.java b/src/main/java/fr/ul/miage/api/template/TemplateContent.java
similarity index 94%
rename from src/main/java/fr/miage23/filestore/api/template/TemplateContent.java
rename to src/main/java/fr/ul/miage/api/template/TemplateContent.java
index fc772a4..a409b94 100644
--- a/src/main/java/fr/miage23/filestore/api/template/TemplateContent.java
+++ b/src/main/java/fr/ul/miage/api/template/TemplateContent.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.template;
+package fr.ul.miage.api.template;
 
 public class TemplateContent<T> {
 
diff --git a/src/main/java/fr/miage23/filestore/api/template/TemplateHelper.java b/src/main/java/fr/ul/miage/api/template/TemplateHelper.java
similarity index 97%
rename from src/main/java/fr/miage23/filestore/api/template/TemplateHelper.java
rename to src/main/java/fr/ul/miage/api/template/TemplateHelper.java
index eda68ae..e46aa6a 100644
--- a/src/main/java/fr/miage23/filestore/api/template/TemplateHelper.java
+++ b/src/main/java/fr/ul/miage/api/template/TemplateHelper.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.template;
+package fr.ul.miage.api.template;
 
 public class TemplateHelper {
 
diff --git a/src/main/java/fr/miage23/filestore/api/validation/Filename.java b/src/main/java/fr/ul/miage/api/validation/Filename.java
similarity index 93%
rename from src/main/java/fr/miage23/filestore/api/validation/Filename.java
rename to src/main/java/fr/ul/miage/api/validation/Filename.java
index 74a4ac7..ab65e73 100644
--- a/src/main/java/fr/miage23/filestore/api/validation/Filename.java
+++ b/src/main/java/fr/ul/miage/api/validation/Filename.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.validation;
+package fr.ul.miage.api.validation;
 
 import jakarta.validation.Constraint;
 import jakarta.validation.Payload;
diff --git a/src/main/java/fr/miage23/filestore/api/validation/ValidationPattern.java b/src/main/java/fr/ul/miage/api/validation/ValidationPattern.java
similarity index 68%
rename from src/main/java/fr/miage23/filestore/api/validation/ValidationPattern.java
rename to src/main/java/fr/ul/miage/api/validation/ValidationPattern.java
index 2802ef6..a50bc92 100644
--- a/src/main/java/fr/miage23/filestore/api/validation/ValidationPattern.java
+++ b/src/main/java/fr/ul/miage/api/validation/ValidationPattern.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.api.validation;
+package fr.ul.miage.api.validation;
 
 public class ValidationPattern {
 
diff --git a/src/main/java/fr/miage23/filestore/auth/AuthenticationService.java b/src/main/java/fr/ul/miage/auth/AuthenticationService.java
similarity index 70%
rename from src/main/java/fr/miage23/filestore/auth/AuthenticationService.java
rename to src/main/java/fr/ul/miage/auth/AuthenticationService.java
index 9330f03..711a407 100644
--- a/src/main/java/fr/miage23/filestore/auth/AuthenticationService.java
+++ b/src/main/java/fr/ul/miage/auth/AuthenticationService.java
@@ -1,6 +1,6 @@
-package fr.miage23.filestore.auth;
+package fr.ul.miage.auth;
 
-import fr.miage23.filestore.auth.entity.Profile;
+import fr.ul.miage.auth.entity.Profile;
 
 public interface AuthenticationService {
 
diff --git a/src/main/java/fr/miage23/filestore/auth/entity/Profile.java b/src/main/java/fr/ul/miage/auth/entity/Profile.java
similarity index 94%
rename from src/main/java/fr/miage23/filestore/auth/entity/Profile.java
rename to src/main/java/fr/ul/miage/auth/entity/Profile.java
index 030ce55..05912c8 100644
--- a/src/main/java/fr/miage23/filestore/auth/entity/Profile.java
+++ b/src/main/java/fr/ul/miage/auth/entity/Profile.java
@@ -1,6 +1,6 @@
-package fr.miage23.filestore.auth.entity;
+package fr.ul.miage.auth.entity;
 
-import fr.miage23.filestore.auth.AuthenticationService;
+import fr.ul.miage.auth.AuthenticationService;
 import org.apache.commons.codec.digest.DigestUtils;
 
 public class Profile {
diff --git a/src/main/java/fr/miage23/filestore/config/FilestoreConfig.java b/src/main/java/fr/ul/miage/config/FilestoreConfig.java
similarity index 87%
rename from src/main/java/fr/miage23/filestore/config/FilestoreConfig.java
rename to src/main/java/fr/ul/miage/config/FilestoreConfig.java
index bf4e7ca..6bfbded 100644
--- a/src/main/java/fr/miage23/filestore/config/FilestoreConfig.java
+++ b/src/main/java/fr/ul/miage/config/FilestoreConfig.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.config;
+package fr.ul.miage.config;
 
 import java.nio.file.Path;
 
diff --git a/src/main/java/fr/miage23/filestore/config/FilestoreConfigBean.java b/src/main/java/fr/ul/miage/config/FilestoreConfigBean.java
similarity index 95%
rename from src/main/java/fr/miage23/filestore/config/FilestoreConfigBean.java
rename to src/main/java/fr/ul/miage/config/FilestoreConfigBean.java
index d5f23fc..11cb38e 100644
--- a/src/main/java/fr/miage23/filestore/config/FilestoreConfigBean.java
+++ b/src/main/java/fr/ul/miage/config/FilestoreConfigBean.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.config;
+package fr.ul.miage.config;
 
 import jakarta.annotation.PostConstruct;
 import jakarta.enterprise.context.ApplicationScoped;
@@ -116,4 +116,12 @@ public class FilestoreConfigBean implements FilestoreConfig {
     private static String camelToProp(String var) {
         return var.replaceAll("([a-z])([A-Z]+)", "$1.$2").toLowerCase();
     }
+
+    public Path getHome() {
+        return home;
+    }
+
+    public void setHome(Path home) {
+        this.home = home;
+    }
 }
diff --git a/src/main/java/fr/miage23/filestore/files/FileService.java b/src/main/java/fr/ul/miage/files/FileService.java
similarity index 86%
rename from src/main/java/fr/miage23/filestore/files/FileService.java
rename to src/main/java/fr/ul/miage/files/FileService.java
index 1335466..0e2859e 100644
--- a/src/main/java/fr/miage23/filestore/files/FileService.java
+++ b/src/main/java/fr/ul/miage/files/FileService.java
@@ -1,7 +1,7 @@
-package fr.miage23.filestore.files;
+package fr.ul.miage.files;
 
-import fr.miage23.filestore.files.entity.Node;
-import fr.miage23.filestore.files.exceptions.*;
+import fr.ul.miage.files.entity.Node;
+import fr.ul.miage.files.exceptions.*;
 
 import java.io.InputStream;
 import java.util.List;
diff --git a/src/main/java/fr/miage23/filestore/files/InMemoryFileServiceBean.java b/src/main/java/fr/ul/miage/files/FileServiceBean.java
similarity index 88%
rename from src/main/java/fr/miage23/filestore/files/InMemoryFileServiceBean.java
rename to src/main/java/fr/ul/miage/files/FileServiceBean.java
index cb29ee6..8192ff4 100644
--- a/src/main/java/fr/miage23/filestore/files/InMemoryFileServiceBean.java
+++ b/src/main/java/fr/ul/miage/files/FileServiceBean.java
@@ -1,7 +1,9 @@
-package fr.miage23.filestore.files;
+package fr.ul.miage.files;
 
-import fr.miage23.filestore.files.entity.Node;
-import fr.miage23.filestore.files.exceptions.*;
+import fr.ul.miage.files.entity.Node;
+import fr.ul.miage.files.exceptions.*;
+import jakarta.ws.rs.core.MediaType;
+import org.apache.tika.Tika;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -12,25 +14,24 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
 
-public class InMemoryFileServiceBean implements FileService {
+public class FileServiceBean implements FileService {
 
-    private static final Logger LOGGER = Logger.getLogger(InMemoryFileServiceBean.class.getName());
+    private static final Logger LOGGER = Logger.getLogger(FileServiceBean.class.getName());
 
-    private static Map<String, Node> nodes;
-    private static Map<String, byte[]> contents;
+    private static Map<String, Node> nodes = new ConcurrentHashMap<>();
+    private static Map<String, byte[]> contents = new HashMap<>();
+    private static Tika tika = new Tika();
 
     private static final class InstanceHolder {
-        private static final FileService instance = new InMemoryFileServiceBean();
+        private static final FileService instance = new FileServiceBean();
     }
 
     public static FileService getInstance(){
         return InstanceHolder.instance;
     }
 
-    private InMemoryFileServiceBean() {
+    private FileServiceBean() {
         LOGGER.log(Level.INFO, "Instantiating file service bean");
-        contents = new HashMap<>();
-        nodes = new ConcurrentHashMap<>();
         Node root = new Node(Node.Type.TREE, "", ROOT_NODE_ID, "root");
         nodes.put(root.getId(), root);
     }
@@ -124,13 +125,19 @@ public class InMemoryFileServiceBean implements FileService {
         if (nodes.values().stream().filter(n -> n.getParent().equals(pid)).anyMatch(n -> n.getName().equals(name))) {
             throw new NodeAlreadyExistsException("A node with name: " + name + " already exists in tree with id: " + pid);
         }
+        String mimetype = MediaType.APPLICATION_OCTET_STREAM;
+        try {
+            mimetype = tika.detect(content, name);
+        } catch (IOException e) {
+            throw new ContentException("unable to read file content", e);
+        }
         String cid = UUID.randomUUID().toString();
         try {
             contents.put(cid, content.readAllBytes());
             Node node = new Node(Node.Type.BLOB, pid, UUID.randomUUID().toString(), name);
             node.setContent(cid);
             node.setSize(contents.get(cid).length);
-            node.setMimetype("application/octet-stream");
+            node.setMimetype(mimetype);
             nodes.put(node.getId(), node);
             pnode.setSize(pnode.getSize()+1);
             return node.getId();
diff --git a/src/main/java/fr/miage23/filestore/files/entity/Node.java b/src/main/java/fr/ul/miage/files/entity/Node.java
similarity index 97%
rename from src/main/java/fr/miage23/filestore/files/entity/Node.java
rename to src/main/java/fr/ul/miage/files/entity/Node.java
index d52979d..db2061d 100644
--- a/src/main/java/fr/miage23/filestore/files/entity/Node.java
+++ b/src/main/java/fr/ul/miage/files/entity/Node.java
@@ -1,11 +1,10 @@
-package fr.miage23.filestore.files.entity;
+package fr.ul.miage.files.entity;
 
-import fr.miage23.filestore.files.FileService;
+import fr.ul.miage.files.FileService;
 
 import java.io.Serializable;
 import java.util.Comparator;
 import java.util.Objects;
-import java.util.UUID;
 
 public class Node implements Comparable<Node>, Serializable {
 
diff --git a/src/main/java/fr/miage23/filestore/files/entity/TypeNode.java b/src/main/java/fr/ul/miage/files/entity/TypeNode.java
similarity index 51%
rename from src/main/java/fr/miage23/filestore/files/entity/TypeNode.java
rename to src/main/java/fr/ul/miage/files/entity/TypeNode.java
index 5f23567..403ab6f 100644
--- a/src/main/java/fr/miage23/filestore/files/entity/TypeNode.java
+++ b/src/main/java/fr/ul/miage/files/entity/TypeNode.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.files.entity;
+package fr.ul.miage.files.entity;
 
 public enum TypeNode {
     TREE,
diff --git a/src/main/java/fr/miage23/filestore/files/exceptions/ContentException.java b/src/main/java/fr/ul/miage/files/exceptions/ContentException.java
similarity index 82%
rename from src/main/java/fr/miage23/filestore/files/exceptions/ContentException.java
rename to src/main/java/fr/ul/miage/files/exceptions/ContentException.java
index 3a4e0fa..3510856 100644
--- a/src/main/java/fr/miage23/filestore/files/exceptions/ContentException.java
+++ b/src/main/java/fr/ul/miage/files/exceptions/ContentException.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.files.exceptions;
+package fr.ul.miage.files.exceptions;
 
 public class ContentException extends Exception {
 
diff --git a/src/main/java/fr/miage23/filestore/files/exceptions/NodeAlreadyExistsException.java b/src/main/java/fr/ul/miage/files/exceptions/NodeAlreadyExistsException.java
similarity index 76%
rename from src/main/java/fr/miage23/filestore/files/exceptions/NodeAlreadyExistsException.java
rename to src/main/java/fr/ul/miage/files/exceptions/NodeAlreadyExistsException.java
index 529f709..64c2c3e 100644
--- a/src/main/java/fr/miage23/filestore/files/exceptions/NodeAlreadyExistsException.java
+++ b/src/main/java/fr/ul/miage/files/exceptions/NodeAlreadyExistsException.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.files.exceptions;
+package fr.ul.miage.files.exceptions;
 
 public class NodeAlreadyExistsException extends Exception {
     public NodeAlreadyExistsException(String message) {
diff --git a/src/main/java/fr/miage23/filestore/files/exceptions/NodeNotEmptyException.java b/src/main/java/fr/ul/miage/files/exceptions/NodeNotEmptyException.java
similarity index 74%
rename from src/main/java/fr/miage23/filestore/files/exceptions/NodeNotEmptyException.java
rename to src/main/java/fr/ul/miage/files/exceptions/NodeNotEmptyException.java
index 1e97d12..ad71712 100644
--- a/src/main/java/fr/miage23/filestore/files/exceptions/NodeNotEmptyException.java
+++ b/src/main/java/fr/ul/miage/files/exceptions/NodeNotEmptyException.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.files.exceptions;
+package fr.ul.miage.files.exceptions;
 
 public class NodeNotEmptyException extends Exception {
     public NodeNotEmptyException(String message) {
diff --git a/src/main/java/fr/miage23/filestore/files/exceptions/NodeNotFoundException.java b/src/main/java/fr/ul/miage/files/exceptions/NodeNotFoundException.java
similarity index 83%
rename from src/main/java/fr/miage23/filestore/files/exceptions/NodeNotFoundException.java
rename to src/main/java/fr/ul/miage/files/exceptions/NodeNotFoundException.java
index 0995a3a..9b0eae3 100644
--- a/src/main/java/fr/miage23/filestore/files/exceptions/NodeNotFoundException.java
+++ b/src/main/java/fr/ul/miage/files/exceptions/NodeNotFoundException.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.files.exceptions;
+package fr.ul.miage.files.exceptions;
 
 public class NodeNotFoundException extends Exception {
     public NodeNotFoundException(String message) {
diff --git a/src/main/java/fr/miage23/filestore/files/exceptions/NodeTypeException.java b/src/main/java/fr/ul/miage/files/exceptions/NodeTypeException.java
similarity index 73%
rename from src/main/java/fr/miage23/filestore/files/exceptions/NodeTypeException.java
rename to src/main/java/fr/ul/miage/files/exceptions/NodeTypeException.java
index 3a845de..c301509 100644
--- a/src/main/java/fr/miage23/filestore/files/exceptions/NodeTypeException.java
+++ b/src/main/java/fr/ul/miage/files/exceptions/NodeTypeException.java
@@ -1,4 +1,4 @@
-package fr.miage23.filestore.files.exceptions;
+package fr.ul.miage.files.exceptions;
 
 public class NodeTypeException extends Exception {
     public NodeTypeException(String message) {
diff --git a/src/main/java/fr/ul/miage/store/data/DataStore.java b/src/main/java/fr/ul/miage/store/data/DataStore.java
new file mode 100644
index 0000000..ce23bb9
--- /dev/null
+++ b/src/main/java/fr/ul/miage/store/data/DataStore.java
@@ -0,0 +1,17 @@
+package fr.ul.miage.store.data;
+
+import java.io.InputStream;
+import fr.ul.miage.store.data.exception.*;
+
+public interface DataStore {
+    boolean exists(String key) throws DataStoreException;
+
+    String put(InputStream is) throws DataStoreException;
+
+    InputStream get(String key) throws DataStoreException, DataNotFoundException;
+
+    long size(String key) throws DataStoreException, DataNotFoundException;
+
+    void delete(String key) throws DataStoreException;
+
+}
diff --git a/src/main/java/fr/ul/miage/store/data/DataStoreBean.java b/src/main/java/fr/ul/miage/store/data/DataStoreBean.java
new file mode 100644
index 0000000..96a7f28
--- /dev/null
+++ b/src/main/java/fr/ul/miage/store/data/DataStoreBean.java
@@ -0,0 +1,98 @@
+package fr.ul.miage.store.data;
+
+import fr.ul.miage.config.FilestoreConfigBean;
+import fr.ul.miage.store.data.exception.*;
+import jakarta.annotation.PostConstruct;
+import jakarta.ejb.Singleton;
+import jakarta.ejb.Startup;
+import jakarta.inject.Inject;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.*;
+import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+@Startup
+@Singleton
+public class DataStoreBean implements DataStore {
+
+    private static final Logger LOGGER = Logger.getLogger(DataStore.class.getName());
+
+    public static final String DATA_STORE_HOME = "data";
+
+    @Inject
+    public FilestoreConfigBean config;
+
+    private Path base;
+
+    public DataStoreBean() {
+    }
+
+    @PostConstruct
+    public void init() {
+        this.base = Paths.get(config.getHome().toString(), DATA_STORE_HOME);
+        LOGGER.log(Level.FINEST, "Initializing service with base folder: " + base);
+        try {
+            Files.createDirectories(base);
+        } catch (Exception e) {
+            LOGGER.log(Level.SEVERE, "unable to initialize data store", e);
+        }
+    }
+
+    @Override
+    public boolean exists(String key) throws DataStoreException {
+        Path file = Paths.get(base.toString(), key);
+        return Files.exists(file);
+    }
+
+    @Override
+    public String put(InputStream is) throws DataStoreException {
+        String key = UUID.randomUUID().toString();
+        Path file = Paths.get(base.toString(), key);
+        if ( Files.exists(file) ) {
+            throw new DataStoreException("unable to create file, key already exists");
+        }
+        try {
+            Files.copy(is, file, StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            throw new DataStoreException("unexpected error during stream copy", e);
+        }
+        return key;
+    }
+
+    @Override
+    public InputStream get(String key) throws DataStoreException, DataNotFoundException {
+        Path file = Paths.get(base.toString(), key);
+        if ( !Files.exists(file) ) {
+            throw new DataNotFoundException("file not found in storage");
+        }
+        try {
+            return Files.newInputStream(file, StandardOpenOption.READ);
+        } catch (IOException e) {
+            throw new DataStoreException("unexpected error while opening stream", e);
+        }
+    }
+
+    //size
+    public long size(String key) throws DataStoreException, DataNotFoundException {
+        Path file = Paths.get(base.toString(), key);
+        if ( !Files.exists(file) ) {
+            throw new DataNotFoundException("file not found in storage");
+        }
+        try {
+            return Files.size(file);
+        } catch (IOException e) {
+            throw new DataStoreException("unexpected error while opening stream", e);
+        }
+    }
+
+
+    @Override
+    public void delete(String key) throws DataStoreException {
+        throw new DataStoreException("NOT IMPLEMETED");
+    }
+
+}
+
diff --git a/src/main/java/fr/ul/miage/store/data/exception/DataNotFoundException.java b/src/main/java/fr/ul/miage/store/data/exception/DataNotFoundException.java
new file mode 100644
index 0000000..7e78eec
--- /dev/null
+++ b/src/main/java/fr/ul/miage/store/data/exception/DataNotFoundException.java
@@ -0,0 +1,6 @@
+package fr.ul.miage.store.data.exception;
+
+public class DataNotFoundException extends Exception {
+    public DataNotFoundException(String fileNotFoundInStorage) {
+    }
+}
diff --git a/src/main/java/fr/ul/miage/store/data/exception/DataStoreException.java b/src/main/java/fr/ul/miage/store/data/exception/DataStoreException.java
new file mode 100644
index 0000000..3f48178
--- /dev/null
+++ b/src/main/java/fr/ul/miage/store/data/exception/DataStoreException.java
@@ -0,0 +1,11 @@
+package fr.ul.miage.store.data.exception;
+
+import java.io.IOException;
+
+public class DataStoreException extends Exception {
+    public DataStoreException(String s) {
+    }
+
+    public DataStoreException(String unexpectedErrorDuringStreamCopy, IOException e) {
+    }
+}
diff --git a/src/test/java/fr/ul/miage/config/TestFilestoreConfigBean.java b/src/test/java/fr/ul/miage/config/TestFilestoreConfigBean.java
new file mode 100644
index 0000000..1243a6f
--- /dev/null
+++ b/src/test/java/fr/ul/miage/config/TestFilestoreConfigBean.java
@@ -0,0 +1,68 @@
+package fr.ul.miage.config;
+
+import jakarta.annotation.PostConstruct;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Alternative;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+@Alternative
+@ApplicationScoped
+public class TestFilestoreConfigBean implements  FilestoreConfig {
+
+    private static final Logger LOGGER = Logger.getLogger(TestFilestoreConfigBean.class.getName());
+
+    private Path home;
+    private String owner;
+    private InstanceConfig instance;
+
+    @PostConstruct
+    public void init() {
+        LOGGER.log(Level.INFO, "Initialising config");
+        home = Paths.get("/tmp", String.valueOf(System.currentTimeMillis()));
+        LOGGER.log(Level.INFO, "home set to: " + home);
+        owner = "test";
+        LOGGER.log(Level.INFO, "owner set to: " + owner);
+        instance = new InstanceConfig() {
+            @Override
+            public boolean https() {
+                return false;
+            }
+
+            @Override
+            public String host() {
+                return "localhost";
+            }
+
+            @Override
+            public int port() {
+                return 8080;
+            }
+
+            @Override
+            public String ctx() {
+                return "filestore";
+            }
+        };
+        LOGGER.log(Level.INFO, "instance set to: " + instance);
+    }
+
+    @Override
+    public InstanceConfig instance() {
+        return instance;
+    }
+
+    @Override
+    public Path home() {
+        return home;
+    }
+
+    @Override
+    public String owner() {
+        return owner;
+    }
+}
+
diff --git a/src/test/java/fr/ul/miage/data/DataStoreTest.java b/src/test/java/fr/ul/miage/data/DataStoreTest.java
new file mode 100644
index 0000000..987c761
--- /dev/null
+++ b/src/test/java/fr/ul/miage/data/DataStoreTest.java
@@ -0,0 +1,63 @@
+package fr.ul.miage.data;
+
+import fr.ul.miage.store.data.DataStore;
+import fr.ul.miage.store.data.exception.DataNotFoundException;
+import fr.ul.miage.store.data.exception.DataStoreException;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.jboss.shrinkwrap.resolver.api.maven.Maven;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.logging.Logger;
+import java.util.logging.Level;
+
+import static org.junit.Assert.*;
+
+import org.apache.commons.io.IOUtils;
+
+@RunWith(Arquillian.class)
+public class DataStoreTest {
+
+    private static Logger LOGGER = Logger.getLogger(DataStoreTest.class.getName());
+    private DataStore store;
+
+    @Deployment
+    public static Archive createDeployment() throws Exception {
+        WebArchive archive = ShrinkWrap.create(WebArchive.class);
+        archive.addPackage("fr.ul.miage.store.data");
+        archive.addPackage("fr.ul.miage.store.data.exception");
+        archive.addPackage("fr.ul.miage.config");
+        archive.addAsResource("test-beans.xml", "META-INF/beans.xml");
+        File[] file = Maven.resolver().loadPomFromFile("pom.xml")
+                .importCompileAndRuntimeDependencies()
+                .resolve("commons-io:commons-io:2.11.0")
+                .withTransitivity().asFile();
+        archive.addAsLibraries(file);
+        return archive;
+    }
+
+    @Test
+    public void simpleCreateFileTest() throws DataStoreException, DataNotFoundException, IOException {
+        LOGGER.log(Level.INFO, "Starting Simple Create File Test");
+        String content = "This is a test";
+
+        ByteArrayInputStream inputStream = new ByteArrayInputStream(content.getBytes());
+        String KEY = store.put(inputStream);
+        LOGGER.log(Level.INFO, "File stored with key: " + KEY);
+        assertNotNull(KEY);
+        assertTrue(store.exists(KEY));
+        InputStream inputStream1 = store.get(KEY);
+        //assertEquals(14, store.size(KEY));
+        String retrieved = new String(IOUtils.toByteArray(inputStream1));
+        assertEquals(content, retrieved);
+    }
+
+}
diff --git a/src/test/resources/arquilian.xml b/src/test/resources/arquilian.xml
new file mode 100644
index 0000000..0556b50
--- /dev/null
+++ b/src/test/resources/arquilian.xml
@@ -0,0 +1,13 @@
+<arquillian xmlns="http://jboss.org/schema/arquillian"
+            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="http://jboss.org/schema/arquillian
+        http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
+    <container qualifier="wildfly-managed" default="true">
+        <configuration>
+            <property name="jbossHome">C:\Users\LB-C\Bureau\Logiciels\wildfly-29.0.1.Final</property>
+            <property name="serverConfig">C:\Users\LB-C\Bureau\Logiciels\wildfly-29.0.1.Final\bin\standalone.xml</property>
+            <property name="allowConnectingToRunningServer">true</property>
+            <property name="javaVmArguments">-DfilestoreHome=~/.filestore-test</property>
+        </configuration>
+    </container>
+</arquillian>
\ No newline at end of file
diff --git a/src/test/resources/test-beans.xml b/src/test/resources/test-beans.xml
new file mode 100644
index 0000000..3e93f3a
--- /dev/null
+++ b/src/test/resources/test-beans.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://java.sun.com/xml/ns/javaee"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
+    <alternatives>
+        <class>fr.ul.miage.config.TestFilestoreConfigBean</class>
+    </alternatives>
+</beans>
-- 
GitLab