Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plume file integration #1

Merged
merged 15 commits into from
Dec 14, 2023
29 changes: 28 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<maven.compiler.target>17</maven.compiler.target>

<plume-dependencies.version>4.1.0</plume-dependencies.version>
<plume-file.version>3.0.0-beta3</plume-file.version>
amanteaux marked this conversation as resolved.
Show resolved Hide resolved
</properties>

<build>
Expand Down Expand Up @@ -165,6 +166,32 @@
<artifactId>plume-admin-api-log</artifactId>
</dependency>

<dependency>
<groupId>com.coreoz</groupId>
<artifactId>plume-file-core</artifactId>
<version>${plume-file.version}</version>
</dependency>
<dependency>
<groupId>com.coreoz</groupId>
<artifactId>plume-file-metadata-database</artifactId>
<version>${plume-file.version}</version>
</dependency>
<dependency>
<groupId>com.coreoz</groupId>
<artifactId>plume-file-storage-database</artifactId>
<version>${plume-file.version}</version>
</dependency>
<dependency>
<groupId>com.coreoz</groupId>
<artifactId>plume-file-web-download-jersey</artifactId>
<version>${plume-file.version}</version>
</dependency>
<dependency>
<groupId>com.coreoz</groupId>
<artifactId>plume-file-web-upload-jersey</artifactId>
<version>${plume-file.version}</version>
</dependency>

<!-- unit testing -->
<dependency>
<groupId>junit</groupId>
Expand All @@ -190,4 +217,4 @@
</dependencies>
</dependencyManagement>

