diff --git a/.idea/compiler.xml b/.idea/compiler.xml index f1d745e10c7d3720c463d6c9f03bfe6fac462f74..0cdf532d6c76d9b15b6ace7cac1967604592bd9a 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 1bb9b745c7bb5f50eb5476141dbb994c8846678e..279627492fad5149bf701d7940afabb75cd01d1c 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 b714528fc40d9e6e8239998162e3a638819456a6..0000000000000000000000000000000000000000 --- 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 2899cb3e0ce38732c1fccb1bc39c4860f42b7ef4..0000000000000000000000000000000000000000 --- 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 09ca011fed0791d0d9d0473bb89da25193cb0540..0000000000000000000000000000000000000000 --- 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 ecd8bf018149e9cfa3adc2f282976a39dae587c8..a78169b4cdb70958c9156e4c6690806a73c4e3c9 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 a5a304e06b95e80f1065ac33b0b95df1b29993dc..ded7c1c88224bcfad0460502fd2b84dc0b808e05 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 ff7c964b9b7eed70d27a133e366161ff06fbfd37..f215c4c122cb7115cde0b9ce1eee5c78d25cae1e 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 1f2ec415da07523db6fb90060655e967198bf8ce..4447ef440b57c07df9ef293fc93f6859ed4fbb71 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 575e990d5405eec3be46adccef1855886cc0fdde..33b81ec802b658e8a6fbf02a6c5ffd27719b4220 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 06681ea59d97713b9f8c245b32b26836af421db0..a3b64026f90250f967dc67113d5c205283e56ad8 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 4e5e9ce58f0875a331e9af2ab7c8bda82ec023b6..149e8205600f40bc0d3e7134d79d29225f5c193a 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 d082e1f9dd58903fddc31299766e7c373b732fb5..61e51f1dccd4c23e1b153afad41902de5e3b21c3 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 86e1b85d4010df973ce19ea4e99c188f64126f07..ea7b0e45a669802faca952557e04aabf65efb413 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 746050cd37c694a1899637550a69edaf3b7bfd06..bb3de88cacf0e6e2b31a485ff43b06b8f42e80db 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 5efdf17f9efc6a130de3f14a8a1010637b5bff59..0f4a95e95c92c25339ed4d8301e92d8854a29064 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 65847bd479da841ef4605ef7e0d205a5779f68da..6a06829ac91629019f9050acaac02a2e35796cb6 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 92bb75354aaedd0cc65d9229a4411cdda45aaed8..ab3342dff29fe4f3530da6d7f29ec66f208250e5 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 e54397d106537510f880a03ef5c9245e7ea7e09e..87880ff7f55a202b754870142f79d265a0168f11 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 3458727108dd71bda2c0e3a4d813c6110b0006e2..e506592a2a1473e956a2395df8ffc8d5b9c9fcb4 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 4d57223e8b1be369334c7725761ff48a7b78e249..d67e2c899fc19570b305a62b8136b5c654feb3bc 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 fc772a474a134e6df412b4d1bcd6f3ceefe2fc17..a409b94c53030e90f839f5ab9748bd67acb6f7f3 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 eda68aecd820fe2dd6d3b09aa5b011a8a80c2711..e46aa6a9590f4f6ef7528a93d593c74685a89f2f 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 74a4ac7ce16f506eb59dd2cddf31958d122b1892..ab65e7346d5505e16964801a07c6640841130c26 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 2802ef6b703e9b247e3d28fe264c997439ec8805..a50bc926a40a860a2c165c54db5b56270fa7c4dc 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 9330f030cb7fc40553582e00e1365e8df09c8cdf..711a4079f55064cc03bca152789d571b6af22a83 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 030ce5546e074d78e1bbe9bdb941311fcd136c78..05912c8857bc1e1264d88ac151ea2e84ff7c5861 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 bf4e7cab05f14dec3d7ae9f78d0a87b26fc1db36..6bfbdede3d1af68a1555758f62df92b8f1337e8f 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 d5f23fc53b3447a764db81cb7ded5c4f4012ae67..11cb38edddfb3a030e9fa148a144879171dfc52c 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 13354663ee3a98529f85665c59c8a2492e241e53..0e2859eb19642bad16ea7ff3bd077935c62eadc3 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 cb29ee662e46f34b56ed67fe6714246427adc186..8192ff4841e78290f3dbb8560c3afd3df104bccf 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 d52979dba589cc5beb6ddd8b6843aab4e1809ceb..db2061d142f4a6b74710f34c5d36af2144b43d2c 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 5f235677f04a28be9839fcfa7e7da269b9581dae..403ab6fae01b1c20360f745daa5eb1ef4841e50a 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 3a4e0fa71cab5842c4f4b6067ea2ac75932d6d0d..351085622cd96611ae6bcc8a3de3d109694672dc 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 529f709719743737912904faf877613344109ae3..64c2c3e5c6d4a78e919f5e67ffa13f946237270e 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 1e97d12176e04ce4fcca342fae01e6aedaf2faab..ad71712fa1444c990bf31a4d02cbd0f81d410b36 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 0995a3a5fa74983711f6a3ceb38019fcee2d4043..9b0eae3a692773171281dde2ee067fa7580d0c87 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 3a845ded18dc5ea6aa3922b54f55cef6bd2dcec2..c3015096a3476d9cbc54a94f04a205d783573b70 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 0000000000000000000000000000000000000000..ce23bb9a208806017207d0192742f736886f1bc8 --- /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 0000000000000000000000000000000000000000..96a7f28855b78648c1ac242df50746ada8ca22bd --- /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 0000000000000000000000000000000000000000..7e78eecfa71c634303cea0320f06ec43b51f1c22 --- /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 0000000000000000000000000000000000000000..3f481787f846262943d5751a55d515af8de7354d --- /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 0000000000000000000000000000000000000000..1243a6fa7dcc89e12aca7ecd589595c0dd223cc5 --- /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 0000000000000000000000000000000000000000..987c76158ec8a8524e50791cbda3903dc8e81e58 --- /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 0000000000000000000000000000000000000000..0556b50f215ed0bdc2fd4452d05122c77879c88c --- /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 0000000000000000000000000000000000000000..3e93f3a1225e27582b24d545caddf1fd3f074505 --- /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>