From e331e5aac9b43886885497e52391d60523d00966 Mon Sep 17 00:00:00 2001
From: Anthony Borghi <anthony.borghi@veremes.com>
Date: Mon, 10 Dec 2018 14:06:00 +0100
Subject: [PATCH] Squashed 'src/module_gtf/' changes from 3378f9e3..aff16c61

aff16c61 Merge branch 'next_version' into next_app_gtf
397ded05 Merge branch 'master' into next_version
589a99a6 Classe Files_manager dans les web services (GTF)
d083d981 Correction d'un bug dans l'url des widgets de GTF
320f4d1e pull subtree
bed3fcfc Squashed 'src/vitis/' changes from d0507413..562cedd5
4cccc0e3 pull subtree
143bb262 Squashed 'src/vitis/' changes from 562cedd5..d0507413
9c4147d8 Squashed 'src/vitis/' changes from 562cedd5..d0507413
5257f83f Squashed 'src/vitis/' changes from 457060db..562cedd5

git-subtree-dir: src/module_gtf
git-subtree-split: aff16c6171516ac2e848f17111555e91f6f7abd9
---
 gtf.engine/gtf.engines/engine.php   |  22 ++++
 module/javascript/script_module.js  |  68 +++++------
 web_service/ws/Workspace.class.inc  |  33 +++---
 web_service/ws/Workspaces.class.inc | 169 ++++++++++++++++------------
 4 files changed, 171 insertions(+), 121 deletions(-)

diff --git a/gtf.engine/gtf.engines/engine.php b/gtf.engine/gtf.engines/engine.php
index 4d7af46b..6c2473b4 100755
--- a/gtf.engine/gtf.engines/engine.php
+++ b/gtf.engine/gtf.engines/engine.php
@@ -445,6 +445,17 @@ if ($ErrorLicense == "0") {
                                                         }
                                                     }
                                                 }
+                                                if (!file_exists($properties["transit_dir"] . "/failed/" . $sUser)) {
+                                                    mkdir($properties["transit_dir"] . "/failed/" . $sUser);
+                                                }
+                                                if (!file_exists($properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"])) {
+                                                    mkdir($properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"]);
+                                                }
+                                                rename($sSourceDirectory, $properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"]);
+                                                writeToLog(str_replace('[sSourceDirectory]', $sSourceDirectory, INFO_MOVING_FILE) . $properties["transit_dir"] . "/failed/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"] . '.', $properties["engine_log_file"]);
+                                            } else {
+                                                writeToLog(str_replace("[properties['transit_dir']]", $properties['transit_dir'], INFO_DIRECTORY_NOT_FOUND_ENGINE), $properties["engine_log_file"]);
+                                                $iStatut = $sEnErreur;
                                             }
                                             $sMessage = $oTraitement->sMessageErreur;
                                             $iStatut = $sEnErreur;
@@ -499,6 +510,17 @@ if ($ErrorLicense == "0") {
                                                         }
                                                     }
                                                 }
