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