From c56ba43bfbbb707ef500b43f87fccfd62dcd3095 Mon Sep 17 00:00:00 2001 From: sebastien leridon Date: Fri, 20 Sep 2024 18:19:19 +0200 Subject: [PATCH] LUT-28558 : manage FileStoreServices by EntryType (if set in properties) --- .../ResponseImageResourceProvider.java | 2 +- .../entrytype/AbstractEntryTypeComment.java | 28 +--- .../entrytype/AbstractEntryTypeFile.java | 5 +- .../AbstractEntryTypeGalleryImage.java | 4 +- .../service/entrytype/IEntryTypeService.java | 2 +- .../file/GenericAttributeFileService.java | 139 ++++++++++++++++-- .../conf/plugins/genericattributes.properties | 2 + 7 files changed, 141 insertions(+), 41 deletions(-) diff --git a/src/java/fr/paris/lutece/plugins/genericattributes/service/ResponseImageResourceProvider.java b/src/java/fr/paris/lutece/plugins/genericattributes/service/ResponseImageResourceProvider.java index 883ff5e..327023a 100644 --- a/src/java/fr/paris/lutece/plugins/genericattributes/service/ResponseImageResourceProvider.java +++ b/src/java/fr/paris/lutece/plugins/genericattributes/service/ResponseImageResourceProvider.java @@ -66,7 +66,7 @@ public ImageResource getImageResource( int nIdResource ) if ( response.getFile( ) != null ) { - File file = GenericAttributeFileService.getInstance().load( response.getFile( ).getFileKey( ) ); + File file = GenericAttributeFileService.getInstance().load( response.getFile( ).getFileKey( ), response.getFile( ).getOrigin( ) ); if ( ( file.getPhysicalFile( ) != null ) && FileUtil.hasImageExtension( file.getTitle( ) ) ) { diff --git a/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeComment.java b/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeComment.java index 66f862d..cb46bd3 100644 --- a/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeComment.java +++ b/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeComment.java @@ -43,6 +43,7 @@ import fr.paris.lutece.plugins.genericattributes.business.Entry; import fr.paris.lutece.plugins.genericattributes.business.Field; import fr.paris.lutece.plugins.genericattributes.business.FieldHome; +import fr.paris.lutece.plugins.genericattributes.service.file.GenericAttributeFileService; import fr.paris.lutece.plugins.genericattributes.util.GenericAttributesUtils; import fr.paris.lutece.portal.business.file.File; import fr.paris.lutece.portal.business.physicalfile.PhysicalFile; @@ -60,6 +61,8 @@ */ public abstract class AbstractEntryTypeComment extends EntryTypeService { + public static final String ENTRY_TYPE_KEYNAME = "entryTypeComment"; + /** * {@inheritDoc} */ @@ -114,14 +117,9 @@ public String getRequestData( Entry entry, HttpServletRequest request, Locale lo file.setPhysicalFile( physicalFile ); String idFile; - try { - idFile = getFileStoreServiceProvider( ).storeFile( file ); - GenericAttributesUtils.createOrUpdateField( entry, FIELD_DOWNLOADABLE_FILE, file.getTitle( ), idFile ); - } - catch ( FileServiceException e ) - { - AppLogService.error(e); - } + idFile = GenericAttributeFileService.getInstance( ).save( fileItem, ENTRY_TYPE_KEYNAME ); + GenericAttributesUtils.createOrUpdateField( entry, FIELD_DOWNLOADABLE_FILE, file.getTitle( ), idFile ); + } } @@ -133,18 +131,8 @@ private void removeOldFiles( Entry entry ) Field oldFile = entry.getFieldByCode( FIELD_DOWNLOADABLE_FILE ); if ( oldFile != null ) { - try { - getFileStoreServiceProvider( ).delete( oldFile.getValue( ) ); - FieldHome.remove( oldFile.getIdField( ) ); - } catch (FileServiceException e) { - AppLogService.error(e); - } - + GenericAttributeFileService.getInstance( ).delete( oldFile.getValue( ), null); + FieldHome.remove( oldFile.getIdField( ) ); } } - - protected IFileStoreServiceProvider getFileStoreServiceProvider( ) - { - return FileService.getInstance( ).getFileStoreServiceProvider( "defaultDatabaseFileStoreProvider" ); - } } diff --git a/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeFile.java b/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeFile.java index 294d527..8f90be7 100644 --- a/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeFile.java +++ b/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeFile.java @@ -60,7 +60,9 @@ */ public abstract class AbstractEntryTypeFile extends AbstractEntryTypeUpload { - /** + public static final String ENTRY_TYPE_KEYNAME = "entryTypeFile"; + + /** * {@inheritDoc} */ @Override @@ -217,7 +219,6 @@ private Response getResponseFromFile( FileItem fileItem, Entry entry, boolean bC File file = new File( ); file.setTitle( fileItem.getName( ) ); - file.setOrigin( GenericAttributeFileService.getInstance( ).getName( ) ); file.setSize( ( fileItem.getSize( ) < Integer.MAX_VALUE ) ? (int) fileItem.getSize( ) : Integer.MAX_VALUE ); if ( bCreatePhysicalFile ) diff --git a/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeGalleryImage.java b/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeGalleryImage.java index 75679a7..1224a66 100644 --- a/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeGalleryImage.java +++ b/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/AbstractEntryTypeGalleryImage.java @@ -62,6 +62,8 @@ */ public abstract class AbstractEntryTypeGalleryImage extends EntryTypeService { + public static final String ENTRY_TYPE_KEYNAME = "entryTypeGalleryImage"; + // PARAMETERS protected static final String PARAMETER_ID_RESPONSE = "id_response"; protected static final String PARAMETER_CODE_GALLERY = "code_gallery"; @@ -113,7 +115,7 @@ public GenericAttributeError getResponseData( Entry entry, HttpServletRequest re { FileImagePublicService.init( ); - File file = GenericAttributeFileService.getInstance( ).load( strFileGallery, GenericAttributeFileService.getInstance( ).getName( ) ); + File file = GenericAttributeFileService.getInstance( ).load( strFileGallery, ENTRY_TYPE_KEYNAME); Response response = new Response( ); response.setEntry( entry ); diff --git a/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/IEntryTypeService.java b/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/IEntryTypeService.java index f8bfbd8..ca789b9 100644 --- a/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/IEntryTypeService.java +++ b/src/java/fr/paris/lutece/plugins/genericattributes/service/entrytype/IEntryTypeService.java @@ -139,7 +139,7 @@ public interface IEntryTypeService String FIELD_ILLUSTRATION_IMAGE = "illustration_image"; String FIELD_GEOJSON = "coordinates_geojson"; String FIELD_ID_LAYER = "DataLayer"; - String FIELD_DISABLED = "disabled"; + String FIELD_DISABLED = "disabled"; String FIELD_IS_UPDATABLE = "is_updatable"; // attribute diff --git a/src/java/fr/paris/lutece/plugins/genericattributes/service/file/GenericAttributeFileService.java b/src/java/fr/paris/lutece/plugins/genericattributes/service/file/GenericAttributeFileService.java index 7f2aa38..4d73622 100644 --- a/src/java/fr/paris/lutece/plugins/genericattributes/service/file/GenericAttributeFileService.java +++ b/src/java/fr/paris/lutece/plugins/genericattributes/service/file/GenericAttributeFileService.java @@ -33,21 +33,91 @@ */ package fr.paris.lutece.plugins.genericattributes.service.file; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.lang3.StringUtils; + import fr.paris.lutece.portal.business.file.File; import fr.paris.lutece.portal.service.file.FileService; import fr.paris.lutece.portal.service.file.FileServiceException; import fr.paris.lutece.portal.service.file.IFileStoreServiceProvider; import fr.paris.lutece.portal.service.util.AppLogService; +import fr.paris.lutece.portal.service.util.AppPropertiesService; public class GenericAttributeFileService { - private static final GenericAttributeFileService _instance = new GenericAttributeFileService( ); - private IFileStoreServiceProvider _fileStoreServiceProvider; + private static final String PROPERTY_FILESTORESERVICE_PREFIX = "genericattributes.filestoreservice"; + private static final String PROPERTY_FILESTORESERVICE_DEFAULT_SUFFIX = "default"; + private static final GenericAttributeFileService _instance = new GenericAttributeFileService( ); + private static final Map _entryTypeFileServices = new HashMap<>(); + + /** + * Constructor + */ private GenericAttributeFileService( ) { + List keyList = AppPropertiesService.getKeys( PROPERTY_FILESTORESERVICE_PREFIX); + + // init specific entryType fileStoreService names if exists + keyList.stream().forEach( s -> { + if ( !StringUtils.isAllBlank( AppPropertiesService.getProperty(s) ) ) + { + _entryTypeFileServices.put(s, AppPropertiesService.getProperty(s)); + } + } ); + } + + /** + * get FileStoreServiceProvider name for entry type : + * - returns the entry type FileService (if set) + * - otherwise, returns the GenAttr default FileService (if set) + * - otherwise, returns the lutece default FileService + * + * @param strEntryType + * @return the name of the FileStoreServiceProvider + */ + public String getFileStoreProviderName( String strEntryType ) + { + if (strEntryType != null ) + { + if ( _entryTypeFileServices.containsKey( strEntryType )) + { + return _entryTypeFileServices.get( strEntryType ); + } + } + + if ( _entryTypeFileServices.containsKey( PROPERTY_FILESTORESERVICE_DEFAULT_SUFFIX )) + { + return _entryTypeFileServices.get( PROPERTY_FILESTORESERVICE_DEFAULT_SUFFIX ); + } + + return FileService.getInstance( ).getFileStoreServiceProvider( ).getName( ); + } + + /** + * get FileStoreServiceProvider name : + * - returns the GenAttr default FileService (if set) + * - otherwise, returns the lutece default FileService + * + * Use getFileStoreProviderName( String strEntryType ) to get entryType specific File service + * + * @return the name of the FileStoreServiceProvider + */ + public String getFileStoreProviderName( ) + { + return getFileStoreProviderName( null ); } + /** + * get instance of service + * + * @return the instance + */ public static GenericAttributeFileService getInstance( ) { return _instance; @@ -56,16 +126,30 @@ public static GenericAttributeFileService getInstance( ) /** * Save a file * - * @param file - * The file + * @param file The lutece file in default generic file Service * @return The key of the file */ - public String save( File file ) + public String save( File file) + { + return save( file, null); + } + /** + * Save a file + * + * @param file The lutece file + * @param strEntryType the entry type + * @return The key of the file + */ + public String save( File file, String strEntryType) { try { - _fileStoreServiceProvider = FileService.getInstance( ).getFileStoreServiceProvider( file.getOrigin( ) ); - return _fileStoreServiceProvider.storeFile( file ); + if ( file.getOrigin( ) == null ) + { + file.setOrigin( getFileStoreProviderName( strEntryType ) ); + } + + return FileService.getInstance( ).getFileStoreServiceProvider( file.getOrigin( ) ).storeFile( file ); } catch( FileServiceException e ) { @@ -74,6 +158,26 @@ public String save( File file ) } } + /** + * Save a file + * + * @param file The fileItem + * @param strEntryType the entry type + * @return The key of the file + */ + public String save( FileItem file, String strEntryType) + { + try + { + return FileService.getInstance( ).getFileStoreServiceProvider( getFileStoreProviderName( strEntryType ) ).storeFileItem( file ); + } + catch( FileServiceException e ) + { + AppLogService.error( e ); + return null; + } + } + /** * Load a file * @@ -85,8 +189,12 @@ public File load( String strKey, String strOrigin ) { try { - _fileStoreServiceProvider = FileService.getInstance( ).getFileStoreServiceProvider( strOrigin ); - return _fileStoreServiceProvider.getFile( strKey ); + if ( StringUtils.isEmpty( strOrigin ) ) + { + strOrigin = getFileStoreProviderName( ) ; + } + + return FileService.getInstance( ).getFileStoreServiceProvider( strOrigin ).getFile( strKey ); } catch( FileServiceException e ) { @@ -105,8 +213,12 @@ public void delete( String strKey, String strOrigin ) { try { - _fileStoreServiceProvider = FileService.getInstance( ).getFileStoreServiceProvider( strOrigin ); - _fileStoreServiceProvider.delete( strKey ); + if ( StringUtils.isEmpty( strOrigin ) ) + { + strOrigin = getFileStoreProviderName( ); + } + + FileService.getInstance( ).getFileStoreServiceProvider( strOrigin ).delete( strKey ); } catch( FileServiceException e ) { @@ -114,9 +226,4 @@ public void delete( String strKey, String strOrigin ) } } - public String getName( ) - { - // return default genatt file store provider name - return FileService.getInstance( ).getFileStoreServiceProvider( ).getName( ); - } } diff --git a/webapp/WEB-INF/conf/plugins/genericattributes.properties b/webapp/WEB-INF/conf/plugins/genericattributes.properties index 74eeade..8e13191 100644 --- a/webapp/WEB-INF/conf/plugins/genericattributes.properties +++ b/webapp/WEB-INF/conf/plugins/genericattributes.properties @@ -12,3 +12,5 @@ genericattributes.telephoneNumber.default.default.region=FR # export field name genericattributes.entrytype.geolocalisation.export.field.name=false genericattributes.entrytype.cartography.export.field.name=false + +genericattributes.filestoreservice.default=