</project>
</project>
13 changes: 9 additions & 4 deletions src/main/java/com/coreoz/db/QuerydslGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import com.coreoz.plume.conf.guice.GuiceConfModule;
import com.coreoz.plume.db.querydsl.generation.IdBeanSerializer;
import com.coreoz.plume.db.transaction.TransactionManager;
import com.coreoz.plume.file.db.beans.FileDataQueryDsl;
import com.coreoz.plume.file.db.beans.FileMetadataQuerydsl;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.querydsl.codegen.EntityType;
Expand All @@ -23,7 +25,7 @@
/**
* Generate Querydsl classes for the database layer.
*
* Run the {@link #main()} method from your IDE to regenerate Querydsl classes.
* Run the {@link #main(String...)} method from your IDE to regenerate Querydsl classes.
*/
public class QuerydslGenerator {

Expand All @@ -47,9 +49,12 @@ public static void main(String... args) {
@Override
public String getClassName(String tableName) {
// uncomment if you are using plume file
// if("plm_file".equalsIgnoreCase(tableName)) {
// return FileEntityQuerydsl.class.getName();
// }
if("plm_file_data".equalsIgnoreCase(tableName)) {
return FileDataQueryDsl.class.getName();
}
if("plm_file".equalsIgnoreCase(tableName)) {
return FileMetadataQuerydsl.class.getName();
}
return super.getClassName(tableName.substring(TABLES_PREFIX.length()));
}

Expand Down
18 changes: 15 additions & 3 deletions src/main/java/com/coreoz/guice/ApplicationModule.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package com.coreoz.guice;

import com.coreoz.plume.scheduler.guice.GuiceSchedulerModule;
import org.glassfish.jersey.server.ResourceConfig;

import com.coreoz.jersey.JerseyConfigProvider;
import com.coreoz.plume.admin.guice.GuiceAdminWsModule;
import com.coreoz.plume.admin.services.permissions.AdminPermissionService;
Expand All @@ -12,9 +9,17 @@
import com.coreoz.plume.conf.guice.GuiceConfModule;
import com.coreoz.plume.db.guice.DataSourceModule;
import com.coreoz.plume.db.querydsl.guice.GuiceQuerydslModule;
import com.coreoz.plume.file.filetype.FileTypesProvider;
import com.coreoz.plume.file.guice.GuiceFileCacheDownloadModule;
import com.coreoz.plume.file.guice.GuiceFileMetadataDatabaseModule;
import com.coreoz.plume.file.guice.GuiceFileModule;
import com.coreoz.plume.file.guice.GuiceFileStorageDatabaseModule;
import com.coreoz.plume.jersey.guice.GuiceJacksonModule;
import com.coreoz.plume.scheduler.guice.GuiceSchedulerModule;
import com.coreoz.services.file.ShowCaseFileTypesProvider;
import com.coreoz.webservices.admin.permissions.ProjectAdminPermissionService;
import com.google.inject.AbstractModule;
import org.glassfish.jersey.server.ResourceConfig;

/**
* Group the Guice modules to install in the application
Expand All @@ -34,6 +39,13 @@ protected void configure() {
// API log configuration
install(new GuiceSchedulerModule());

// Plume File
install(new GuiceFileMetadataDatabaseModule());
install(new GuiceFileStorageDatabaseModule());
install(new GuiceFileCacheDownloadModule());
install(new GuiceFileModule());
bind(FileTypesProvider.class).to(ShowCaseFileTypesProvider.class);

// database setup for the demo
install(new DataSourceModule());

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/coreoz/jersey/JerseyConfigProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import javax.inject.Singleton;

import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.process.internal.RequestScoped;
import org.glassfish.jersey.server.ResourceConfig;

Expand Down Expand Up @@ -36,6 +37,8 @@ public JerseyConfigProvider(ObjectMapper objectMapper) {
config.packages("com.coreoz.webservices");
// admin web-services
config.packages("com.coreoz.plume.admin.webservices");
// plume file
config.packages("com.coreoz.plume.file.webservices");
// enable to fetch the current user as a web-service parameter
config.register(new AbstractBinder() {
@Override
Expand All @@ -54,6 +57,8 @@ protected void configure() {
config.register(AdminSecurityFeature.class);
// to debug web-service requests
// register(LoggingFeature.class);
// To use Multipart
amanteaux marked this conversation as resolved.
Show resolved Hide resolved
config.register(MultiPartFeature.class);
amanteaux marked this conversation as resolved.
Show resolved Hide resolved

// java 8
config.register(TimeParamProvider.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.coreoz.services.file;

import com.coreoz.plume.file.filetype.FileTypeDatabase;
import com.coreoz.plume.file.filetype.FileTypesProvider;

import java.util.Collection;
import java.util.List;

public class ShowCaseFileTypesProvider implements FileTypesProvider {
@Override
public Collection<FileTypeDatabase> fileTypesAvailable() {
return List.of(ShowcaseFileType.values());
}
}
30 changes: 30 additions & 0 deletions src/main/java/com/coreoz/services/file/ShowcaseFileType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.coreoz.services.file;

import com.coreoz.plume.file.filetype.FileTypeDatabase;
import com.querydsl.core.types.EntityPath;
import com.querydsl.core.types.dsl.StringPath;

public enum ShowcaseFileType implements FileTypeDatabase {
// ENUM(QUserFile.userFile, QUserFile.userFile.fileUniqueName)
amanteaux marked this conversation as resolved.
Show resolved Hide resolved
ENUM(null, null)
;

private final EntityPath<?> fileEntity;
private final StringPath joinColumn;

ShowcaseFileType(EntityPath<?> fileEntity, StringPath joinColumn) {
this.fileEntity = fileEntity;
this.joinColumn = joinColumn;
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Saut de ligne en trop


@Override
public EntityPath<?> getFileEntity() {
return fileEntity;
}

@Override
public StringPath getJoinColumn() {
return joinColumn;
}
}
56 changes: 56 additions & 0 deletions src/main/java/com/coreoz/webservices/api/file/FileUploadWs.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.coreoz.webservices.api.file;

import com.coreoz.plume.file.FileUploadWebJerseyService;
import com.coreoz.plume.jersey.errors.Validators;
import com.coreoz.plume.jersey.security.permission.PublicApi;
import com.coreoz.services.file.ShowcaseFileType;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataParam;

import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.InputStream;

@Path("/admin/files")
@Tag(name = "Files", description = "Upload files")
@Consumes({MediaType.MULTIPART_FORM_DATA})
@Produces(MediaType.APPLICATION_JSON)
@PublicApi
@Singleton
public class FileUploadWs {
private final FileUploadWebJerseyService fileUploadWebJerseyService;

@Inject
public FileUploadWs(FileUploadWebJerseyService fileService) {
this.fileUploadWebJerseyService = fileService;
}

@POST
@Operation(description = "Upload a file")
public Response upload(
@Context ContainerRequestContext context,
@FormDataParam("file") FormDataBodyPart fileMetadata,
@FormDataParam("file") InputStream fileData
) {
Validators.checkRequired("fileMetadata", fileMetadata);
Validators.checkRequired("file", fileData);
amanteaux marked this conversation as resolved.
Show resolved Hide resolved
return Response.ok(
this.fileUploadWebJerseyService.add(
ShowcaseFileType.ENUM,
fileData,
fileMetadata
)
)
.build();
}
}
2 changes: 2 additions & 0 deletions src/main/resources/application.conf
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,5 @@ db.hikari.minimumIdle=1
db.hikari.maximumPoolSize=4
db.hikari.leakDetectionThreshold=30000
db.hikari.idleTimeout=20000

file.keep-original-name-on-download="true"
30 changes: 30 additions & 0 deletions src/main/resources/db/migration/V3__setup_plume_file.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
CREATE TABLE `PLM_FILE`
(
`unique_name` VARCHAR(255) NOT NULL,
`file_type` VARCHAR(255) NOT NULL,
`mime_type` VARCHAR(255) NOT NULL,
`file_size` DECIMAL(19, 0) NULL,
`file_original_name` VARCHAR(255) NULL,
`file_extension` VARCHAR(5) NULL,
amanteaux marked this conversation as resolved.
Show resolved Hide resolved
`checksum` VARCHAR(255) NULL,
`creation_date` TIMESTAMP NOT NULL,
PRIMARY KEY (`unique_name`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;


CREATE TABLE `PLM_FILE_DATA`
(
`unique_name` VARCHAR(255) NOT NULL,
`data` BLOB NOT NULL,
FOREIGN KEY (unique_name) REFERENCES PLM_FILE (unique_name)
)
DEFAULT CHARSET = utf8;

CREATE TABLE `PLM_USER_FILE`
(
`user_id` bigint(20) NOT NULL,
`file_unique_name` VARCHAR(255) NOT NULL,
FOREIGN KEY (user_id) REFERENCES PLM_USER (id)
)
DEFAULT CHARSET = utf8;