[intégrée] Prop0077 - Support de plusieurs backend storage

Statut : intégrée dans la version 4.10.0

Ticket #9984 : FusionForge de l'ADULLACT: openMairie - Framework : [#9984] Support de plusieurs systèmes de stockage pour une unique application

1. Objectifs

Avoir la possibilité d’utiliser plusieurs backend storage (plusieurs connecteurs), et pouvoir choisir lequel utiliser selon le type d’objet métier et le type de fichier (ex: om_logo.fichier).

2. Paramétrage

Modification de la configuration pour supporter des backend storage alternatifs.
Exemple de filestorage.conf.php :

$filestorage = array();

$filestorage["filestorage-default"] = array (
    "storage" =--> "filestorageads_vdm", // Nom de la classe de stockage 
    "storage_path" => "../plugins/filestorage/filestorageads_vdm/filestorageads_vdm.class.php", // Chemin de la classe de stockage
    "url_sas" => "http://www.ged.fr/ws1/", // URL WS GED (post)
    "url_workspace" => "http://www.ged.fr/ws2/", // URL WS GED (get, put, delete)
    "username" => "login_ged", // Identifiant de l'utilisateur GED
    "password" => "pwd_ged", // Mot de pass de l’utilisateur GED
    "temporary" => array(
        "storage" => "filesystem", // Nom de la classe de stockage temporaire
        "path" => "../var/tmp", // Chemin de stockage des fichiers temporaires
    ),
    "max_file_size" => 20 * 1024 * 1024, // Taille maximum des fichiers traités en octet
    "metadata_handlers" => array( // Liste des méthodes à exécuter par table, pour le traitement des métadonnées
        "dossier" => array("update_concerneERP", ),
    ),
    "models_overrides_arrete" => array("ARRT", "ARA", "ARD"), // Liste des types de pieces qui utiliseront le model_arrete.xml
    "debug_mode" => false, // Active ou désactive la journalisation des requêtes sortantes et des retours (true | false)
    "override_storage_matrix" => array (
        "om_logo.fichier" => "fs",
        "commission.compte_rendu" => "fs",
        "document_numerise.vignette" => "blob"
    )
    "alternate_storage" => array(
        "fs" => array (
            "storage" => "filesystem",
            "path" => "../var/filestorage_plop",
        ),
        "blob" => array (
            "storage" => "blobstorage",
        ),
    )
);

3. Utilisation

L’utilisation d’un backend particulier se fait via la clé objet/fichier. Cette clé est composée du nom de l’objet métier (la table) et de la colonne dans laquelle l’UID est stocké.
ex :

commission.om_fichier_commission_ordre_jour
om_fichier_commission_ordre_jour
om_logo.fichier
document_numerise.uid
...

Pour utiliser un backend particulier, il faut le préciser à la création du fichier. Ceci se fait en passant en paramètre de la fonction create la clé objet/fichier.

$this->f->storage.create(..., file_object_type = "om_logo.fichier"))

Pour assurer la rétro-compatibilité avec d’autres applications qui n’auraient fait évoluer les appels à this->storage.create, quand rien n’est précisé, c’est le filestorage-default qui est utilisé.

Le mapping est récupéré de la configuration du filestorage, dans le tableau override_storage_matrix.

4. Implémentation

Stockage du type de backend avec l’UID

A la création du fichier, le backend de stockage est sélectionné en fonction de la matrice de surcharge. L’uid est stocké accompagné du l’identifiant du backend de stockage. On utilise :// comme séparateur.

Si c’est le backend storage principal, l’indentifiant n’est pas stocké.
Exemple pour la table commission

comission [...]	om_fichier_commission_ordre_jour om_fichier_commission_compte_rendu
1 		              54dsf5-fdg2d4fg-df5g41dfg      fs://dfgv53dfsdgf47dfg5dsgfvfd
2 			
...

om_fichier_commission_ordre_jour sera placé dans le backend storage principal, om_fichier_commission_compte_rendu sera stocké dans le backend storage alternatif fs.

Pour les opérations RUD, le choix du BS se fait en examinant l’UID.

om_filestorage::filestorage

Dans l’abstracteur, le CRDU est modifié.
function __construct

  • chargement du mapping clé objet/fichier <> backend storage
  • instanciation des BS alternatifs

function create

  • si file_object_type est positionné, utilisation du bons BS pour la création
  • maj de l’UID avant de le renvoyer (ex : fs://dfgv53dfsdgf47dfg5dsgfvfd)

function get update delete

  • en fonction de l’UID, choix du bon BS avant de procéder aux opérations