+                                                if (!file_exists($properties["transit_dir"] . "/success/" . $sUser)) {
+                                                    mkdir($properties["transit_dir"] . "/success/" . $sUser);
+                                                }
+                                                if (!file_exists($properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"])) {
+                                                    mkdir($properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"]);
+                                                }
+                                                rename($sSourceDirectory, $properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"]);
+                                                writeToLog(str_replace('[sSourceDirectory]', $sSourceDirectory, INFO_MOVING_FILE) . $properties["transit_dir"] . "/success/" . $sUser . "/" . $aTraitement["workspace_id"] . "/" . $aDemande["order_id"] . '.', $properties["engine_log_file"]);
+                                            } else {
+                                                writeToLog(str_replace("[properties['transit_dir']]", $properties['transit_dir'], INFO_DIRECTORY_NOT_FOUND_ENGINE), $properties["engine_log_file"]);
+                                                $iStatut = $sEnErreur;
                                             }
                                             $sMessage = "";
                                             $iStatut = 3;
diff --git a/module/javascript/script_module.js b/module/javascript/script_module.js
index 72413cbd..ef05d16c 100644
--- a/module/javascript/script_module.js
+++ b/module/javascript/script_module.js
@@ -778,7 +778,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         // Valeurs des champs cachés du form. de la demande.
         var oWkParams = {};
         //var aSerializedSubForm = angular.element("#double_form_right_section_" + envSrvc["oSelectedObject"]["name"] + " form").serializeArray();
-        //mise en forme pour fme 
+        //mise en forme pour fme
         /***********************************************************************/
 
         var encoderFME = function (str) {
@@ -813,14 +813,14 @@ vitisApp.on('appMainDrtvLoaded', function () {
                     //GTF_QUOTE et GTF BACKSLASH
                     /* var quote = "<GTF_QUOTE>";
                      var backslash = "<GTF_BACKSLASH>";
-                     
+
                      var clipper = result.substr(iresult, quote.length);
                      if (clipper === quote) {
                      istr += quote.length;
                      iresult += quote.length;
                      find = true;
                      }
-                     
+
                      clipper = result.substr(iresult, backslash.length);
                      console.error(result,clipper, iresult);
                      if (clipper === backslash) {
@@ -1093,7 +1093,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         // Sauve les valeurs du formulaire du projet FME + id de l'utilisateur connecté.
         envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["wk_params"] = sWkParams;
         //envSrvc["oFormValues"][envSrvc["sFormDefinitionName"]]["user_id"] = sessionStorage["user_id"];
-        // 
+        //
         envSrvc["sFormDefinitionName"] = envSrvc["sFormDefinitionName"].replace(/_subform/, "_form");
         // Envoi du formulaire.
         return scope["sendSimpleForm"](true);
@@ -1180,7 +1180,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
                 }
                 // 1er affichage ou tri de la liste : maj de la mise en forme.
                 var clearObserver = attrs.$observe("appMessageStatusIconColumn", function (value) {
-                    // Si le champ est vide : supprime l'icône.  
+                    // Si le champ est vide : supprime l'icône.
                     if (scope["row"]["entity"][scope["col"]["field"]] == null || String(scope["row"]["entity"][scope["col"]["field"]]) == "")
                         element[0].className = "";
                     else {
@@ -1219,7 +1219,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         }
     };
     vitisApp["compileProvider"].directive("appMessageStatusIconColumn", vitisApp.appMessageStatusIconColumnDrtv);
-    
+
     /**
      * appMessageBodyColumn directive.
      * Mise en forme de la colonne "body" dans la liste de l'onglet "my_work_3" (messages de gtf).
@@ -1230,7 +1230,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             link: function (scope, element, attrs) {
                 // 1er affichage ou tri de la liste : maj de la mise en forme.
                 var clearObserver = attrs.$observe("appMessageBodyColumn", function (value) {
-                    // Si le champ est vide : supprime l'icône.  
+                    // Si le champ est vide : supprime l'icône.
                     if (scope["row"]["entity"][scope["col"]["field"]] == null || scope["row"]["entity"][scope["col"]["field"]] == "")
                         element[0].className = "";
                     else {
@@ -1381,7 +1381,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         // .
         $log.info("checkCronExpression");
         var scope = this;
-        // Sauve le nouveau scope crée dans la définition de l'onglet. 
+        // Sauve le nouveau scope crée dans la définition de l'onglet.
         modesSrvc["addScopeToObject"](envSrvc["oSelectedObject"]["name"], envSrvc["oSelectedMode"]["mode_id"], scope);
         scope["oCheckCronExpressionResult"] = {};
         // Paramètres du service web (vitis, gtf...)
@@ -1546,7 +1546,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         //
         $log.info("ModifyEngine");
         var scope = this;
-        // Sauve le nouveau scope crée dans la définition de l'onglet. 
+        // Sauve le nouveau scope crée dans la définition de l'onglet.
         modesSrvc["addScopeToObject"](envSrvc["oSelectedObject"]["name"], envSrvc["oSelectedMode"]["mode_id"], scope);
         // Des demandes sont sélectionnées ?
         var aSelectedRows = scope.$root["gridApi"][scope["sSelectedGridOptionsName"]]["selection"]["getSelectedRows"]();
@@ -1894,7 +1894,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         // Sauve le nouvel onglet.
         var oMode = modesSrvc["getMode"](envSrvc["oSelectedMode"]["mode_id"]);
         oMode["objects"].push(angular.copy(envSrvc["oSelectedObject"]));
-        // Sauve le nouveau scope crée dans la définition de l'onglet. 
+        // Sauve le nouveau scope crée dans la définition de l'onglet.
         modesSrvc["addScopeToObject"](envSrvc["oSelectedObject"]["name"], envSrvc["oSelectedMode"]["mode_id"], scope);
         // Compilation du template "doubleFormTpl".
         //var sTemplateUrl = 'templates/doubleFormTpl.html';
@@ -2046,7 +2046,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         //
         $log.info("showGtfLicenseInfos");
         var scope = this.$new();
-        // Sauve le nouveau scope crée dans la définition de l'onglet. 
+        // Sauve le nouveau scope crée dans la définition de l'onglet.
         modesSrvc["addScopeToObject"](envSrvc["oSelectedObject"]["name"], envSrvc["oSelectedMode"]["mode_id"], scope);
         // Attends la compilation du formulaire de la section "licence".
         var clearListener = scope.$root.$on('endFormNgRepeat', function (event) {
@@ -2101,7 +2101,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         $log.info("showGtfLincenseFileRequestForm");
         // Crée un nouveau scope.
         var scope = this.$new();
-        // Sauve le nouveau scope crée dans la définition de l'onglet. 
+        // Sauve le nouveau scope crée dans la définition de l'onglet.
         modesSrvc["addScopeToObject"](envSrvc["oSelectedObject"]["name"], envSrvc["oSelectedMode"]["mode_id"], scope);
         //
         var sFormId = "form_gtf_license_file_request_" + envSrvc["oSelectedObject"]["name"];
@@ -2366,7 +2366,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             "sUrl": "modules/gtf/forms/" + envSrvc["oSelectedMode"]["mode_id"] + "/" + sTable + "_" + envSrvc["oSectionForm"][sTable]["sections"][envSrvc["oSectionForm"][sTable]["iSelectedSectionIndex"]]["name"] + ".json"
         };
     };
-	
+
     /**
      * loadLicenseConfig function.
      * Chargement de la section "Licence" dans l'onglet "Configuration".
@@ -2527,7 +2527,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             var oFormValues = envSrvc['oFormValues'][envSrvc['sFormDefinitionName']];
             // Paramètres pour le template du widget.
             scope['oWidgetParams'] = {
-                'client_url': propertiesSrvc['web_server_name'] + '/' + propertiesSrvc['application_name'],
+                'client_url': propertiesSrvc['web_server_name'] + '/' + propertiesSrvc['application'],
                 'button_label': vitisApp['htmlentities'](oFormValues['buttonText'])
             };
             // Fichiers js à charger.
@@ -3182,7 +3182,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             "sUrl": "modules/gtf/forms/" + envSrvc["oSelectedMode"]["mode_id"] + "/" + sTable + "_" + envSrvc["oSectionForm"][sTable]["sections"][envSrvc["oSectionForm"][sTable]["iSelectedSectionIndex"]]["name"] + ".json"
         };
     };
-    
+
     /**
      * displayFormFields function.
      * Affiche la liste des champs de formulaire passée en paramètre et cache les autres.
@@ -3221,11 +3221,11 @@ vitisApp.on('appMainDrtvLoaded', function () {
             var formScope = angular.element("form[name='" + envSrvc["oFormDefinition"][envSrvc["sFormDefinitionName"]]["name"]).scope();
             formScope.$broadcast('$$rebind::refresh');
             formScope.$applyAsync();
-            // 
+            //
             externFunctionSrvc["resizeWin"]();
         }
     };
-    
+
     /**
      * initGtfFmeEngineForm function.
      * Traitements avant l'affichage du formulaire de l'onglet "Moteur FME".
@@ -3262,7 +3262,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
                 $rootScope["refreshFmeServerInstanceStatus"]();
         });
     };
-    
+
     /**
      * setGtfFmeEngineForm function.
      * Affichage des champs du formulaire de l'onglet "Moteur FME" suivant le type passé.
@@ -3322,7 +3322,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             });
         }
     }
-    
+
     /**
      * generateGtfInstanceId function.
      * Génération de l'identifiant de l'instance de GTF.
@@ -3348,7 +3348,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
                     $translate("SUCCESSFUL_OPERATION").then(function (sTranslation) {
                         $.notify(sTranslation, "success");
                     });
-                } 
+                }
                 else {
                     var oOptions = {"className": "modal-danger"};
                     // Message d'erreur ?
@@ -3359,7 +3359,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
-    
+
     /**
      * afterGtfEngineForm function.
      * Traitement apès l'envoi du formulaire de l'onglet "Moteur GTF".
@@ -3377,7 +3377,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             $rootScope["editSectionForm"]()
         });
     };
-    
+
     /**
      * deleteGtfEngine function.
      * Suppression d'un ou plusieurs moteurs GTF.
@@ -3399,7 +3399,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         // Supprime les enregistrements.
         $rootScope["DeleteSelection"]();
     };
-    
+
     /**
      * downloadGtfWorkspaceFile function.
      * Téléchargement d'un fichier du répertoire "workspace" d'un projet.
@@ -3441,7 +3441,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
-    
+
     /**
      * StartFmeServerInstance function.
      * Démarre une instance Fme Server (Fme Cloud).
@@ -3482,7 +3482,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
-    
+
     /**
      * PauseFmeServerInstance function.
      * Met en pause une instance Fme Server (Fme Cloud).
@@ -3525,7 +3525,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
-    
+
     /**
      * getFmeServerInstance function.
      * Retourne une instance Fme Server (Fme Cloud).
@@ -3615,7 +3615,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
-    
+
     /**
      * setFmeServerInstanceButtonsStatus function.
      * Active ou désactive les boutons de l'instance Fme Server suivant son statut.
@@ -3646,7 +3646,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         formScope.$broadcast('$$rebind::refresh');
         formScope.$applyAsync();
     };
-    
+
     /**
      * removeFmeServerInstanceInfo function.
      * Supprime les informations d'une instance Fme Server sur Fme Cloud.
@@ -3661,7 +3661,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
         if (oContainerElement !== null)
             oContainerElement.parentElement.removeChild(oContainerElement);
     };
-    
+
     /**
      * refreshFmeServerInstanceStatus function.
      * Charge et met à jour le statut d'une instance Fme Server.
@@ -3693,7 +3693,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
-    
+
     /**
      * setFmeServerInstanceStatus function.
      * Met à jour le statut d'une instance Fme Server dans le formulaire "Moteur FME".
@@ -3769,7 +3769,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             oFormValues["fme_server_instance_status"] = sTranslation;
         });
     };
-    
+
     /**
      * testAmazonS3BucketConnection function.
      * Teste la connexion vers un bucket Amazon S3.
@@ -3827,7 +3827,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
-    
+
     /**
      * deleteGtfOrders function.
      * Suppression d'une ou plusieurs demandes.
@@ -3871,7 +3871,7 @@ vitisApp.on('appMainDrtvLoaded', function () {
             }
         });
     };
-    
+
     /**
      * stopOrderProcess function.
      * Arrête une demande en cours.
@@ -3926,4 +3926,4 @@ vitisApp.on('appMainDrtvLoaded', function () {
         else
             $rootScope["modalWindow"]("dialog", "ERROR_STOP_ORDER_PROCESS_NO_SELECTION_SUPERVISION_ORDER", oOptions);
     };
-});
\ No newline at end of file
+});
diff --git a/web_service/ws/Workspace.class.inc b/web_service/ws/Workspace.class.inc
index 22916328..183128f8 100755
--- a/web_service/ws/Workspace.class.inc
+++ b/web_service/ws/Workspace.class.inc
@@ -2,6 +2,7 @@
 
 require_once 'Gtf.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/files/Files_manager.class.inc';
 
 /**
  * \file Workspace.class.inc
@@ -12,7 +13,7 @@ require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection
  * 	\brief This file contains the Workspace php class
  *
  * This class defines operation for one Workspace
- * 
+ *
  */
 class Workspace extends GTF {
 
@@ -32,7 +33,7 @@ class Workspace extends GTF {
     }
 
     /**
-     * @SWG\Get(path="/workspaces/{workspace_id}", 
+     * @SWG\Get(path="/workspaces/{workspace_id}",
      *   tags={"Workspaces"},
      *   summary="Get Workspace",
      *   description="Request to get Workspace by id",
@@ -169,6 +170,7 @@ class Workspace extends GTF {
      * get informations about workspace
      */
     function GET() {
+        $oFilesManager = new Files_manager($this->aProperties);
         if (!empty($this->aValues["form"])) {
             require $this->sRessourcesFile;
             $this->aFields = $this->getFields($this->aProperties['schema_gtf'], "v_workspace", "workspace_id");
@@ -186,20 +188,19 @@ class Workspace extends GTF {
                 $this->oError = new VitisError(1, "Error parameter is not a known mode");
             }
             // Contenu du fichier de formulaire.
-            $sFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'form', $sFile);
+            $sDirPath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"];
+            $sFileContent = $oFilesManager->oFileInterface->file_get_contents($sDirPath . '/form/' . $sFile);
             if ($sFileContent !== false) {
                 $aJson = json_decode($sFileContent, true);
                 $this->aFields["json_form"] = array($aJson);
                 $sJs = "";
                 $sCss = "";
                 // Url du fichier js du formulaire.
-                $sFileUrl = getFileUrlInWsDataDir('gtf', 'workspace', $this->aValues['my_vitis_id'], 'form/ressources', 'Subform.js');
-                if ($sFileUrl !== false)
-                    $sJs = $sFileUrl;
+                $sFileUrl = $oFilesManager->oFileInterface->getProxyPassUrl($sDirPath . '/form/ressources/Subform.js');
+                $sJs = $sFileUrl;
                 // Url du fichier css du formulaire.
-                $sFileUrl = getFileUrlInWsDataDir('gtf', 'workspace', $this->aValues['my_vitis_id'], 'form/ressources', 'Subform.css');
-                if ($sFileUrl !== false)
-                    $sCss = $sFileUrl;
+                $sFileUrl = $oFilesManager->oFileInterface->getProxyPassUrl($sDirPath . '/form/ressources/Subform.css');
+                $sCss = $sFileUrl;
                 //
                 array_push($this->aFields["json_form"], $sJs);
                 array_push($this->aFields["json_form"], $sCss);
@@ -212,13 +213,15 @@ class Workspace extends GTF {
             $this->getGroups();
             // Url vers le fichier fmw du projet.
             if (!empty($this->aFields['fmw_file'])) {
-                $sFmwFileUrl = getFileUrlInWsDataDir('gtf', 'workspace', $this->aValues['my_vitis_id'], 'fme', $this->aFields['fmw_file']);
-                if ($sFmwFileUrl !== false)
+                $sFilePath = $this->aProperties['workspace_dir'] . '/' . $this->aValues['my_vitis_id'] . '/fme/' . $this->aFields['fmw_file'];
+                $sFmwFileUrl = $oFilesManager->oFileInterface->getProxyPassUrl($sFilePath);
+                if (!empty($sFmwFileUrl))
                     $this->aFields['fmw_file_url'] = $sFmwFileUrl;
             }
         }
         // Formatage de la colonne "form_type".
-        if (!fileExistsInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json'))
+        $sFilePath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/form/Subform.json';
+        if (!$oFilesManager->oFileInterface->file_exists($sFilePath))
             $this->aFields['form_type'] = '';
         else {
             if ($this->aFields['form_type'] != "custom")
@@ -258,10 +261,12 @@ class Workspace extends GTF {
             $this->oError = new VitisError(1, $this->oConnection->oBd->getBDMessage());
         } else {
             // Suppression du répertoire du projet FME.
-            deleteDirectoryInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], '', '');
+            $oFilesManager = new Files_manager($this->aProperties);
+            $sDirPath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"];
+            $oFilesManager->oFileInterface->clearDir($sDirPath);
         }
     }
 
 }
 
-?>
\ No newline at end of file
+?>
diff --git a/web_service/ws/Workspaces.class.inc b/web_service/ws/Workspaces.class.inc
index 0e9a34d2..63d7fd78 100755
--- a/web_service/ws/Workspaces.class.inc
+++ b/web_service/ws/Workspaces.class.inc
@@ -9,7 +9,7 @@
  * 	\brief This file contains the Workspaces php class
  *
  * This class defines Rest Api to Gtf workspaces
- * 
+ *
  */
 require_once 'Gtf.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vitis_lib/Connection.class.inc';
@@ -17,6 +17,7 @@ require_once 'Workspace.class.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/BdDataAccess.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/phpUtil.inc';
 require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/gtf_lib/GtfFmwParser.class.inc';
+require_once dirname($_SERVER['SCRIPT_FILENAME']) . '/class/vmlib/files/Files_manager.class.inc';
 
 class Workspaces extends GTF {
     /**
@@ -168,8 +169,10 @@ class Workspaces extends GTF {
             $aReturn = $this->genericGet($this->aProperties['schema_gtf'], "v_workspace", "workspace_id");
             // Formatage de la colonne "form_type".
             if ($aReturn['sStatus'] == 1) {
+                $oFilesManager = new Files_manager($this->aProperties);
                 foreach ($this->aObjects as &$oWorkspace) {
-                    if (!fileExistsInWsDataDir('gtf', 'workspace', $oWorkspace->aFields['workspace_id'], 'form', 'Subform.json'))
+                    $sFilePath = $this->aProperties['workspace_dir'] . '/' . $oWorkspace->aFields['workspace_id'] . '/form/Subform.json';
+                    if (!$oFilesManager->oFileInterface->file_exists($sFilePath))
                         $oWorkspace->aFields['form_type'] = '';
                     else {
                         if ($oWorkspace->aFields['form_type'] != "custom")
@@ -308,8 +311,9 @@ class Workspaces extends GTF {
      * @return id of the workspace created
      */
     function POST() {
+        $oFilesManager = new Files_manager($this->aProperties);
         require $this->sRessourcesFile;
-        // Importation de projets.
+        // Création du fichier html du widget.
         if (!empty($this->aPath[3]) && $this->aPath[3] === "GenerateWidgetFile") {
             unset($this->aPath[3]);
             $oWorkspace = new Workspace($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
@@ -320,10 +324,15 @@ class Workspaces extends GTF {
             $sWidgetHtml = '<!DOCTYPE html>' . PHP_EOL . '<html>' . PHP_EOL . '<head>' . PHP_EOL . '<title>Widget</title>' . PHP_EOL . '<meta name="viewport" content="width=device-width, initial-scale=1.0">' . PHP_EOL . '<meta http-equiv="X-UA-Compatible" content="IE=edge">' . PHP_EOL . '</head>' . PHP_EOL . '<body>';
             $sWidgetHtml .= $this->aValues['widgetFileContent'];
             $sWidgetHtml .= '' . PHP_EOL . '</body>' . PHP_EOL . '</html>';
+            // Création du répertoire des widgets si inexistant.
+            $sDirPath = $this->aProperties['ws_data_dir'] . '/gtf/widget';
+            if (!$oFilesManager->oFileInterface->is_dir($sDirPath))
+                $oFilesManager->oFileInterface->mkdir($sDirPath, 0777, true);
             // Création du fichier du widget.
-            if (putFileContentInWsDataDir('gtf', 'widget', '', '', $sWorkspace_key . ".html", $sWidgetHtml) !== false) {
+            $sFilePath = $sDirPath . '/' . $sWorkspace_key . ".html";
+            if ($oFilesManager->oFileInterface->file_put_contents($sFilePath, $sWidgetHtml) !== false) {
                 // Url du fichier du widget.
-                $sFileUrl = getFileUrlInWsDataDir('gtf', 'widget', '', '', $sWorkspace_key . ".html");
+                $sFileUrl = $oFilesManager->oFileInterface->getProxyPassUrl($sFilePath);
                 if ($sFileUrl !== false)
                     $this->aFields['widget_file_url'] = $sFileUrl;
                 $aXmlRacineAttribute['status'] = 1;
@@ -336,6 +345,7 @@ class Workspaces extends GTF {
             }
             return $sMessage;
         }
+        // Importation de projets.
         if (!empty($this->aValues['mode']) && $this->aValues['mode'] == "import") {
             for ($i = 0; $i < count($_FILES['fmw_file']['name']); $i++) {
                 $aParams = array();
@@ -384,7 +394,8 @@ class Workspaces extends GTF {
                     $sFilePathName = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields["workspace_id"] . "/fme/" . $_FILES['fmw_file']['name'][$i];
                     $sDirName = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields["workspace_id"];
                     // Si le répertoire existe déja : suppression.
-                    deleteDirectoryInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], '', '');
+                    if ($oFilesManager->oFileInterface->is_dir($sDirName))
+                        $oFilesManager->oFileInterface->clearDir($sDirName);
                     // Upload du fichier fmw.
                     $this->aValues['fme'] = $this->aValues['fmw_file'];
                     $_FILES['fme'] = array(
@@ -402,21 +413,22 @@ class Workspaces extends GTF {
                         $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
                     } else {
                         // Copie du .fmw original en .bak.
-                        copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'][$i], $_FILES['fmw_file']['name'][$i] . '.bak');
+                        $oFilesManager->oFileInterface->copy($sDirName . '/fme/' . $_FILES['fmw_file']['name'][$i], $sDirName . '/fme/' . $_FILES['fmw_file']['name'][$i] . '.bak');
                         // Création des fichiers vides de ressources js et css.
-                        putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.js', '');
-                        putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.css', '');
+                        $oFilesManager->oFileInterface->mkdir($sDirName . '/form/ressources', 0777, true);
+                        $oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/ressources/Subform.js', '');
+                        $oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/ressources/Subform.css', '');
                         // Lit le contenu du fichier .fmw du projet.
-                        $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'][$i]);
+                        $sFmwFileContent = $oFilesManager->oFileInterface->file_get_contents($sDirName . '/fme/' . $_FILES['fmw_file']['name'][$i]);
                         // Sauve le .fmw sans les visualizers.
                         $oFmwParser = new GtfFmwParser($_FILES['fmw_file']['name'][$i], $this->aProperties, $sFmwFileContent);
                         $oFmwParser->save($oFmwParser->sFmwFileName);
-                        putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'][$i], file_get_contents($oFmwParser->sFmwFileName));
+                        $oFilesManager->oFileInterface->file_put_contents($sDirName . '/fme/' . $_FILES['fmw_file']['name'][$i], file_get_contents($oFmwParser->sFmwFileName));
                         // Création des formulaires json.
                         $aJson = $oFmwParser->productJson($oWorkspace->aFields["name"]);
-                        if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', json_encode($aJson)) !== false) {
-                            copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', 'WSubform.json');
-                            copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', 'DSubform.json');
+                        if ($oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/Subform.json', json_encode($aJson)) !== false) {
+                            $oFilesManager->oFileInterface->copy($sDirName . '/form/Subform.json', $sDirName . '/form/WSubform.json');
+                            $oFilesManager->oFileInterface->copy($sDirName . '/form/Subform.json', $sDirName . '/form/DSubform.json');
                         }
                         $oFmwParser->updateMetadata($this->oConnection->oBd, $oWorkspace->aFields["workspace_id"]);
                         //
@@ -458,7 +470,7 @@ class Workspaces extends GTF {
                     $oError = new VitisError(1, "FORM_WORKSPACE_NAME_EXISTS_PUBLICATION_WORKSPACE");
                     $aXmlRacineAttribute['status'] = 0;
                     $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
-                }          
+                }
                 else {
                     $this->aValues['creation_date'] = gmdate('Y-m-d H:i:s');
                     // Création de la clé du projet.
@@ -506,12 +518,12 @@ class Workspaces extends GTF {
                                 }
                                 $sDirName = $this->aProperties['workspace_dir'] . "/" . $oWorkspace->aFields["workspace_id"];
                                 // Si le répertoire existe déja : suppression.
-                                deleteDirectoryInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], '', '');
+                                if ($oFilesManager->oFileInterface->is_dir($sDirName))
+                                    $oFilesManager->oFileInterface->clearDir($sDirName);
                                 // Upload du fichier fmw.
                                 $this->aValues['fme'] = $this->aValues['fmw_file'];
                                 $_FILES['fme'] = $_FILES['fmw_file'];
                                 $sErrorMessage = uploadInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], "fme", $this->aValues, -1, "fmw");
-                                // Copie du .fmw original en .bak.
                                 if (!empty($sErrorMessage)) {
                                     writeToErrorLog($sErrorMessage);
                                     $oError = new VitisError(8, $sErrorMessage);
@@ -519,10 +531,12 @@ class Workspaces extends GTF {
                                     $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
                                 }
                                 else {
-                                    copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'], $_FILES['fmw_file']['name'] . '.bak');
+                                    // Copie du .fmw original en .bak.
+                                    $oFilesManager->oFileInterface->copy($sDirName . '/fme/' . $_FILES['fmw_file']['name'], $sDirName . '/fme/' . $_FILES['fmw_file']['name'] . '.bak');
                                     // Création des fichiers vides de ressources js et css.
-                                    putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.js', '');
-                                    putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.css', '');
+                                    $oFilesManager->oFileInterface->mkdir($sDirName . '/form/ressources', 0777, true);
+                                    $oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/ressources/Subform.js', '');
+                                    $oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/ressources/Subform.css', '');
                                     // Upload du fichier de ressource.
                                     if ($this->aValues["comp_file"] != "") {
                                         // Si le fichier est une archive .zip -> décompression et copie des fichiers.
@@ -533,16 +547,16 @@ class Workspaces extends GTF {
                                         $sErrorMessage = uploadInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], "fme", $this->aValues);
                                     }
                                     // Lit le contenu du fichier .fmw du projet.
-                                    $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name']);
+                                    $sFmwFileContent = $oFilesManager->oFileInterface->file_get_contents($sDirName . '/fme/' . $_FILES['fmw_file']['name']);
                                     // Sauve le .fmw sans les visualizers.
                                     $oFmwParser = new GtfFmwParser($_FILES['fmw_file']['name'], $this->aProperties, $sFmwFileContent);
                                     $oFmwParser->save($oFmwParser->sFmwFileName);
-                                    putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $_FILES['fmw_file']['name'], file_get_contents($oFmwParser->sFmwFileName));
+                                    $oFilesManager->oFileInterface->file_put_contents($sDirName . '/fme/' . $_FILES['fmw_file']['name'], file_get_contents($oFmwParser->sFmwFileName));
                                     // Création des formulaires json.
                                     $aJson = $oFmwParser->productJson($oWorkspace->aFields["name"]);
-                                    if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', json_encode($aJson)) !== false) {
-                                        copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', 'WSubform.json');
-                                        copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json', 'DSubform.json');
+                                    if ($oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/Subform.json', json_encode($aJson)) !== false) {
+                                        $oFilesManager->oFileInterface->copy($sDirName . '/form/Subform.json', $sDirName . '/form/WSubform.json');
+                                        $oFilesManager->oFileInterface->copy($sDirName . '/form/Subform.json', $sDirName . '/form/DSubform.json');
                                     }
                                     $oFmwParser->updateMetadata($this->oConnection->oBd, $oWorkspace->aFields["workspace_id"]);
                                     /*                         * ************************************************************** */
@@ -695,6 +709,7 @@ class Workspaces extends GTF {
      * @return id of the workspace if ok error object if ko
      */
     function PUT() {
+        $oFilesManager = new Files_manager($this->aProperties);
         if (!empty($this->aValues["action"]) && $this->aValues["action"] == "Metadata") {
             $aReturn = $this->reintegrateMetadata();
             $aXmlRacineAttribute['status'] = $aReturn['status'];
@@ -706,14 +721,9 @@ class Workspaces extends GTF {
             }
         } else {
             $sDirName = $this->aProperties['workspace_dir'] . "/" . (string) $this->aValues["my_vitis_id"];
-
-
-            $sDirName = $this->aProperties['workspace_dir'] . "/" . (string) $this->aValues["my_vitis_id"];
-
             $error_message = "";
-
             // Si le dossier {id} n'existe pas (Important pour gérer les erreurs)
-            if (isDirInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"]) !== true) {
+            if (!$oFilesManager->oFileInterface->is_dir($sDirName)) {
                 $error_message .= $sDirName . " does not exist";
                 writeToErrorLog("WARNING: " . $error_message);
 
@@ -724,7 +734,7 @@ class Workspaces extends GTF {
                 return $sMessage;
             }
             // Si le dossier {id}/fme n'existe pas (Important pour gérer les erreurs)
-            if (isDirInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme') !== true) {
+            if (!$oFilesManager->oFileInterface->is_dir($sDirName . '/fme')) {
                 $error_message .= $sDirName . "/fme does not exist";
                 writeToErrorLog("WARNING: " . $error_message);
 
@@ -736,10 +746,11 @@ class Workspaces extends GTF {
             }
 
             // Si le dossier {id}/form n'existe pas il est crée
-            if (isDirInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form') !== true) {
+            if (!$oFilesManager->oFileInterface->is_dir($sDirName . '/form')) {
                 writeToErrorLog("WARNING: " . $sDirName . "/form dit not exist");
-                if ($this->aProperties['fileS3Uploader'] === false)
-                    @mkdir($sDirName . "/form");
+                $oFilesManager->oFileInterface->mkdir($sDirName . '/form', 0777, true);
+                //if ($this->aProperties['fileS3Uploader'] === false)
+                    //@mkdir($sDirName . "/form");
             }
 
             if (!empty($this->aValues["cmd"])) {
@@ -750,13 +761,13 @@ class Workspaces extends GTF {
                     // Remplace le formulaire publié par celui par défaut
                     case "Default_Published":
                         // Si le fichier par défaut n'existe pas, il est généré
-                        if (!fileExistsInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json')) {
+                        if (!$oFilesManager->oFileInterface->file_exists($sDirName . '/form/DSubform.json')) {
                             $this->aValues["cmd"] = "Default_Reset";
                             $this->PUT();
                         }
                         // Remplace 'Subform.json' par le formulaire par défaut 'DSubform.json'.
-                        deleteFileFromWsDataDirTree('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json');
-                        copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', 'Subform.json');
+                        $oFilesManager->oFileInterface->unlink($sDirName . '/form/Subform.json');
+                        $oFilesManager->oFileInterface->copy($sDirName . '/form/DSubform.json', $sDirName . '/form/Subform.json');
                         $this->aValues["form_type"] = 'default';
                         break;
                     // Regénère le formulaire par défaut en fonction du fmw
@@ -766,7 +777,6 @@ class Workspaces extends GTF {
                         if (empty($oWorkspace->aFields["fmw_file"])) {
                             $error_message .= "Any FME file founded in" . $sDirName . "/fme/ ";
                             writeToErrorLog("WARNING: " . $error_message);
-
                             $aXmlRacineAttribute['status'] = 0;
                             $this->aFields = array();
                             $this->aFields['errorMessage'] = $error_message;
@@ -774,44 +784,44 @@ class Workspaces extends GTF {
                             return $sMessage;
                         }
                         // Lit le contenu du fichier .fmw du projet.
-                        $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $oWorkspace->aFields["fmw_file"]);
+                        $sFmwFileContent = $oFilesManager->oFileInterface->file_get_contents($sDirName . '/fme/' . $oWorkspace->aFields["fmw_file"]);
                         // Création des formulaires json.
                         $oFmwParser = new GtfFmwParser($oWorkspace->aFields["fmw_file"], $this->aProperties, $sFmwFileContent);
                         $aJson = $oFmwParser->productJson($oWorkspace->aFields["name"]);
-                        if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', json_encode($aJson)) === false)
+                        if ($oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/DSubform.json', json_encode($aJson)) === false)
                             writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)");
                         //$oFmwParser->updateMetadata($this->oConnection->oBd, $oWorkspace->aFields["workspace_id"]);
                         break;
                     // Remplace le formulaire publié par celui personnalisé
                     case "Perso_Published" :
-                        deleteFileFromWsDataDirTree('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'Subform.json');
-                        copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'WSubform.json', 'Subform.json');
+                        $oFilesManager->oFileInterface->unlink($sDirName . '/form/Subform.json');
+                        $oFilesManager->oFileInterface->copy($sDirName . '/form/WSubform.json', $sDirName . '/form/Subform.json');
                         $this->aValues["form_type"] = 'custom';
                         break;
                     // Remplace le fornulaire personnalisé par le formulaire par défaut
                     case "Perso_Reset":
                         // Si le fichier par défaut n'existe pas, il est généré
-                        if (!fileExistsInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json')) {
+                        if (!$oFilesManager->oFileInterface->file_exists($sDirName . '/form/DSubform.json')) {
                             $this->aValues["cmd"] = "Default_Reset";
                             $this->PUT();
                         }
                         // Remplace 'Subform.json' par 'WSubform.json'.
-                        deleteFileFromWsDataDirTree('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'WSubform.json');
-                        copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', 'WSubform.json');
+                        $oFilesManager->oFileInterface->unlink($sDirName . '/form/WSubform.json');
+                        $oFilesManager->oFileInterface->copy($sDirName . '/form/DSubform.json', $sDirName . '/form/WSubform.json');
                         break;
                     // Sauvegarde le formulaire personnalisé.
                     case "Perso_Save":
                         // Sauve le formulaire personnalisé.
-                        if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'WSubform.json', $this->aValues["Json"]) === false)
+                        if ($oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/WSubform.json', $this->aValues["Json"]) === false)
                             writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)");
                         // Sauve le javascript.
                         if ($this->aValues["Js"] != "") {
-                            if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.js', $this->aValues["Js"]) === false)
+                            if ($oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/ressources/Subform.js', $this->aValues["Js"]) === false)
                                 writeToErrorLog("Subform.json can't be writed : " . $sDirName . "/form/ressources/Subform.json" . "(Workspaces.class.inc : verify the folder's rights)");
                         }
                         // Sauve le css.
                         if ($this->aValues["Css"] != "") {
-                            if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.css', $this->aValues["Css"]) === false)
+                            if ($oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/ressources/Subform.css', $this->aValues["Css"]) === false)
                                 writeToErrorLog("Subform.css can't be writed : " . $sDirName . "/form/ressources/Subform.css" . "(Workspaces.class.inc : verify the folder's rights)");
                         }
                         break;
@@ -824,7 +834,8 @@ class Workspaces extends GTF {
             // Upload du fichier de ressource.
             if (!empty($this->aValues["comp_file_file"])) {
                 $this->aValues["comp_file"] = $this->aValues["comp_file_name"];
-                putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues["comp_file_name"], $this->aValues["comp_file_file"]);
+                $sFilePath = $sDirName . '/fme/' . $this->aValues["comp_file_name"];
+                $oFilesManager->oFileInterface->file_put_contents($sFilePath, $this->aValues["comp_file_file"]);
                 // Si le fichier est une archive .zip -> décompression et copie du répertoire.
                 if (pathinfo($this->aValues["comp_file"], PATHINFO_EXTENSION) == "zip") {
                     $sZipFilePath = $this->aProperties['extract_dir'] . '/' . $this->aValues["comp_file_name"];
@@ -858,8 +869,8 @@ class Workspaces extends GTF {
                         $aExt = explode(".", $this->aValues["fmw_file_name"]);
                         if ($aExt[count($aExt) - 1] == "fmw") {
                             // Sauve le nouveau fichier fmw.
-                            putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues["fmw_file_name"], $this->aValues["fmw_file_file"]);
-                            // Copie du .fmw original en .bak.
+                            $sFilePath = $sDirName . '/fme/' . $this->aValues["fmw_file_name"];
+                            $oFilesManager->oFileInterface->file_put_contents($sFilePath, $this->aValues["fmw_file_file"]);
                             if (!empty($sErrorMessage)) {
                                 writeToErrorLog($sErrorMessage);
                                 $oError = new VitisError(8, $sErrorMessage);
@@ -867,21 +878,22 @@ class Workspaces extends GTF {
                                 $sMessage = $oError->asDocument('', 'vitis', $this->aValues['sEncoding'], True, $aXmlRacineAttribute, $this->aValues['sSourceEncoding'], $this->aValues['output']);
                             }
                             else {
-                                copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues['fmw_file_name'], $this->aValues['fmw_file_name'] . '.bak');
+                                // Copie du .fmw original en .bak.
+                                $oFilesManager->oFileInterface->copy($sDirName . '/fme/' . $this->aValues['fmw_file_name'], $sDirName . '/fme/' . $this->aValues['fmw_file_name'] . '.bak');
                                 // Création des fichiers vides de ressources js et css.
-                                putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.js', '');
-                                putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form/ressources', 'Subform.css', '');
+                                $oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/ressources/Subform.js', '');
+                                $oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/ressources/Subform.css', '');
                                 // Lit le contenu du fichier .fmw du projet.
-                                $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $this->aValues['fmw_file_name']);
+                                $sFmwFileContent = $oFilesManager->oFileInterface->file_get_contents($sDirName . '/fme/' . $this->aValues['fmw_file_name']);
                                 // Sauve le .fmw sans les visualizers.
                                 $oFmwParser = new GtfFmwParser($this->aValues['fmw_file_name'], $this->aProperties, $sFmwFileContent);
                                 $oFmwParser->save($oFmwParser->sFmwFileName);
-                                putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues['fmw_file_name'], file_get_contents($oFmwParser->sFmwFileName));
+                                $oFilesManager->oFileInterface->file_put_contents($sDirName . '/fme/' . $this->aValues['fmw_file_name'], file_get_contents($oFmwParser->sFmwFileName));
                                 // Création des formulaires json.
                                 $aJson = $oFmwParser->productJson($oWorkspace->aFields["name"]);
-                                if (putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', json_encode($aJson)) !== false && $oWorkspace->aFields["form_type"] == 'default') {
-                                    copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', 'WSubform.json');
-                                    copyFileInWsDataDir ('gtf', 'workspace', $this->aValues["my_vitis_id"], 'form', 'DSubform.json', 'Subform.json');
+                                if ($oFilesManager->oFileInterface->file_put_contents($sDirName . '/form/DSubform.json', json_encode($aJson)) !== false) {
+                                    $oFilesManager->oFileInterface->copy($sDirName . '/form/DSubform.json', $sDirName . '/form/WSubform.json');
+                                    $oFilesManager->oFileInterface->copy($sDirName . '/form/DSubform.json', $sDirName . '/form/Subform.json');
                                 }
                                 // Récupère les anciens paramètres.
                                 $oFmwParser->getBdMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]);
@@ -1053,7 +1065,9 @@ class Workspaces extends GTF {
                 $oWorkspace->GET();
                 $sWorkspace_key = $oWorkspace->aFields["key"];
                 // Suppression du fichier de widget.
-                if (deleteFileFromWsDataDirTree('gtf', 'widget', '', '', $sWorkspace_key . '.html') === false) {
+                $oFilesManager = new Files_manager($this->aProperties);
+                $sFilePath = $this->aProperties['ws_data_dir'] . '/gtf/widget/' . $sWorkspace_key . '.html';
+                if ($oFilesManager->oFileInterface->file_exists($sFilePath) && !$oFilesManager->oFileInterface->unlink($sFilePath)) {
                     $aReturn = array('status' => 0, 'message' => 'DELETE_FILE_ERROR_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY', 'error_code' => null);
                     writeToErrorLog('Failed to remove the wisget file ' . $sWorkspace_key . '.html');
                 }
@@ -1087,7 +1101,7 @@ class Workspaces extends GTF {
             }
             else
                 $this->aFields['tree'] = $aWorkspaceDirectoryTree;
-        }            
+        }
         else {
             $sWorkspaceDir = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme';
             $sTreeName = 'fme';
@@ -1159,7 +1173,7 @@ class Workspaces extends GTF {
                 // Sauve le nom et la date du fichier.
                 $aFilteredDir['files'][] = array(
                     'path' => utf8_encode($sPath),
-                    'last_modif' => floor((time() - $aFileInfos['mtime']) / (24 * 3600))    // dernière modif. (Nb jours). 
+                    'last_modif' => floor((time() - $aFileInfos['mtime']) / (24 * 3600))    // dernière modif. (Nb jours).
                 );
             }
         }
@@ -1171,7 +1185,9 @@ class Workspaces extends GTF {
      */
     function getWorkspaceFile() {
         // Chargement du contenu du fichier.
-        $sFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $this->aValues['file_name']);
+        $oFilesManager = new Files_manager($this->aProperties);
+        $sFilePath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme/' . $this->aValues['file_name'];
+        $sFileContent = $oFilesManager->oFileInterface->file_get_contents($sFilePath);
         if ($sFileContent !== false) {
             // Copie du fichier dans un répertoire temporaire.
             $sFilePath = $this->aProperties['extract_dir'] . '/' . getUniqRandomId() . '/' . $this->aValues['file_name'];
@@ -1196,21 +1212,22 @@ class Workspaces extends GTF {
      *  Check if Widget file exist
      */
     function checkWidgetFile() {
+        $oFilesManager = new Files_manager($this->aProperties);
         $aReturn = array('status' => 1);
         unset($this->aPath[3]);
         $oWorkspace = new Workspace($this->aPath, $this->aValues, $this->aProperties, $this->oConnection);
         $oWorkspace->GET();
         $this->aFields['workspace_key'] = $oWorkspace->aFields["key"];
         $sWidgetFile = $this->aFields['workspace_key'] . '.html';
-        if (!fileExistsInWsDataDir('gtf', 'widget', '', '', $sWidgetFile)) {
+        $sFilePath = $this->aProperties['ws_data_dir'] . '/gtf/widget/' . $sWidgetFile;
+        if (!$oFilesManager->oFileInterface->file_exists($sFilePath)) {
             $aReturn = array('status' => 0, 'error_code' => 13, 'message' => 'The file ' . $sWidgetFile . ' does not exist.');
             WriteToErrorLog("The file '$sWidgetFile' does not exist.");
         }
         else {
             // Url du fichier du widget.
-            $sFileUrl = getFileUrlInWsDataDir('gtf', 'widget', '', '', $sWidgetFile);
-            if ($sFileUrl !== false)
-                $this->aFields['widget_file_url'] = $sFileUrl;
+            $sFileUrl = $oFilesManager->oFileInterface->getProxyPassUrl($sFilePath);
+            $this->aFields['widget_file_url'] = $sFileUrl;
         }
         return $aReturn;
     }
@@ -1219,8 +1236,10 @@ class Workspaces extends GTF {
      * Delete workspace file.
      */
     function deleteWorkspaceFile() {
+        $oFilesManager = new Files_manager($this->aProperties);
         $aReturn = array('status' => 1, 'message' => '');
-        if (deleteFileFromWsDataDirTree('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $this->aValues['file_name']) === false)
+        $sFilePath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme/' . $this->aValues['file_name'];
+        if (!$oFilesManager->oFileInterface->unlink($sFilePath))
             $aReturn = array('status' => 0, 'message' => 'DELETE_FILE_ERROR_PUBLICATION_WORKSPACE_LOAD_PROJECT_DIRECTORY', 'error_code' => null);
         return $aReturn;
     }
@@ -1232,7 +1251,9 @@ class Workspaces extends GTF {
         require $this->sRessourcesFile;
         $aFields = $this->getFields($this->aProperties['schema_gtf'], "workspace", "workspace_id");
         // Lit le contenu du fichier .fmw du projet.
-        $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $aFields['fmw_file']);
+        $oFilesManager = new Files_manager($this->aProperties);
+        $sFilePath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme/' . $aFields['fmw_file'];
+        $sFmwFileContent = $oFilesManager->oFileInterface->file_get_contents($sFilePath);
         // Remplace les métas données.
         if ($sFmwFileContent !== false) {
             $oFmwParser = new GtfFmwParser($aFields['fmw_file'], $this->aProperties, $sFmwFileContent);
@@ -1261,13 +1282,15 @@ class Workspaces extends GTF {
     function reintegrateMetadata() {
         $aFields = $this->getFields($this->aProperties['schema_gtf'], "workspace", "workspace_id");
         // Lit le contenu du fichier .fmw du projet.
-        $sFmwFileContent = getFileContentInWsDataDir("gtf", "workspace", $this->aValues["my_vitis_id"], 'fme', $aFields['fmw_file']);
+        $oFilesManager = new Files_manager($this->aProperties);
+        $sFilePath = $this->aProperties['workspace_dir'] . '/' . $this->aValues["my_vitis_id"] . '/fme/' . $aFields['fmw_file'];
+        $sFmwFileContent = $oFilesManager->oFileInterface->file_get_contents($sFilePath);
         // Remplace les métas données.
         if ($sFmwFileContent !== false) {
             $oFmwParser = new GtfFmwParser($aFields['fmw_file'], $this->aProperties, $sFmwFileContent);
             $oFmwParser->getBdMetadata($this->oConnection->oBd, $this->aValues["my_vitis_id"]);
             $oFmwParser->save($oFmwParser->sFmwFileName);
-            putFileContentInWsDataDir('gtf', 'workspace', $this->aValues["my_vitis_id"], 'fme', $aFields['fmw_file'], file_get_contents($oFmwParser->sFmwFileName));
+            $oFilesManager->oFileInterface->file_put_contents($sFilePath, file_get_contents($oFmwParser->sFmwFileName));
             $aReturn = array('status' => 1, 'message' => '');
         }
         else {
@@ -1392,4 +1415,4 @@ class Workspaces extends GTF {
  }
 }
 
-?>
\ No newline at end of file
+?>
-- 
GitLab