Commit b9a2fc5cf145cb60fb1d21e6ed1c483db8375469

Authored by Benjamin Renard
2 parents ba483e8e ddaf5ac2

Merge branch 'master' into expression-parser-bre

src/FunctionTypeEnumClass.php
... ... @@ -19,6 +19,7 @@ abstract class FunctionTypeEnumClass
19 19 const TTUNION = "tt_union";
20 20 const TTCONVERT = "tt_convert";
21 21 const PARAMINFO = "param_info";
  22 + const USERWSINIT = "user_init";
22 23 }
23 24 ?>
24 25  
... ...
src/InputOutput/IHMImpl/Config/IHMConfigClass.php
... ... @@ -25,6 +25,8 @@ class IHMConfigClass
25 25  
26 26 private static $compilationDir = "compilation/";
27 27  
  28 + private static $storedRequestDir = "REQ/";
  29 +
28 30 private static $requestDir = "RES/";
29 31  
30 32 private static $sharedDir = "shared_data/";
... ... @@ -43,12 +45,18 @@ class IHMConfigClass
43 45  
44 46 private static $aliasesFile = "Alias.xml";
45 47  
  48 + private static $wsInfoFile = "WS_info.json";
  49 +
46 50 private static $processMgrFile = "processManager.xml";
47 51  
  52 + private static $migrationBackupDir = "MIGRATION_BACKUP/";
  53 +
48 54 private static $jobsMgrFile = "jobs.xml";
49 55  
50 56 private static $userParamMgrFile = "WsParams.xml";
51 57  
  58 + private static $userRequestMgrFile = "Request.xml";
  59 +
52 60 private static $userName;
53 61  
54 62 private static $userHost;
... ... @@ -97,10 +105,29 @@ class IHMConfigClass
97 105 return $userPath;
98 106 }
99 107  
  108 + public static function getUserWSInfoFilePath()
  109 + {
  110 + return self::getUserPath().self::$wsInfoFile;
  111 + }
  112 +
100 113 public static function getProcessManagerFilePath()
101 114 {
102 115 return self::getDataDir().self::$processMgrFile;
103 116 }
  117 +
  118 + public static function getMigrationBackupPath($version)
  119 + {
  120 + $backupPath = self::getDataDir().self::$migrationBackupDir;
  121 + if (!is_dir($backupPath))
  122 + mkdir($backupPath);
  123 + $backupPath .= ("".$version."/");
  124 + if (!is_dir($backupPath))
  125 + mkdir($backupPath);
  126 + $backupPath .= (self::$userName.'/');
  127 + if (!is_dir($backupPath))
  128 + mkdir($backupPath);
  129 + return $backupPath;
  130 + }
104 131  
105 132 public static function getGenericDataPath()
106 133 {
... ... @@ -141,6 +168,11 @@ class IHMConfigClass
141 168 {
142 169 return self::getUserWSPath().self::$userParamMgrFile;
143 170 }
  171 +
  172 + public static function getUserRequestManagerFilePath()
  173 + {
  174 + return self::getUserWSPath().self::$userRequestMgrFile;
  175 + }
144 176  
145 177 public static function getUserDerivedParamFilePath($paramId)
146 178 {
... ... @@ -245,6 +277,16 @@ class IHMConfigClass
245 277  
246 278 return $requestPath;
247 279 }
  280 +
  281 + public static function getStoredRequestPath()
  282 + {
  283 + $storedRequestPath = self::getUserPath().self::$storedRequestDir;
  284 +
  285 + if (!is_dir($storedRequestPath))
  286 + mkdir($storedRequestPath);
  287 +
  288 + return $storedRequestPath;
  289 + }
248 290  
249 291 public static function getRemoteDataPath()
250 292 {
... ...
src/InputOutput/IHMImpl/IHMInputOutputClass.php
... ... @@ -8,6 +8,7 @@
8 8 class IHMInputOutputClass implements InputOutputInterface
9 9 {
10 10 protected $inputOutput = null;
  11 + protected $userWSMgr = null;
11 12  
12 13 /*
13 14 * @brief Constructor
... ... @@ -16,6 +17,7 @@ class IHMInputOutputClass implements InputOutputInterface
16 17 {
17 18 IHMConfigClass::setUserName($userName);
18 19 IHMConfigClass::setUserHost($userHost);
  20 + $this->userWSMgr = new IHMUserWSManagerClass();
19 21 }
20 22  
21 23 /*
... ... @@ -23,10 +25,6 @@ class IHMInputOutputClass implements InputOutputInterface
23 25 */
24 26 public function getInputData($input,$function,$requestId = "")
25 27 {
26   - //check user workspace
27   - if (IHMConfigClass::getUserName() == "" || !is_dir(IHMConfigClass::getUserPath()))
28   - throw new Exception('Cannot find user workspace.');
29   -
30 28 switch ($function)
31 29 {
32 30 case FunctionTypeEnumClass::PARAMS :
... ... @@ -102,6 +100,8 @@ class IHMInputOutputClass implements InputOutputInterface
102 100 case FunctionTypeEnumClass::PARAMINFO :
103 101 $this->inputOutput = new IHMInputOutputParamInfoClass();
104 102 break;
  103 + case FunctionTypeEnumClass::USERWSINIT :
  104 + return $this->userWSMgr->init();
105 105 default :
106 106 throw new Exception('Request type '.$function.' not implemented for this client.');
107 107 }
... ...
src/InputOutput/IHMImpl/Params/IHMInputOutputParamsAbstractClass.php
... ... @@ -50,6 +50,14 @@ abstract class IHMInputOutputParamsAbstractClass implements InputOutputInterface
50 50 }
51 51  
52 52 /*
  53 + * @brief Get Task
  54 + */
  55 + protected function getTask($input)
  56 + {
  57 + return $input->nodeType;
  58 + }
  59 +
  60 + /*
53 61 * @brief Unmarshall the time definition from the IHM request
54 62 */
55 63 protected function unmarshallTimeDefinition($input, $requestIndex, $ttFileIndex = -1, $ttIntIndex = -1)
... ... @@ -208,7 +216,7 @@ abstract class IHMInputOutputParamsAbstractClass implements InputOutputInterface
208 216 $this->paramsData->setCompilationPath(IHMConfigClass::getCompilationPath());
209 217 $this->paramsData->setLocalBasePath(IHMConfigClass::getLocalBasePath());
210 218 $this->paramsData->setManagerFilePath(IHMConfigClass::getProcessManagerFilePath());
211   - $this->paramsData->setTask($input->nodeType);
  219 + $this->paramsData->setTask($this->getTask($input));
212 220 $this->input = $input;
213 221  
214 222 return $this->unmarshallRequest($input);
... ...
src/InputOutput/IHMImpl/Params/PlotImpl/IHMInputOutputParamsPlotClass.php
... ... @@ -15,9 +15,9 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
15 15  
16 16 private $isInstantPlot = false;
17 17  
18   - private $interactiveRequestRealIndexes = array();
19   - private $interactiveMultiPlotState = array();
20 18 private $interactiveTimeSelectionState = array();
  19 + private $interactivePlotTitle = array();
  20 + private $interactivePlotIndex = array();
21 21 private $interactiveCrtTTFileIndex = -1;
22 22 private $interactivePreview = false;
23 23  
... ... @@ -26,10 +26,8 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
26 26 */
27 27 protected function unmarshallRequest($input)
28 28 {
29   - $this->interactiveRequestRealIndexes = array();
30   -
31   - $fullResetZoom = false;
32 29 $forceTimeZoomReset = false;
  30 + $resetZoom = false;
33 31  
34 32 if (isset($input->{'action'}))
35 33 {
... ... @@ -40,265 +38,196 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
40 38 {
41 39 $resetZoom = true;
42 40 //save request
43   - $this->saveIHMRequest($input);
  41 + $this->saveIHMRequest(PLOT_RESULT_FILE_KEY."_".$input->{'tab-index'}, $input);
44 42 }
45 43  
46   - //Get active tab
47   - $activeTab = NULL;
48   - foreach ($input->tabs as $tab)
49   - {
50   - if ($tab->{'id'} == $input->{'last-plotted-tab'})
51   - {
52   - $activeTab = $tab;
53   - }
54   - }
55   -
56 44 //Request
57   - $requestIndexInParamData = 0;
58   - $tabRequestIndex = 0;
59 45 $this->isInteractiveRequest = ($input->{'file-output'} == 'INTERACTIVE');
60 46 $this->isFromWS = ($input->{'file-output'} == 'WS');
  47 + $this->paramsData->setRequestIndex($input->{'tab-index'});
61 48 $postProcessCmd = "";
62   - foreach ($input->tabs as $tab)
63   - {
64   - if (isset($activeTab))
65   - {
66   - if ($this->isInteractiveRequest)
67   - {
68   - if ($activeTab->{'multi-plot-linked'} && !$tab->{'multi-plot-linked'})
69   - {
70   - ++$tabRequestIndex;
71   - //Tab is not linked to the Multi Plot Mode
72   - continue;
73   - }
74   - else if (!$activeTab->{'multi-plot-linked'} && ($tab->{'id'} != $activeTab->{'id'}))
75   - {
76   - ++$tabRequestIndex;
77   - //Plot only current active tab
78   - continue;
79   - }
80   - else if (isset($input->{'force-single-replot'}) && $input->{'force-single-replot'} && ($tab->{'id'} != $activeTab->{'id'}))
81   - {
82   - ++$tabRequestIndex;
83   - //Plot only current active tab when 'force-single-replot' is active
84   - continue;
85   - }
86   - //Reset zoom list if needed
87   - if ($fullResetZoom || $forceTimeZoomReset)
88   - $this->resetZoomListForTab($tab->{'id'}, $forceTimeZoomReset && !$fullResetZoom);
89   - }
90   - else
91   - {
92   - if ($tab->{'id'} != $activeTab->{'id'})
93   - {
94   - ++$tabRequestIndex;
95   - //In no interactive request, plot only active tab
96   - continue;
97   - }
98   - //Reset zoom list if needed
99   - if ($fullResetZoom || $forceTimeZoomReset)
100   - $this->resetZoomListForTab($tab->{'id'}, $forceTimeZoomReset && !$fullResetZoom);
101   - }
102   - }
  49 +
  50 + if ($resetZoom || $forceTimeZoomReset)
  51 + $this->resetZoomList(PLOT_RESULT_FILE_KEY."_".$input->{'tab-index'}, $forceTimeZoomReset);
103 52  
104   - $requestNode = $this->paramsData->addRequestNode();
105   - $requestNode->setRealIndex($tabRequestIndex);
106   - $outputsNode = $requestNode->getOutputsNode();
107   - $paramsNode = $requestNode->getParamsNode();
  53 + $requestNode = $this->paramsData->addRequestNode();
  54 + $outputsNode = $requestNode->getOutputsNode();
  55 + $paramsNode = $requestNode->getParamsNode();
108 56  
109   - //unmarshall time definition
110   - if ($tab->{'multi-plot-linked'})
111   - {
112   - $isIntervalRequest = ($input->timesrc == 'Interval');
113   - $ttFileIndex = -1;
114   - $ttIntIndex = -1;
115   - if ($this->isInteractiveRequest && !$isIntervalRequest && !$tab->{'page-superpose-mode'})
116   - {
117   - $ttFileIndex = !isset($input->{'ttFileIndex'}) ? 0 : $input->{'ttFileIndex'};
118   - $ttIntIndex = !isset($input->{'intIndex'}) ? 0 : $input->{'intIndex'};
119   - }
120   - $this->unmarshallTimeDefinition($input, $requestIndexInParamData, $ttFileIndex, $ttIntIndex);
121   - }
122   - else
123   - {
124   - $isIntervalRequest = ($tab->timesrc == 'Interval');
125   - $ttFileIndex = -1;
126   - $ttIntIndex = -1;
127   - if ($this->isInteractiveRequest && !$isIntervalRequest && !$tab->{'page-superpose-mode'})
128   - {
129   - $ttFileIndex = !isset($activeTab->{'ttFileIndex'}) ? 0 : $activeTab->{'ttFileIndex'};
130   - $ttIntIndex = !isset($activeTab->{'intIndex'}) ? 0 : $activeTab->{'intIndex'};
131   - }
132   - $this->unmarshallTimeDefinition($tab, $requestIndexInParamData, $ttFileIndex, $ttIntIndex);
133   - }
  57 + //unmarshall time definition
  58 + $isIntervalRequest = ($input->timesrc == 'Interval');
  59 + $ttFileIndex = -1;
  60 + $ttIntIndex = -1;
  61 + if ($this->isInteractiveRequest && !$isIntervalRequest && !$input->{'page-superpose-mode'})
  62 + {
  63 + $ttFileIndex = !isset($input->{'ttFileIndex'}) ? 0 : $input->{'ttFileIndex'};
  64 + $ttIntIndex = !isset($input->{'intIndex'}) ? 0 : $input->{'intIndex'};
  65 + }
  66 + $this->unmarshallTimeDefinition($input, 0, $ttFileIndex, $ttIntIndex);
134 67  
135   - $this->interactiveCrtTTFileIndex = $ttFileIndex;
  68 + $this->interactiveCrtTTFileIndex = $ttFileIndex;
136 69  
137   - $plotOutputNode = $outputsNode->addNewOutput(RequestOutputTypeEnum::PLOT);
  70 + $plotOutputNode = $outputsNode->addNewOutput(RequestOutputTypeEnum::PLOT);
138 71  
139   - $plotOutputNode->setWriteContextFile($this->isInteractiveRequest ? "true" : "false");
  72 + $plotOutputNode->setWriteContextFile($this->isInteractiveRequest ? "true" : "false");
140 73  
141   - $compression = "";
142   - if (!$this->isInteractiveRequest && !$this->isFromWS)
  74 + $compression = "";
  75 + if (!$this->isInteractiveRequest && !$this->isFromWS)
  76 + {
  77 + switch ($input->{'file-output'})
143 78 {
144   - switch ($input->{'file-output'})
145   - {
146   - case 'TGZ' :
147   - $plotOutputNode->addPostProcessing(RequestOutputPostProcessingEnumClass::TAR);
148   - $plotOutputNode->addPostProcessing(RequestOutputPostProcessingEnumClass::GZIP);
149   - $compression = ".tar.gz";
150   - break;
151   - case 'ZIP' :
152   - $plotOutputNode->addPostProcessing(RequestOutputPostProcessingEnumClass::ZIP);
153   - $compression = ".zip";
154   - break;
155   - default:
156   - throw new Exception('Compression not implemented.');
157   - }
  79 + case 'TGZ' :
  80 + $plotOutputNode->addPostProcessing(RequestOutputPostProcessingEnumClass::TAR);
  81 + $plotOutputNode->addPostProcessing(RequestOutputPostProcessingEnumClass::GZIP);
  82 + $compression = ".tar.gz";
  83 + break;
  84 + case 'ZIP' :
  85 + $plotOutputNode->addPostProcessing(RequestOutputPostProcessingEnumClass::ZIP);
  86 + $compression = ".zip";
  87 + break;
  88 + default:
  89 + throw new Exception('Compression not implemented.');
158 90 }
  91 + }
159 92  
160   - if ($input->{'one-file-per-interval'})
161   - $plotOutputNode->setStructure(RequestOutputPlotStructureEnum::ONE_FILE_PER_INTERVAL);
162   - else
163   - $plotOutputNode->setStructure(RequestOutputPlotStructureEnum::ONE_FILE);
  93 + if ($input->{'one-file-per-interval'})
  94 + $plotOutputNode->setStructure(RequestOutputPlotStructureEnum::ONE_FILE_PER_INTERVAL);
  95 + else
  96 + $plotOutputNode->setStructure(RequestOutputPlotStructureEnum::ONE_FILE);
164 97  
165   - //prefix
166   - $filePrefix = "plot_";
167   - if ($input->{'file-prefix'} && ($input->{'file-prefix'} != ""))
168   - $filePrefix = $input->{'file-prefix'};
169   - $filePrefix .= $tab->{'id'};
  98 + //prefix
  99 + $filePrefix = "plot_";
  100 + if ($input->{'file-prefix'} && ($input->{'file-prefix'} != ""))
  101 + $filePrefix = $input->{'file-prefix'};
  102 + $filePrefix .= $input->{'tab-index'};
170 103  
171   - $plotOutputNode->setFilePrefix($filePrefix);
  104 + $plotOutputNode->setFilePrefix($filePrefix);
172 105  
173   - //page
174   - $pageNode = $plotOutputNode->getPage();
  106 + //page
  107 + $pageNode = $plotOutputNode->getPage();
175 108  
176   - $fileFormat = RequestOutputPlotPageFormatEnum::PNG;
177   - $extension = ".png";
178   - switch ($input->{'file-format'})
179   - {
180   - case 'PNG' :
181   - $fileFormat = RequestOutputPlotPageFormatEnum::PNG;
182   - $extension = ".png";
183   - break;
184   - case 'PDF' :
185   - $fileFormat = RequestOutputPlotPageFormatEnum::PDF;
186   - $extension = ".pdf";
187   - break;
188   - case 'PS' :
189   - $fileFormat = RequestOutputPlotPageFormatEnum::PS;
190   - $extension = ".ps";
191   - break;
192   - case 'SVG' :
193   - $fileFormat = RequestOutputPlotPageFormatEnum::SVG;
194   - $extension = ".svg";
195   - break;
196   - default:
197   - throw new Exception('File format not implemented.');
198   - }
  109 + $fileFormat = RequestOutputPlotPageFormatEnum::PNG;
  110 + $extension = ".png";
  111 + switch ($input->{'file-format'})
  112 + {
  113 + case 'PNG' :
  114 + $fileFormat = RequestOutputPlotPageFormatEnum::PNG;
  115 + $extension = ".png";
  116 + break;
  117 + case 'PDF' :
  118 + $fileFormat = RequestOutputPlotPageFormatEnum::PDF;
  119 + $extension = ".pdf";
  120 + break;
  121 + case 'PS' :
  122 + $fileFormat = RequestOutputPlotPageFormatEnum::PS;
  123 + $extension = ".ps";
  124 + break;
  125 + case 'SVG' :
  126 + $fileFormat = RequestOutputPlotPageFormatEnum::SVG;
  127 + $extension = ".svg";
  128 + break;
  129 + default:
  130 + throw new Exception('File format not implemented.');
  131 + }
199 132  
200   - $pageNode->setFormat($fileFormat);
  133 + $pageNode->setFormat($fileFormat);
201 134  
202   - $this->unmarshallTitle($tab, 'page-title', $pageNode->getTitle());
  135 + $this->unmarshallTitle($input, 'page-title', $pageNode->getTitle());
203 136  
204   - $isPortrait = false;
205   - switch ($tab->{'page-orientation'})
206   - {
207   - case 'landscape' :
208   - $pageNode->setOrientation(RequestOutputPlotPageOrientationEnum::LANDSCAPE);
209   - break;
210   - case 'portrait' :
211   - $pageNode->setOrientation(RequestOutputPlotPageOrientationEnum::PORTRAIT);
212   - $isPortrait = true;
213   - break;
214   - }
  137 + $isPortrait = false;
  138 + switch ($input->{'page-orientation'})
  139 + {
  140 + case 'landscape' :
  141 + $pageNode->setOrientation(RequestOutputPlotPageOrientationEnum::LANDSCAPE);
  142 + break;
  143 + case 'portrait' :
  144 + $pageNode->setOrientation(RequestOutputPlotPageOrientationEnum::PORTRAIT);
  145 + $isPortrait = true;
  146 + break;
  147 + }
215 148  
216   - switch ($tab->{'page-dimension'})
217   - {
218   - case 'ISO A4' :
219   - $pageNode->setDimension(RequestOutputPlotPageDimensionEnum::ISO_A4);
220   - break;
221   - case 'US letter' :
222   - $pageNode->setDimension(RequestOutputPlotPageDimensionEnum::US_LETTER);
223   - break;
224   - default:
225   - throw new Exception('Page dimension not implemented.');
226   - }
  149 + switch ($input->{'page-dimension'})
  150 + {
  151 + case 'ISO A4' :
  152 + $pageNode->setDimension(RequestOutputPlotPageDimensionEnum::ISO_A4);
  153 + break;
  154 + case 'US letter' :
  155 + $pageNode->setDimension(RequestOutputPlotPageDimensionEnum::US_LETTER);
  156 + break;
  157 + default:
  158 + throw new Exception('Page dimension not implemented.');
  159 + }
227 160  
228   - switch ($tab->{'page-mode'})
229   - {
  161 + switch ($input->{'page-mode'})
  162 + {
230 163  
231   - case 'grayscale' :
232   - $pageNode->setMode(RequestOutputPlotPageModeEnum::GRAYSCALE);
233   - break;
234   - case 'color' :
235   - default:
236   - $pageNode->setMode(RequestOutputPlotPageModeEnum::COLOR);
237   - break;
238   - }
239   -
240   - if ($tab->{'page-margins-activated'})
241   - {
242   - $pageNode->getMargins()->setHorizontal($tab->{'page-margin-x'});
243   - $pageNode->getMargins()->setVertical($tab->{'page-margin-y'});
244   - }
  164 + case 'grayscale' :
  165 + $pageNode->setMode(RequestOutputPlotPageModeEnum::GRAYSCALE);
  166 + break;
  167 + case 'color' :
  168 + default:
  169 + $pageNode->setMode(RequestOutputPlotPageModeEnum::COLOR);
  170 + break;
  171 + }
245 172  
246   - if ($tab->{'page-font-activated'})
247   - $this->unmarshallFont($tab, 'page-font', $pageNode->getFont());
  173 + if ($input->{'page-margins-activated'})
  174 + {
  175 + $pageNode->getMargins()->setHorizontal($input->{'page-margin-x'});
  176 + $pageNode->getMargins()->setVertical($input->{'page-margin-y'});
  177 + }
248 178  
249   - //Superpose mode
250   - $pageNode->setSuperposeMode($tab->{'page-superpose-mode'} ? "true": "false");
  179 + if ($input->{'page-font-activated'})
  180 + $this->unmarshallFont($input, 'page-font', $pageNode->getFont());
251 181  
252   - //Layout
253   - $this->unmarshallLayout($tab, $pageNode);
  182 + //Superpose mode
  183 + $pageNode->setSuperposeMode($input->{'page-superpose-mode'} ? "true": "false");
254 184  
255   - foreach ($tab->{'panels'} as $panelData)
256   - $this->unmarshallPanel($panelData, $pageNode, $paramsNode);
  185 + //Layout
  186 + $this->unmarshallLayout($input, $pageNode);
257 187  
258   - if ($this->isInteractiveRequest || $this->isFromWS)
259   - {
260   - $resultFile = $filePrefix."_*".$extension;
261   - $waitingResultFile = $filePrefix.$extension;
262   - }
263   - else
264   - {
265   - $resultFile = $filePrefix."_*".$compression;
266   - $waitingResultFile = $filePrefix.$compression;
267   - }
  188 + foreach ($input->{'panels'} as $panelData)
  189 + $this->unmarshallPanel($panelData, $pageNode, $paramsNode);
268 190  
269   - if ($this->isInteractiveRequest)
270   - {
271   - $this->interactiveRequestRealIndexes[PLOT_RESULT_FILE_KEY."_".$tab->{'id'}] = $tabRequestIndex;
272   - $this->interactiveMultiPlotState[PLOT_RESULT_FILE_KEY."_".$tab->{'id'}] = $tab->{'multi-plot-linked'};
273   - $this->interactiveTimeSelectionState[PLOT_RESULT_FILE_KEY."_".$tab->{'id'}] = $isIntervalRequest;
274   - $this->interactivePreview = isset($input->{'interactive-preview'}) && ($input->{'interactive-preview'});
275   - $this->paramsData->addWaitingResult(PLOT_RESULT_FILE_KEY."_".$tab->{'id'}, $waitingResultFile);
276   - }
277   - else
278   - $this->paramsData->addWaitingResult(PLOT_RESULT_FILE_KEY, $waitingResultFile);
  191 + if ($this->isInteractiveRequest || $this->isFromWS)
  192 + {
  193 + $resultFile = $filePrefix."_*".$extension;
  194 + $waitingResultFile = $filePrefix.$extension;
  195 + }
  196 + else
  197 + {
  198 + $resultFile = $filePrefix."_*".$compression;
  199 + $waitingResultFile = $filePrefix.$compression;
  200 + }
279 201  
280   - //Remove old result files
281   - foreach (glob($this->paramsData->getWorkingPath().$resultFile) as $oldFile) {
282   - unlink($oldFile);
283   - }
  202 + if ($this->isInteractiveRequest)
  203 + {
  204 + $this->interactiveTimeSelectionState[PLOT_RESULT_FILE_KEY."_".$input->{'tab-index'}] = $isIntervalRequest;
  205 + $this->interactivePlotTitle[PLOT_RESULT_FILE_KEY."_".$input->{'tab-index'}] = $input->{'tab-title'};
  206 + $this->interactivePlotIndex[PLOT_RESULT_FILE_KEY."_".$input->{'tab-index'}] = $input->{'tab-index'};
  207 + $this->interactivePreview = isset($input->{'interactive-preview'}) && ($input->{'interactive-preview'});
  208 + $this->paramsData->addWaitingResult(PLOT_RESULT_FILE_KEY."_".$input->{'tab-index'}, $waitingResultFile);
  209 + }
  210 + else
  211 + $this->paramsData->addWaitingResult(PLOT_RESULT_FILE_KEY, $waitingResultFile);
284 212  
285   - //Post process command to apply to the result file
286   - if ($postProcessCmd != "")
287   - $postProcessCmd .= " | ";
288   - $postProcessCmd .= "mv ".$resultFile." ".$waitingResultFile;
  213 + //Remove old result files
  214 + foreach (glob($this->paramsData->getWorkingPath().$resultFile) as $oldFile) {
  215 + unlink($oldFile);
  216 + }
289 217  
290   - if (($this->isInteractiveRequest) && $isPortrait)
291   - $postProcessCmd .= " | convert ".$waitingResultFile." -rotate -90 ".$waitingResultFile;
292   - else if ($this->isFromWS)
293   - {
294   - if ($isPortrait)
295   - $postProcessCmd .= " | convert ".$waitingResultFile." -rotate -90 ".$input->{"ws-result-file"};
296   - else
297   - $postProcessCmd .= " | mv ".$waitingResultFile." ".$input->{"ws-result-file"};
298   - }
  218 + //Post process command to apply to the result file
  219 + if ($postProcessCmd != "")
  220 + $postProcessCmd .= " | ";
  221 + $postProcessCmd .= "mv ".$resultFile." ".$waitingResultFile;
299 222  
300   - ++$tabRequestIndex;
301   - ++$requestIndexInParamData;
  223 + if (($this->isInteractiveRequest) && $isPortrait)
  224 + $postProcessCmd .= " | convert ".$waitingResultFile." -rotate -90 ".$waitingResultFile;
  225 + else if ($this->isFromWS)
  226 + {
  227 + if ($isPortrait)
  228 + $postProcessCmd .= " | convert ".$waitingResultFile." -rotate -90 ".$input->{"ws-result-file"};
  229 + else
  230 + $postProcessCmd .= " | mv ".$waitingResultFile." ".$input->{"ws-result-file"};
302 231 }
303 232  
304 233 $this->paramsData->setBatchEnable(!(($fileFormat == RequestOutputPlotPageFormatEnum::PNG) && $this->isInteractiveRequest));
... ... @@ -307,39 +236,39 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
307 236 return $this->paramsData;
308 237 }
309 238  
310   - protected function unmarshallLayout($tab, $pageNode)
  239 + protected function unmarshallLayout($request, $pageNode)
311 240 {
312   - switch ($tab->{'page-layout-type'})
  241 + switch ($request->{'page-layout-type'})
313 242 {
314 243 case 'vertical' :
315 244 $pageNode->getLayout()->setType(RequestOutputPlotLayoutTypeEnum::VERTICAL);
316   - $pageNode->getLayout()->setPanelHeight($tab->{'page-layout-object'}->{'layout-panel-height'});
317   - $pageNode->getLayout()->setPanelSpacing($tab->{'page-layout-object'}->{'layout-panel-spacing'});
318   - $pageNode->getLayout()->setExpand($tab->{'page-layout-object'}->{'layout-expand'} ? "true" : "false");
319   - $pageNode->getLayout()->setOnlyLowerTimeAxesLegend($tab->{'page-layout-object'}->{'layout-timeaxes-legend-lowerone'} ? "true" : "false");
320   - //if ($tab->{'page-layout-object'}->{'layout-timeplot-width'} > 0)
321   - // $pageNode->setDefaultTimePlotWidth($tab->{'page-layout-object'}->{'layout-timeplot-width'});
322   - if ($tab->{'page-layout-object'}->{'layout-timeplot-height'} > 0)
323   - $pageNode->setDefaultTimePlotHeight($tab->{'page-layout-object'}->{'layout-timeplot-height'});
324   - if ($tab->{'page-layout-object'}->{'layout-xyplot-width'} > 0)
325   - $pageNode->setDefaultXYPlotWidth($tab->{'page-layout-object'}->{'layout-xyplot-width'});
326   - if ($tab->{'page-layout-object'}->{'layout-xyplot-height'} > 0)
327   - $pageNode->setDefaultXYPlotHeight($tab->{'page-layout-object'}->{'layout-xyplot-height'});
  245 + $pageNode->getLayout()->setPanelHeight($request->{'page-layout-object'}->{'layout-panel-height'});
  246 + $pageNode->getLayout()->setPanelSpacing($request->{'page-layout-object'}->{'layout-panel-spacing'});
  247 + $pageNode->getLayout()->setExpand($request->{'page-layout-object'}->{'layout-expand'} ? "true" : "false");
  248 + $pageNode->getLayout()->setOnlyLowerTimeAxesLegend($request->{'page-layout-object'}->{'layout-timeaxes-legend-lowerone'} ? "true" : "false");
  249 + //if ($request->{'page-layout-object'}->{'layout-timeplot-width'} > 0)
  250 + // $pageNode->setDefaultTimePlotWidth($request->{'page-layout-object'}->{'layout-timeplot-width'});
  251 + if ($request->{'page-layout-object'}->{'layout-timeplot-height'} > 0)
  252 + $pageNode->setDefaultTimePlotHeight($request->{'page-layout-object'}->{'layout-timeplot-height'});
  253 + if ($request->{'page-layout-object'}->{'layout-xyplot-width'} > 0)
  254 + $pageNode->setDefaultXYPlotWidth($request->{'page-layout-object'}->{'layout-xyplot-width'});
  255 + if ($request->{'page-layout-object'}->{'layout-xyplot-height'} > 0)
  256 + $pageNode->setDefaultXYPlotHeight($request->{'page-layout-object'}->{'layout-xyplot-height'});
328 257 break;
329 258 case 'auto' :
330 259 $pageNode->getLayout()->setType(RequestOutputPlotLayoutTypeEnum::AUTO);
331   - $pageNode->getLayout()->setPanelHeight($tab->{'page-layout-object'}->{'layout-panel-height'});
332   - $pageNode->getLayout()->setPanelSpacing($tab->{'page-layout-object'}->{'layout-panel-spacing'});
333   - $pageNode->getLayout()->setExpand($tab->{'page-layout-object'}->{'layout-expand'} ? "true" : "false");
334   - $pageNode->getLayout()->setOnlyLowerTimeAxesLegend($tab->{'page-layout-object'}->{'layout-timeaxes-legend-lowerone'} ? "true" : "false");
  260 + $pageNode->getLayout()->setPanelHeight($request->{'page-layout-object'}->{'layout-panel-height'});
  261 + $pageNode->getLayout()->setPanelSpacing($request->{'page-layout-object'}->{'layout-panel-spacing'});
  262 + $pageNode->getLayout()->setExpand($request->{'page-layout-object'}->{'layout-expand'} ? "true" : "false");
  263 + $pageNode->getLayout()->setOnlyLowerTimeAxesLegend($request->{'page-layout-object'}->{'layout-timeaxes-legend-lowerone'} ? "true" : "false");
335 264 break;
336 265 case 'manual' :
337 266 $pageNode->getLayout()->setType(RequestOutputPlotLayoutTypeEnum::MANUAL);
338   - $timePlotLeftMargin = $tab->{'page-layout-object'}->{'layout-timeplot-margin-left'} ? $tab->{'page-layout-object'}->{'layout-timeplot-margin-left'} : -1;
339   - $timePlotRightMargin = $tab->{'page-layout-object'}->{'layout-timeplot-margin-right'} ? $tab->{'page-layout-object'}->{'layout-timeplot-margin-right'} : -1;
  267 + $timePlotLeftMargin = $request->{'page-layout-object'}->{'layout-timeplot-margin-left'} ? $request->{'page-layout-object'}->{'layout-timeplot-margin-left'} : -1;
  268 + $timePlotRightMargin = $request->{'page-layout-object'}->{'layout-timeplot-margin-right'} ? $request->{'page-layout-object'}->{'layout-timeplot-margin-right'} : -1;
340 269 $pageNode->setDefaultTimePlotXMargin($timePlotLeftMargin, $timePlotRightMargin);
341   - $xyPlotLeftMargin = $tab->{'page-layout-object'}->{'layout-xyplot-margin-left'} ? $tab->{'page-layout-object'}->{'layout-xyplot-margin-left'} : -1;
342   - $xyPlotRightMargin = $tab->{'page-layout-object'}->{'layout-xyplot-margin-right'} ? $tab->{'page-layout-object'}->{'layout-xyplot-margin-right'} : -1;
  270 + $xyPlotLeftMargin = $request->{'page-layout-object'}->{'layout-xyplot-margin-left'} ? $request->{'page-layout-object'}->{'layout-xyplot-margin-left'} : -1;
  271 + $xyPlotRightMargin = $request->{'page-layout-object'}->{'layout-xyplot-margin-right'} ? $request->{'page-layout-object'}->{'layout-xyplot-margin-right'} : -1;
343 272 $pageNode->setDefaultXYPlotXMargin($xyPlotLeftMargin, $xyPlotRightMargin);
344 273 break;
345 274 default:
... ... @@ -1481,10 +1410,10 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1481 1410  
1482 1411 $result[] = array(
1483 1412 "id" => $key,
1484   - "index" => $this->interactiveRequestRealIndexes[$key],
1485   - "multiplot" => $this->interactiveMultiPlotState[$key],
  1413 + "title" => $this->interactivePlotTitle[$key],
1486 1414 "preview" => $this->interactivePreview,
1487 1415 "isInterval" => $this->interactiveTimeSelectionState[$key],
  1416 + "index" => $this->interactivePlotIndex[$key],
1488 1417 "ttFileIndex" => $this->interactiveCrtTTFileIndex,
1489 1418 "context" => IHMPlotContextFileClass::parse($this->getWorkingPath().$contextResult),
1490 1419 "plot" => $waitingResult,
... ... @@ -1520,9 +1449,9 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1520 1449 return "[".$r.",".$g.",".$b."]";
1521 1450 }
1522 1451  
1523   - private function saveIHMRequest($input)
  1452 + private function saveIHMRequest($interactiveId, $input)
1524 1453 {
1525   - $path = $this->getWorkingPath()."ihm.request";
  1454 + $path = $this->getWorkingPath()."ihm.request.".$interactiveId;
1526 1455 if (!is_dir($this->getWorkingPath()))
1527 1456 mkdir($this->getWorkingPath(),0777);
1528 1457 $file = fopen($path, 'w');
... ... @@ -1530,33 +1459,42 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1530 1459 fclose($file);
1531 1460 }
1532 1461  
1533   - private function loadIHMRequest()
  1462 + private function loadIHMRequest($interactiveId)
1534 1463 {
1535   - $path = $this->getWorkingPath()."ihm.request";
  1464 + $path = $this->getWorkingPath()."ihm.request.".$interactiveId;
1536 1465 if (!file_exists($path))
1537 1466 return NULL;
1538 1467 return json_decode(file_get_contents($path));
1539 1468 }
  1469 +
  1470 +
  1471 +
  1472 + private function loadZoomList($interactiveId)
  1473 + {
  1474 + $path = $this->getWorkingPath()."zoom.list.".$interactiveId;
  1475 + if (!file_exists($path))
  1476 + return NULL;
  1477 + return json_decode(file_get_contents($path));
  1478 + }
  1479 +
  1480 + private function saveZoomList($interactiveId, $zoomList)
  1481 + {
  1482 + $path = $this->getWorkingPath()."zoom.list.".$interactiveId;
  1483 + if (!is_dir($this->getWorkingPath()))
  1484 + mkdir($this->getWorkingPath(),0777);
  1485 + $file = fopen($path, 'w');
  1486 + fwrite($file, json_encode($zoomList));
  1487 + fclose($file);
  1488 + }
1540 1489  
1541 1490 private function unmarshallActionRequest($input)
1542 1491 {
1543 1492 $actionInput = $input->{'action'};
1544   - $multiPlotState = $input->{'multiPlotState'};
1545 1493  
1546   - $plotInput = $this->loadIHMRequest();
  1494 + $plotInput = $this->loadIHMRequest($actionInput->{'interactiveId'});
1547 1495  
1548 1496 if (!isset($plotInput))
1549   - throw new Exception('Cannot retrieve request input for inetractive action.');
1550   -
1551   - //Set interactive Multi Plot state
1552   - foreach ($multiPlotState as $key => $value)
1553   - {
1554   - foreach ($plotInput->{'tabs'} as $tab)
1555   - {
1556   - if (PLOT_RESULT_FILE_KEY."_".$tab->{'id'} == $key)
1557   - $tab->{'multi-plot-linked'} = $value;
1558   - }
1559   - }
  1497 + throw new Exception('Cannot retrieve request input for interactive action.');
1560 1498  
1561 1499 switch ($actionInput->{'action'})
1562 1500 {
... ... @@ -1571,8 +1509,6 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1571 1509 return $this->unmarshallNavigation($actionInput, $plotInput);
1572 1510 case 'goto' :
1573 1511 return $this->unmarshallTTGoto($actionInput, $plotInput);
1574   - case 'synchronize' :
1575   - return $this->unmarshallSynchronize($actionInput, $plotInput);
1576 1512 case 'instant' :
1577 1513 return $this->unmarshallInstant($actionInput, $plotInput);
1578 1514 case 'undozoom' :
... ... @@ -1587,34 +1523,27 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1587 1523 //if $isInterval == true, $minOrFileIndex is the min and $maxOrInetrvalIndex is the max
1588 1524 //if $isInterval == false, $minOrFileIndex is the fileIndex and $maxOrInetrvalIndex is the intervalIndex
1589 1525  
1590   - $zoomList = $this->loadZoomList();
  1526 + $zoomList = $this->loadZoomList($input->interactiveId);
1591 1527  
1592   - if (!isset($zoomList->tabs))
  1528 + if (!isset($zoomList))
1593 1529 {
1594 1530 //Init zoom list
1595 1531 $zoomList = (Object)array(
1596   - 'tabs' => (Object)array()
1597   - );
1598   - }
1599   -
1600   - if (!isset($zoomList->tabs->{$input->{'tabId'}}))
1601   - {
1602   - $zoomList->tabs->{$input->{'tabId'}} = (Object)array(
1603   - 'times' => array(),
1604   - 'panels' => (Object)array()
  1532 + 'times' => array(),
  1533 + 'panels' => (Object)array()
1605 1534 );
1606 1535 }
1607 1536  
1608 1537 if ($input->{'axeId'} == 'timeAxis')
1609 1538 {
1610 1539 if ($isInterval)
1611   - array_push ($zoomList->tabs->{$input->{'tabId'}}->times, (Object)array(
  1540 + array_push ($zoomList->times, (Object)array(
1612 1541 'isInterval' => true,
1613 1542 'min' => $minOrFileIndex,
1614 1543 'max' => $maxOrIntervalIndex
1615 1544 ));
1616 1545 else
1617   - array_push ($zoomList->tabs->{$input->{'tabId'}}->times, (Object)array(
  1546 + array_push ($zoomList->times, (Object)array(
1618 1547 'isInterval' => false,
1619 1548 'ttFileIndex' => $minOrFileIndex,
1620 1549 'intIndex' => $maxOrIntervalIndex
... ... @@ -1622,163 +1551,103 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1622 1551 }
1623 1552 else
1624 1553 {
1625   - if (!isset($zoomList->tabs->{$input->{'tabId'}}->panels->{$input->{'panelId'}}))
  1554 + if (!isset($zoomList->panels->{$input->{'panelId'}}))
1626 1555 {
1627   - $zoomList->tabs->{$input->{'tabId'}}->panels->{$input->{'panelId'}} = (Object) array(
  1556 + $zoomList->panels->{$input->{'panelId'}} = (Object) array(
1628 1557 'axes' => (Object)array()
1629 1558 );
1630 1559 }
1631 1560  
1632   - if (!isset($zoomList->tabs->{$input->{'tabId'}}->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}}))
  1561 + if (!isset($zoomList->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}}))
1633 1562 {
1634   - $zoomList->tabs->{$input->{'tabId'}}->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}} = array();
  1563 + $zoomList->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}} = array();
1635 1564 }
1636 1565  
1637   - array_push ($zoomList->tabs->{$input->{'tabId'}}->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}}, (Object)array(
  1566 + array_push ($zoomList->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}}, (Object)array(
1638 1567 'min' => $minOrFileIndex,
1639 1568 'max' => $maxOrIntervalIndex
1640 1569 ));
1641 1570 }
1642 1571  
1643   - //save zoom list
1644   - $path = $this->getWorkingPath()."zoom.list";
1645   - if (!is_dir($this->getWorkingPath()))
1646   - mkdir($this->getWorkingPath(),0777);
1647   - $file = fopen($path, 'w');
1648   - fwrite($file, json_encode($zoomList));
1649   - fclose($file);
  1572 + $this->saveZoomList($input->interactiveId, $zoomList);
1650 1573 }
1651 1574  
1652   - private function loadZoomList()
  1575 + private function resetZoomList($interactiveId, $resetOnlyTimeZoom = false)
1653 1576 {
1654   - $path = $this->getWorkingPath()."zoom.list";
1655   - if (!file_exists($path))
1656   - return NULL;
1657   - return json_decode(file_get_contents($path));
1658   - }
1659   -
1660   - private function resetZoomListForTab($tabId, $resetOnlyTimeZoom = false)
1661   - {
1662   - $zoomList = $this->loadZoomList();
1663   -
1664   - if (isset($zoomList->tabs) && isset($zoomList->tabs->{PLOT_RESULT_FILE_KEY."_".$tabId}))
1665   - {
1666   - if (!$resetOnlyTimeZoom)
1667   - unset($zoomList->tabs->{PLOT_RESULT_FILE_KEY."_".$tabId});
1668   - else
1669   - $zoomList->tabs->{PLOT_RESULT_FILE_KEY."_".$tabId}->times = array();
  1577 + if (!$resetOnlyTimeZoom) {
  1578 + $zoomList = (Object)array(
  1579 + 'times' => array(),
  1580 + 'panels' => (Object)array()
  1581 + );
1670 1582 }
1671   -
1672   - $path = $this->getWorkingPath()."zoom.list";
1673   - if (!is_dir($this->getWorkingPath()))
1674   - mkdir($this->getWorkingPath(),0777);
1675   - $file = fopen($path, 'w');
1676   - fwrite($file, json_encode($zoomList));
1677   - fclose($file);
  1583 + else {
  1584 + $zoomList = $this->loadZoomList($interactiveId);
  1585 + $zoomList->times = array();
  1586 + }
  1587 +
  1588 + $this->saveZoomList($interactiveId, $zoomList);
1678 1589 }
1679 1590  
1680 1591 private function undoZoomInList($input)
1681 1592 {
1682   - $zoomList = $this->loadZoomList();
  1593 + $zoomList = $this->loadZoomList($input->interactiveId);
1683 1594  
1684 1595 $result = NULL;
1685   - if (isset($zoomList->tabs) && isset($zoomList->tabs->{$input->{'tabId'}}))
  1596 + if ($zoomList)
1686 1597 {
1687 1598 if ($input->{'axeId'} == 'timeAxis')
1688 1599 {
1689   - if (count($zoomList->tabs->{$input->{'tabId'}}->times) <= 0)
  1600 + if (count($zoomList->times) <= 0)
1690 1601 return NULL;
1691   - $result = array_pop($zoomList->tabs->{$input->{'tabId'}}->times);
  1602 + $result = array_pop($zoomList->times);
1692 1603 }
1693 1604 else
1694 1605 {
1695   - if (!isset($zoomList->tabs->{$input->{'tabId'}}->panels->{$input->{'panelId'}}))
  1606 + if (!isset($zoomList->panels->{$input->{'panelId'}}))
1696 1607 return NULL;
1697 1608  
1698   - if (!isset($zoomList->tabs->{$input->{'tabId'}}->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}}))
  1609 + if (!isset($zoomList->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}}))
1699 1610 return NULL;
1700 1611  
1701   - $result = array_pop($zoomList->tabs->{$input->{'tabId'}}->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}});
  1612 + $result = array_pop($zoomList->panels->{$input->{'panelId'}}->axes->{$input->{'axeId'}});
1702 1613 }
1703 1614 }
1704 1615 else
1705 1616 return NULL;
1706 1617  
1707   - $path = $this->getWorkingPath()."zoom.list";
1708   - if (!is_dir($this->getWorkingPath()))
1709   - mkdir($this->getWorkingPath(),0777);
1710   - $file = fopen($path, 'w');
1711   - fwrite($file, json_encode($zoomList));
1712   - fclose($file);
  1618 + $this->saveZoomList($input->interactiveId, $zoomList);
1713 1619  
1714 1620 return $result;
1715 1621 }
1716 1622  
1717 1623 private function unmarshallZoom($input, $plotInput, $isUndo = false)
1718 1624 {
1719   - //Find current tab
1720   - $crtTab = NULL;
1721   - foreach ($plotInput->{'tabs'} as $tab)
1722   - {
1723   - if ($input->{'tabId'} == PLOT_RESULT_FILE_KEY."_".$tab->{'id'})
1724   - {
1725   - $crtTab = $tab;
1726   - break;
1727   - }
1728   - }
1729   -
1730   - if (!$crtTab)
1731   - throw new Exception('Cannot retrieve plot tab for navigation action.');
1732   -
1733 1625 if ($input->{'axeId'} == 'timeAxis')
1734 1626 {
1735 1627 //Zoom on Time Axis
1736   - if ($crtTab->{'multi-plot-linked'})
  1628 + if ($plotInput->{'timesrc'} != 'Interval')
1737 1629 {
1738   - //Update multi plot time definition
1739   - if ($plotInput->{'timesrc'} != 'Interval')
1740   - {
1741   - $plotInput->{'timesrc'} = 'Interval';
1742   - if (!$isUndo)
1743   - $this->addZoomInList($input,false,
1744   - isset($plotInput->{'ttFileIndex'}) ? $plotInput->{'ttFileIndex'}: 0,
1745   - isset($plotInput->{'intIndex'}) ? $plotInput->{'intIndex'}: 0);
1746   - }
1747   - else
1748   - {
1749   - if (!$isUndo)
1750   - $this->addZoomInList($input,true,$plotInput->{'startDate'},$plotInput->{'stopDate'});
1751   - }
1752   - $plotInput->{'startDate'} = $input->{'min'};
1753   - $plotInput->{'stopDate'} = $input->{'max'};
  1630 + $plotInput->{'timesrc'} = 'Interval';
  1631 + if (!$isUndo)
  1632 + $this->addZoomInList($input,false,
  1633 + isset($plotInput->{'ttFileIndex'}) ? $plotInput->{'ttFileIndex'} : 0,
  1634 + isset($plotInput->{'intIndex'}) ? $plotInput->{'intIndex'} : 0);
1754 1635 }
1755 1636 else
1756 1637 {
1757   - if ($crtTab->{'timesrc'} != 'Interval')
1758   - {
1759   - $crtTab->{'timesrc'} = 'Interval';
1760   - if (!$isUndo)
1761   - $this->addZoomInList($input,false,
1762   - isset($crtTab->{'ttFileIndex'}) ? $crtTab->{'ttFileIndex'} : 0,
1763   - isset($crtTab->{'intIndex'}) ? $crtTab->{'intIndex'} : 0);
1764   - }
1765   - else
1766   - {
1767   - if (!$isUndo)
1768   - $this->addZoomInList($input,true,$crtTab->{'startDate'},$crtTab->{'stopDate'});
1769   - }
1770   - $crtTab->{'startDate'} = $input->{'min'};
1771   - $crtTab->{'stopDate'} = $input->{'max'};
  1638 + if (!$isUndo)
  1639 + $this->addZoomInList($input,true,$plotInput->{'startDate'},$plotInput->{'stopDate'});
1772 1640 }
  1641 + $plotInput->{'startDate'} = $input->{'min'};
  1642 + $plotInput->{'stopDate'} = $input->{'max'};
1773 1643  
1774   - $plotInput->{'last-plotted-tab'} = $crtTab->{'id'};
1775 1644 $plotInput->{'force-time-zoom-reset'} = false;
1776   - $this->saveIHMRequest($plotInput);
  1645 + $this->saveIHMRequest($input->interactiveId, $plotInput);
1777 1646 return $plotInput;
1778 1647 }
1779 1648  
1780 1649 //Digital axis zoom
1781   - foreach ($crtTab->{'panels'} as $panel)
  1650 + foreach ($plotInput->{'panels'} as $panel)
1782 1651 {
1783 1652 if ($input->{'panelId'} == $panel->{'id'})
1784 1653 {
... ... @@ -1791,8 +1660,7 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1791 1660 $oldMax = $axis->{'axis-range-max'};
1792 1661 $axis->{'axis-range-min'} = $input->{'min'};
1793 1662 $axis->{'axis-range-max'} = $input->{'max'};
1794   - $plotInput->{'last-plotted-tab'} = $crtTab->{'id'};
1795   - $this->saveIHMRequest($plotInput);
  1663 + $this->saveIHMRequest($input->interactiveId, $plotInput);
1796 1664 //Do not save 'force-single-replot' in request file!
1797 1665 $plotInput->{'force-single-replot'} = true;
1798 1666 $plotInput->{'force-time-zoom-reset'} = false;
... ... @@ -1830,30 +1698,8 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1830 1698  
1831 1699 private function unmarshallNavigation($input, $plotInput)
1832 1700 {
1833   - //Find current tab
1834   - $crtTab = NULL;
1835   - foreach ($plotInput->{'tabs'} as $tab)
1836   - {
1837   - if ($input->{'tabId'} == PLOT_RESULT_FILE_KEY."_".$tab->{'id'})
1838   - {
1839   - $crtTab = $tab;
1840   - break;
1841   - }
1842   - }
1843   -
1844   - if (!$crtTab)
1845   - throw new Exception('Cannot retrieve plot tab for navigation action.');
1846   -
1847   - if ($crtTab->{'multi-plot-linked'})
1848   - {
1849   - $startTime = $plotInput->{'startDate'};
1850   - $stopTime = $plotInput->{'stopDate'};
1851   - }
1852   - else
1853   - {
1854   - $startTime = $crtTab->{'startDate'};
1855   - $stopTime = $crtTab->{'stopDate'};
1856   - }
  1701 + $startTime = $plotInput->{'startDate'};
  1702 + $stopTime = $plotInput->{'stopDate'};
1857 1703  
1858 1704 //Compute new start / stop time
1859 1705 date_default_timezone_set('UTC');
... ... @@ -1896,114 +1742,30 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
1896 1742 $stopTime = date("Y-m-d\TH:i:s",$stopTimeStamp);
1897 1743  
1898 1744 //Update request
1899   - if ($crtTab->{'multi-plot-linked'})
1900   - {
1901   - $plotInput->{'startDate'} = $startTime;
1902   - $plotInput->{'stopDate'} = $stopTime;
1903   - }
1904   - else
1905   - {
1906   - $crtTab->{'startDate'} = $startTime;
1907   - $crtTab->{'stopDate'} = $stopTime;
1908   - }
  1745 + $plotInput->{'startDate'} = $startTime;
  1746 + $plotInput->{'stopDate'} = $stopTime;
1909 1747  
1910   - $plotInput->{'last-plotted-tab'} = $crtTab->{'id'};
1911 1748 $plotInput->{'force-time-zoom-reset'} = true;
1912   - $this->saveIHMRequest($plotInput);
  1749 + $this->saveIHMRequest($input->interactiveId, $plotInput);
1913 1750 return $plotInput;
1914 1751 }
1915 1752  
1916 1753 private function unmarshallTTGoto($input, $plotInput)
1917 1754 {
1918   - //Find current tab
1919   - $crtTab = NULL;
1920   - foreach ($plotInput->{'tabs'} as $tab)
1921   - {
1922   - if ($input->{'tabId'} == PLOT_RESULT_FILE_KEY."_".$tab->{'id'})
1923   - {
1924   - $crtTab = $tab;
1925   - break;
1926   - }
1927   - }
1928   -
1929   - if (!$crtTab)
1930   - throw new Exception('Cannot retrieve plot tab for navigation action.');
1931   -
1932   - $plotInput->{'last-plotted-tab'} = $crtTab->{'id'};
1933   -
1934   - if ($crtTab->{'multi-plot-linked'})
1935   - {
1936   - $plotInput->{'timesrc'} = 'TimeTable';
1937   - $plotInput->{'ttFileIndex'} = $input->{'ttFileIndex'};
1938   - $plotInput->{'intIndex'} = $input->{'intIndex'};
1939   - }
1940   - else
1941   - {
1942   - $crtTab->{'timesrc'} = 'TimeTable';
1943   - $crtTab->{'ttFileIndex'} = $input->{'ttFileIndex'};
1944   - $crtTab->{'intIndex'} = $input->{'intIndex'};
1945   - }
  1755 + $plotInput->{'timesrc'} = 'TimeTable';
  1756 + $plotInput->{'ttFileIndex'} = $input->{'ttFileIndex'};
  1757 + $plotInput->{'intIndex'} = $input->{'intIndex'};
1946 1758  
1947 1759 $plotInput->{'force-time-zoom-reset'} = true;
1948   - $this->saveIHMRequest($plotInput);
1949   - return $plotInput;
1950   - }
1951   -
1952   - private function unmarshallSynchronize($input, $plotInput)
1953   - {
1954   - //Find current tab
1955   - $crtTab = NULL;
1956   - foreach ($plotInput->{'tabs'} as $tab)
1957   - {
1958   - if ($input->{'tabId'} == PLOT_RESULT_FILE_KEY."_".$tab->{'id'})
1959   - {
1960   - $crtTab = $tab;
1961   - break;
1962   - }
1963   - }
1964   -
1965   - if (!$crtTab)
1966   - throw new Exception('Cannot retrieve plot tab for synchronize action.');
1967   -
1968   - if ($crtTab->{'multi-plot-linked'})
1969   - {
1970   -
1971   - }
1972   - else
1973   - {
1974   - $plotInput->{'last-plotted-tab'} = $crtTab->{'id'};
1975   - $crtTab->{'ttFileIndex'} = $plotInput->{'ttFileIndex'};
1976   - $crtTab->{'intIndex'} = $plotInput->{'intIndex'};
1977   - $crtTab->{'timesrc'} = $plotInput->{'timesrc'};
1978   - $crtTab->{'timeTables'} = $plotInput->{'timeTables'};
1979   - $crtTab->{'startDate'} = $plotInput->{'startDate'};
1980   - $crtTab->{'stopDate'} = $plotInput->{'stopDate'};
1981   - }
1982   -
1983   - $plotInput->{'force-time-zoom-reset'} = true;
1984   - $this->saveIHMRequest($plotInput);
  1760 + $this->saveIHMRequest($input->interactiveId, $plotInput);
1985 1761 return $plotInput;
1986 1762 }
1987 1763  
1988 1764 private function unmarshallInstant($input, $plotInput)
1989 1765 {
1990   - //Find current tab
1991   - $crtTab = NULL;
1992   - foreach ($plotInput->{'tabs'} as $tab)
1993   - {
1994   - if ($input->{'tabId'} == PLOT_RESULT_FILE_KEY."_".$tab->{'id'})
1995   - {
1996   - $crtTab = $tab;
1997   - break;
1998   - }
1999   - }
2000   -
2001   - if (!$crtTab)
2002   - throw new Exception('Cannot retrieve plot tab for instant plot.');
2003   -
2004 1766 //Find current panel
2005 1767 $crtPanel = NULL;
2006   - foreach ($crtTab->{'panels'} as $panel)
  1768 + foreach ($plotInput->{'panels'} as $panel)
2007 1769 {
2008 1770 if ($input->{'panelId'} == $panel->{'id'})
2009 1771 {
... ... @@ -2068,21 +1830,15 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
2068 1830 "file-format" => "PNG",
2069 1831 "file-output" => "INTERACTIVE",
2070 1832 "file-prefix" => "instant",
2071   - "last-plotted-tab"=> 1,
2072 1833 "timesrc" => "Interval",
2073 1834 "startDate" => date("Y-m-dTH:i:s", $timeStamp - 3600),
2074 1835 "stopDate" => date("Y-m-dTH:i:s", $timeStamp + 3600),
2075   - "tabs" => array()
2076   - );
2077   -
2078   - $instantTab = (Object)array(
2079 1836 "id" => 1,
2080   - "multi-plot-linked" => true,
2081   - "page-margins-activated" => $crtTab->{"page-margins-activated"},
2082   - "page-margin-x" => $crtTab->{"page-margin-x"},
2083   - "page-margin-y" => $crtTab->{"page-margin-y"},
2084   - "page-orientation" => $crtTab->{"page-orientation"},
2085   - "page-dimension" => $crtTab->{"page-dimension"},
  1837 + "page-margins-activated" => $plotInput->{"page-margins-activated"},
  1838 + "page-margin-x" => $plotInput->{"page-margin-x"},
  1839 + "page-margin-y" => $plotInput->{"page-margin-y"},
  1840 + "page-orientation" => $plotInput->{"page-orientation"},
  1841 + "page-dimension" => $plotInput->{"page-dimension"},
2086 1842 "page-layout-type" => "vertical",
2087 1843 "page-layout-object" => (Object)array(
2088 1844 "layout-expand" => true,
... ... @@ -2131,10 +1887,7 @@ class IHMInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
2131 1887 );
2132 1888 $instantPanel->{"params"}[] = $instantParam;
2133 1889  
2134   - $instantTab->{"panels"}[] = $instantPanel;
2135   -
2136   - $instantPlotInput->{"tabs"}[] = $instantTab;
2137   -
  1890 + $instantPlotInput->{"panels"}[] = $instantPanel;
2138 1891  
2139 1892 return $instantPlotInput;
2140 1893 }
... ...
src/InputOutput/IHMImpl/Tools/IHMJobsManagerClass.php
... ... @@ -5,8 +5,7 @@
5 5 * @details
6 6 */
7 7 class IHMJobsManagerClass {
8   -
9   - protected $jobXml, $jobXmlName;
  8 + protected $isWSJob = false;
10 9  
11 10 protected $bkgRootNode = array('condition' => 'bkgSearch-treeRootNode',
12 11 'request' => 'bkgPlot-treeRootNode',
... ... @@ -26,27 +25,149 @@ class IHMJobsManagerClass {
26 25 }
27 26  
28 27 /*
29   - * @brief Load jobs file and create it if needed
30   - */
31   - protected function init()
  28 + * @brief Get path to the jobs file
  29 + */
  30 + protected function getJobsFilePath()
  31 + {
  32 + return IHMConfigClass::getUserJobsFile();
  33 + }
  34 +
  35 + /*
  36 + * @bried Send an error notification
  37 + */
  38 + protected function sendErrorNotification($message) {
  39 + // Nothing to do here
  40 + // It used to send an email with WS
  41 + }
  42 +
  43 + /*
  44 + * @brief Decode a request object file
  45 + */
  46 + public function getRequestObjectFile($id)
  47 + {
  48 + if (!file_exists($this->getRequestObjectFilePath($id)))
  49 + return NULL;
  50 + return json_decode(file_get_contents($this->getRequestObjectFilePath($id)));
  51 + }
  52 +
  53 + /*
  54 + * @brief delete a job
  55 + */
  56 + public function deleteJob($id)
  57 + {
  58 + return $this->concurrentAccessJobsFile(array($this,'deleteJobFromId'),$id);
  59 + }
  60 +
  61 + /*
  62 + * @brief get job info about a job
  63 + */
  64 + public function getJobInfo($id)
  65 + {
  66 + return $this->concurrentAccessJobsFile(array($this,'getJobInfoById'),$id);
  67 + }
  68 +
  69 + /*
  70 + * @brief Add a new job
  71 + */
  72 + public function addJob($obj, $id, $folder, $running, $start, $result, $exitcode, $exectime = 0)
  73 + {
  74 + return $this->concurrentAccessJobsFile(array($this,'addNewJob'), array(
  75 + 'obj' => $obj,
  76 + 'id' => $id,
  77 + 'folder' => $folder,
  78 + 'running' => $running,
  79 + 'start' => $start,
  80 + 'result' => $result,
  81 + 'exitcode' => $exitcode,
  82 + 'exectime' => $exectime,
  83 + ));
  84 + }
  85 +
  86 + /*
  87 + * @brief Update the status of a job
  88 + */
  89 + public function updateJobStatus($id, $running, $exitcode, $exectime = 0)
32 90 {
33   - $this->jobXmlName = IHMConfigClass::getUserJobsFile();
34   - $this->jobXml = new DomDocument("1.0");
  91 + return $this->concurrentAccessJobsFile(array($this,'updateJobStatusById'), array(
  92 + 'id' => $id,
  93 + 'running' => $running,
  94 + 'exitcode' => $exitcode,
  95 + 'exectime' => $exectime,
  96 + ));
  97 + }
35 98  
36   - if (!file_exists($this->jobXmlName))
  99 + /*
  100 + * @brief Get the list of jobs with a specific status
  101 + */
  102 + public function getJobsByStatus($status)
  103 + {
  104 + return $this->concurrentAccessJobsFile(array($this,'getJobsByStatusInDom'), $status);
  105 + }
  106 +
  107 + /*
  108 + * @brief Get jobs that use a specific working dir
  109 + */
  110 + public function getJobsByWorkingDir($folder)
  111 + {
  112 + return $this->concurrentAccessJobsFile(array($this,'getJobsByWorkingDirInDom'), $folder);
  113 + }
  114 +
  115 + /*
  116 + * @brief Get all jobs to clean (immediate result jobs)
  117 + */
  118 + public function getJobsToClean()
  119 + {
  120 + return $this->concurrentAccessJobsFile(array($this,'getJobsToCleanInDom'), array());
  121 + }
  122 +
  123 + /*
  124 + *
  125 + */
  126 + protected function concurrentAccessJobsFile($callback, $additionalParams)
  127 + {
  128 + $lockFile = $this->getJobsFilePath().".lockfile";
  129 +
  130 + $fp = fopen($lockFile, "w+");
  131 +
  132 + if ($fp === false) {
  133 + $this->sendErrorNotification('Cannot open jobs manager lock file');
  134 + return array('success' => false, 'message' => 'Cannot open jobs manager lock file');
  135 + }
  136 +
  137 + $res = true;
  138 +
  139 + if (flock($fp, LOCK_EX))
37 140 {
38   - $res = $this->createJobsFile();
39   - if (!$res['success'])
40   - return $res;
  141 + if (!file_exists($this->getJobsFilePath())) {
  142 + $res = $this->createJobsFile();
  143 + if (!$res) {
  144 + $this->sendErrorNotification('Cannot create '.$this->getJobsFilePath());
  145 + }
  146 + }
  147 + if ($res)
  148 + {
  149 + $dom = new DOMDocument("1.0","UTF-8");
  150 + $dom->preserveWhiteSpace = false;
  151 + $dom->formatOutput = true;
  152 + $res = $dom->load($this->getJobsFilePath());
  153 + if ($res) {
  154 + $func_res = call_user_func($callback,$dom,$additionalParams);
  155 + }
  156 + else {
  157 + $this->sendErrorNotification('Cannot load '.$this->getJobsFilePath());
  158 + }
  159 + }
41 160 }
  161 + else
  162 + $res = FALSE;
42 163  
43   - $res = $this->jobXml->load($this->jobXmlName);
44   - if (!$res)
45   - return array(
46   - "success" => false,
47   - "message" => "Cannot load jobs file");
  164 + fclose($fp);
48 165  
49   - return array("success" => true);
  166 + if ($res)
  167 + return $func_res;
  168 +
  169 + $this->sendErrorNotification('Error during the concurrent access of the jobs manager file');
  170 + return array('success' => false, 'message' => 'Error during the concurrent access of the jobs manager file');
50 171 }
51 172  
52 173 /*
... ... @@ -54,36 +175,33 @@ class IHMJobsManagerClass {
54 175 */
55 176 protected function createJobsFile()
56 177 {
57   - $rootElement = $this->jobXml->createElement('jobs');
58   - $jobsInProgress = $this->jobXml->createElement('jobsInProgress');
  178 + $dom = new DOMDocument("1.0","UTF-8");
  179 + $dom->preserveWhiteSpace = false;
  180 + $dom->formatOutput = true;
  181 +
  182 + $rootElement = $dom->createElement('jobs');
  183 + $jobsInProgress = $dom->createElement('jobsInProgress');
59 184  
60 185 foreach ($this->bkgRootNode as $key => $value)
61 186 {
62   - $element = $this->jobXml->createElement("$key");
  187 + $element = $dom->createElement("$key");
63 188 $element->setAttribute('xml:id',$value);
64 189 $jobsInProgress->appendChild($element);
65 190 }
66   - $jobsFinished = $this->jobXml->createElement('jobsFinished');
  191 + $jobsFinished = $dom->createElement('jobsFinished');
67 192  
68 193 foreach ($this->resRootNode as $key => $value)
69 194 {
70   - $element = $this->jobXml->createElement("$key");
  195 + $element = $dom->createElement("$key");
71 196 $element->setAttribute('xml:id',"$value");
72 197 $jobsFinished->appendChild($element);
73 198 }
74 199  
75 200 $rootElement->appendChild($jobsInProgress);
76 201 $rootElement->appendChild($jobsFinished);
77   - $this->jobXml->appendChild($rootElement);
78   -
79   - $res = $this->jobXml->save($this->jobXmlName);
  202 + $dom->appendChild($rootElement);
80 203  
81   - if (!$res)
82   - return array(
83   - "success" => false,
84   - "message" => "Cannot create new jobs file");
85   -
86   - return array("success" => true);
  204 + return $dom->save($this->getJobsFilePath());
87 205 }
88 206  
89 207 /*
... ... @@ -105,16 +223,6 @@ class IHMJobsManagerClass {
105 223 }
106 224  
107 225 /*
108   - * @brief Decode a request object file
109   - */
110   - public function getRequestObjectFile($id)
111   - {
112   - if (!file_exists($this->getRequestObjectFilePath($id)))
113   - return NULL;
114   - return json_decode(file_get_contents($this->getRequestObjectFilePath($id)));
115   - }
116   -
117   - /*
118 226 * @brief Delete a request object file
119 227 */
120 228 protected function deleteRequestObjectFile($id) {
... ... @@ -137,15 +245,11 @@ class IHMJobsManagerClass {
137 245 }
138 246  
139 247 /*
140   - * @brief delete a job
  248 + * @brief delete a job from job id
141 249 */
142   - public function deleteJob($id)
  250 + protected function deleteJobFromId($dom, $id)
143 251 {
144   - $res = $this->init();
145   - if (!$res['success'])
146   - return $res;
147   -
148   - $job = $this->jobXml->getElementById($id);
  252 + $job = $dom->getElementById($id);
149 253  
150 254 //delete job
151 255 if (!$job)
... ... @@ -179,7 +283,7 @@ class IHMJobsManagerClass {
179 283 $this->deleteRequestObjectFile($id);
180 284  
181 285 $job->parentNode->removeChild($job);
182   - $res = $this->jobXml->save($this->jobXmlName);
  286 + $res = $dom->save($this->getJobsFilePath());
183 287  
184 288 if (!$res)
185 289 return array(
... ... @@ -192,45 +296,24 @@ class IHMJobsManagerClass {
192 296 /*
193 297 * @brief get job info about a job
194 298 */
195   - public function getJobInfo($id)
  299 + protected function getJobInfoById($dom, $id)
196 300 {
197   - $res = $this->init();
198   - if (!$res['success'])
199   - return $res;
200   -
201   - $job = $this->jobXml->getElementById($id);
202   -
203   - $attributes = [];
204   - foreach( $job->attributes as $attrName => $attrNode) {
205   - $attributes[$attrName] = $attrNode->nodeValue;
206   - }
  301 + $job = $dom->getElementById($id);
207 302  
208 303 $format = 'unknown';
209 304 $compression = 'unknown';
210   - if($job)
  305 + if(!$job)
211 306 {
  307 + return array(
  308 + 'success' => false,
  309 + 'message' => "Cannot retrieve job ".$id,
  310 + );
  311 + }
  312 +
  313 + if (!$this->isWSJob) {
  314 + // Not used for a WS job
212 315 $name = $job->getAttribute('name');
213   - $status = $job->getAttribute('status');
214   - $jobType = $job->getAttribute('jobType');
215 316 $info = $job->getAttribute('info');
216   - $start = $job->getAttribute('start');
217   - $stop = $job->getAttribute('stop');
218   - $result = $job->getAttribute('result');
219   - $folder = $job->getAttribute('folder');
220   - $exectime = $job->getAttribute('exectime');
221   - $request_obj = $this->getRequestObjectFile($id);
222   - if (isset($request_obj))
223   - {
224   - if (isset($request_obj->format))
225   - {
226   - $format = strtolower($request_obj->format);
227   - if (($format == "pdf") || ($format == "ps"))
228   - //auto compression for plot request
229   - $compression = ".tar.gz";
230   - }
231   - if (isset($request_obj->compression))
232   - $compression = strtolower($request_obj->compression);
233   - }
234 317 $sendToSamp = $job->getAttribute('sendToSamp');
235 318 if (empty($sendToSamp)) {
236 319 $sendToSamp = false;
... ... @@ -239,37 +322,57 @@ class IHMJobsManagerClass {
239 322 $sendToSamp = ($sendToSamp == "true");
240 323 }
241 324 }
242   - return array(
  325 + $exectime = $job->getAttribute('exectime');
  326 + $status = $job->getAttribute('status');
  327 + $jobType = $job->getAttribute('jobType');
  328 + $start = $job->getAttribute('start');
  329 + $stop = $job->getAttribute('stop');
  330 + $result = $job->getAttribute('result');
  331 + $folder = $job->getAttribute('folder');
  332 + $request_obj = $this->getRequestObjectFile($id);
  333 + if (isset($request_obj))
  334 + {
  335 + if (isset($request_obj->format))
  336 + {
  337 + $format = strtolower($request_obj->format);
  338 + if (($format == "pdf") || ($format == "ps"))
  339 + //auto compression for plot request
  340 + $compression = ".tar.gz";
  341 + }
  342 + if (isset($request_obj->compression))
  343 + $compression = strtolower($request_obj->compression);
  344 + }
  345 +
  346 + $result = array(
243 347 'success' => true,
244 348 'id' => $id,
245   - 'name' => $name,
246 349 'status' => $status,
247   - 'exectime' => $exectime,
248 350 'jobType' => $jobType,
249   - 'info' => $info,
250 351 'start' => $start,
251 352 'stop' => $stop,
252 353 'folder' => $folder,
253 354 'result' => $result,
254 355 'format' => $format,
255 356 'compression' => $compression,
256   - 'sendToSamp' => $sendToSamp,
  357 + 'exectime' => $exectime,
257 358 );
  359 +
  360 + if (!$this->isWSJob) {
  361 + $result['name'] = $name;
  362 + $result['info'] = $info;
  363 + $result['sendToSamp'] = $sendToSamp;
  364 + }
  365 +
  366 + return $result;
258 367 }
259 368  
260 369 /*
261   - * @brief Add a new job
262   - */
263   - public function addJob($obj, $id, $folder, $running, $start, $result, $exitcode, $exectime)
  370 + * @brief Getjob info from request object
  371 + */
  372 + protected function getRequestInfo($obj, $start)
264 373 {
265   - $obj = get_object_vars($obj); // Allow access to elements where the key is in dash-separated form.
266   - $res = $this->init();
267   - if (!$res['success'])
268   - return $res;
269   -
270 374 $infos = [];
271 375 switch ($obj['nodeType']) {
272   - // Data mining
273 376 case 'condition':
274 377 $name = 'datamining_'.time();
275 378 if($obj['name'] != '') {
... ... @@ -279,7 +382,6 @@ class IHMJobsManagerClass {
279 382 $infos['Start date'] = $obj['startDate'];
280 383 $infos['Stop date'] = $obj['stopDate'];
281 384 break;
282   -
283 385 case 'statistics':
284 386 $name = 'statistics_'.time();
285 387 $infos['Name'] = $obj['name']; // TODO: name toujours égal à 'test' (?)
... ... @@ -325,7 +427,6 @@ class IHMJobsManagerClass {
325 427 $infos['Parameters'] = '<ul><li>' . join('</li><li>', $params) . '</li></ul>';
326 428 }
327 429 break;
328   -
329 430 case 'download':
330 431 $name = $obj['downloadSrc'] == '2' ? "download_fits_".time() : "download_data_".time();
331 432 $params = [];
... ... @@ -340,35 +441,25 @@ class IHMJobsManagerClass {
340 441 $infos['Start date'] = $obj['startDate'];
341 442 $infos['Stop date'] = $obj['stopDate'];
342 443 break;
343   -
344   - // Plot
345 444 case 'request':
346 445 $name = "request_".time();
347 446  
348 447 $infos['Output'] = strtolower($obj['file-format']) . ' (' . strtolower($obj['file-output']) . ')';
349   - foreach ($obj['tabs'] as $tab) {
350   - if($tab->id == $obj['last-plotted-tab']) {
351   - $infos['Start date'] = $tab->startDate;
352   - $infos['Stop date'] = $tab->stopDate;
353   -
354   - $strPanels = [];
355   -
356   - foreach ($tab->panels as $panel) {
357   - $strParams = '';
358   - foreach ($panel->params as $param) {
359   - $strParams .= $param->paramid . ($param === end($panel->params) ? '' : ', ');
360   - }
361   - $infos['• Panel ' . $panel->id] = $strParams;
362   - }
  448 + $infos['Start date'] = $obj->startDate;
  449 + $infos['Stop date'] = $obj->stopDate;
363 450  
364   - continue;
  451 + foreach ($obj->panels as $panel) {
  452 + $strParams = '';
  453 + foreach ($panel->params as $param) {
  454 + $strParams .= $param->paramid . ($param === end($panel->params) ? '' : ', ');
365 455 }
  456 + $infos['• Panel ' . $panel->id] = $strParams;
366 457 }
367 458 break;
368   -
369 459 default:
370 460 $name = "unknown_".time();
371 461 }
  462 +
372 463 $infos['Started at'] = gmdate("Y-m-d H:i:s", $start);
373 464  
374 465 $strInfo = '';
... ... @@ -376,84 +467,104 @@ class IHMJobsManagerClass {
376 467 $strInfo .= ($key == 'Started at' ? '<hr/>' : '') . '<b>' . $key . '</b>: ' . $info . '<br/>';
377 468 }
378 469  
379   - $newJob = $this->jobXml->createElement('job');
380   - $newJob->setAttribute('xml:id', $id);
381   - $newJob->setAttribute('jobType', $obj['nodeType']);
382   - $newJob->setAttribute('name', $name);
383   - $newJob->setAttribute('info', $strInfo);
384   - $newJob->setAttribute('folder', $folder);
385   - $newJob->setAttribute('result', $result);
386   - $newJob->setAttribute('start', date('d-m-Y H:i:s', $start));
387   - $newJob->setAttribute('exectime', $exectime);
388   - //to know if know if it's an immediate job or not
389   - $newJob->setAttribute('immediate', !$running);
  470 + return array($name, $strInfo);
  471 + }
  472 +
  473 + /*
  474 + * @brief Get job key
  475 + */
  476 + protected function getJobKey($obj)
  477 + {
  478 + return $obj['nodeType'];
  479 + }
390 480  
391   - $sendToSamp = isset($obj['sendToSamp']) ? $obj['sendToSamp'] : FALSE;
392   - if ($sendToSamp) {
393   - $newJob->setAttribute('sendToSamp', "true");
  481 + /*
  482 + * @brief Add a new job
  483 + */
  484 + protected function addNewJob($dom, $args)
  485 + {
  486 + $obj = get_object_vars($args['obj']); // Allow access to elements where the key is in dash-separated form.
  487 + $key = $this->getJobKey($obj);
  488 +
  489 +
  490 + $newJob = $dom->createElement('job');
  491 + $newJob->setAttribute('xml:id', $args['id']);
  492 + $newJob->setAttribute('jobType', $key);
  493 + $newJob->setAttribute('folder', $args['folder']);
  494 + $newJob->setAttribute('result', $args['result']);
  495 + $newJob->setAttribute('start', date('d-m-Y H:i:s', $args['start']));
  496 + //to know if know if it's an immediate job or not
  497 + $newJob->setAttribute('immediate', !$args['running']);
  498 + $newJob->setAttribute('exectime', $args['exectime']);
  499 + if (!$this->isWSJob) {
  500 + list($name, $strInfo) = $this->getRequestInfo($obj, $args['name']);
  501 + $newJob->setAttribute('name', $name);
  502 + $newJob->setAttribute('info', $strInfo);
  503 + $sendToSamp = isset($obj['sendToSamp']) ? $obj['sendToSamp'] : FALSE;
  504 + if ($sendToSamp) {
  505 + $newJob->setAttribute('sendToSamp', "true");
  506 + }
  507 + }
  508 + else {
  509 + $newJob->setAttribute('user', IHMConfigClass::getUserName());
  510 + $newJob->setAttribute('host', IHMConfigClass::getUserHost());
394 511 }
395 512  
396   - $key = $obj['nodeType'];
397   - if ($running)
  513 +
  514 + if ($args['running'])
398 515 {
399   - $rootJobNode = $this->jobXml->getElementById($this->bkgRootNode[$key]);
  516 + $rootJobNode = $dom->getElementById($this->bkgRootNode[$key]);
400 517 if (!$rootJobNode)
401 518 {
402   - $rootJobNode = $this->jobXml->createElement("$key");
  519 + $rootJobNode = $dom->createElement("$key");
403 520 $rootJobNode->setAttribute('xml:id', $this->bkgRootNode[$key]);
404   - $jobsInProgress = $this->jobXml->getElementsByTagName('jobsInProgress')->item(0);
  521 + $jobsInProgress = $dom->getElementsByTagName('jobsInProgress')->item(0);
405 522 $jobsInProgress->appendChild($rootJobNode);
406 523 }
407 524 }
408 525 else
409 526 {
410   - $rootJobNode = $this->jobXml->getElementById($this->resRootNode[$key]);
  527 + $rootJobNode = $dom->getElementById($this->resRootNode[$key]);
411 528 if (!$rootJobNode)
412 529 {
413   - $rootJobNode = $this->jobXml->createElement("$key");
  530 + $rootJobNode = $dom->createElement("$key");
414 531 $rootJobNode->setAttribute('xml:id', $this->resRootNode[$key]);
415   - $jobsFinished = $this->jobXml->getElementsByTagName('jobsFinished')->item(0);
  532 + $jobsFinished = $dom->getElementsByTagName('jobsFinished')->item(0);
416 533 $jobsFinished->appendChild($rootJobNode);
417 534 }
418 535 }
419 536  
420 537 $rootJobNode->appendChild($newJob);
421 538  
422   - if (!$this->jobXml->save($this->jobXmlName))
  539 + if (!$dom->save($this->getJobsFilePath()))
423 540 return array("success" => false, "message" => "Cannot save job manager file");
424 541  
425   - $this->saveRequestObjectFile($obj, $id);
  542 + $this->saveRequestObjectFile($obj, $args['id']);
426 543  
427   - $this->updateJobStatus($id, $running, $exitcode, $exectime);
  544 + $this->updateJobStatusById($dom, $args);
428 545  
429   - return $this->getJobInfo($id);
  546 + return $this->getJobInfoById($dom, $args['id']);
430 547 }
431 548  
432 549 /*
433   - * @brief Update the status of a job
  550 + * @brief Update the status of a job by id
434 551 */
435   - public function updateJobStatus($id, $running, $exitcode, $exectime = 0)
  552 + protected function updateJobStatusById($dom, $args)
436 553 {
437   - $res = $this->init();
438   - if (!$res['success'])
439   - return $res;
440   -
441   - $this->lockService();
442   -
443   - $job = $this->jobXml->getElementById($id);
  554 + $job = $dom->getElementById($args['id']);
444 555  
445 556 if (!isset($job)) {
446 557 return array("success" => false, "message" => "Cannot found job");
447 558 }
448 559  
449   - $jobstatus = $this->getJobStatus($running,$exitcode);
  560 + $jobstatus = $this->getJobStatus($args['running'], $args['exitcode']);
450 561 $job->setAttribute('status', $jobstatus);
451 562  
452   - $job->setAttribute('exectime', $exectime);
  563 + $job->setAttribute('exectime', $args['exectime']);
453 564  
454 565 $infos = [];
455 566  
456   - if ($running) {
  567 + if ($args['running']) {
457 568 $job->setAttribute('stop', 'unknown');
458 569 } else if ($job->getAttribute('stop') == '' || $job->getAttribute('stop') == 'unknown') {
459 570 $job->setAttribute('stop', date('d-m-Y H:i:s', time()));
... ... @@ -462,31 +573,33 @@ class IHMJobsManagerClass {
462 573 $interval = (new DateTime('now'))->diff($start);
463 574 $infos['Job duration'] = $interval->format('%Hh %Im %Ss');
464 575  
465   - $resPath = glob(USERWORKINGDIR . $job->getAttribute('folder') . '/' . $job->getAttribute('result') . '*')[0];
  576 + if (!$this->isWSJob) {
  577 + $resPath = glob(USERWORKINGDIR . $job->getAttribute('folder') . '/' . $job->getAttribute('result') . '*')[0];
466 578  
467   - if($job->getAttribute('jobType') == 'condition') {
468   - $resXml = new DomDocument();
469   - $resXml->load($resPath);
470   - $infos['nb intervals'] = $resXml->getElementsByTagName('nbIntervals')->item(0)->nodeValue;
471   - }
  579 + if($job->getAttribute('jobType') == 'condition') {
  580 + $resXml = new DomDocument();
  581 + $resXml->load($resPath);
  582 + $infos['nb intervals'] = $resXml->getElementsByTagName('nbIntervals')->item(0)->nodeValue;
  583 + }
472 584  
473   - $fileSize = filesize($resPath);
474   - if ($fileSize < 1024) {
475   - $strSize = number_format($fileSize, 2, '.', ' ') . 'b';
476   - } else if($fileSize < 1024*1024) {
477   - $strSize = number_format($fileSize/1024, 2, '.', ' ') . 'kb';
478   - } else if($fileSize < 1024*1024*1024) {
479   - $strSize = number_format($fileSize/(1024*1024), 2, '.', ' ') . 'mb';
480   - } else {
481   - $strSize = number_format($fileSize/(1024*1024*1024), 2, '.', ' ') . 'gb';
  585 + $fileSize = filesize($resPath);
  586 + if ($fileSize < 1024) {
  587 + $strSize = number_format($fileSize, 2, '.', ' ') . 'b';
  588 + } else if($fileSize < 1024*1024) {
  589 + $strSize = number_format($fileSize/1024, 2, '.', ' ') . 'kb';
  590 + } else if($fileSize < 1024*1024*1024) {
  591 + $strSize = number_format($fileSize/(1024*1024), 2, '.', ' ') . 'mb';
  592 + } else {
  593 + $strSize = number_format($fileSize/(1024*1024*1024), 2, '.', ' ') . 'gb';
  594 + }
  595 + $infos['File size'] = $strSize;
482 596 }
483   - $infos['File size'] = $strSize;
484 597  
485   - $this->jobXml->getElementById($this->resRootNode[$job->getAttribute('jobType')])->appendChild($job);
  598 + $dom->getElementById($this->resRootNode[$job->getAttribute('jobType')])->appendChild($job);
486 599 }
487 600  
488   - if($exitcode != 0) {
489   - $infos['Error code'] = $exitcode;
  601 + if($args['exitcode'] != 0) {
  602 + $infos['Error code'] = $args['exitcode'];
490 603 }
491 604  
492 605 $strInfo = $job->getAttribute('info');
... ... @@ -495,30 +608,22 @@ class IHMJobsManagerClass {
495 608 }
496 609 $job->setAttribute('info', $strInfo);
497 610  
498   - $res = $this->jobXml->save($this->jobXmlName);
499   -
500   - $this->unlockService();
  611 + $res = $dom->save($this->getJobsFilePath());
501 612  
502 613 if (!$res)
503 614 return array(
504 615 'success' => false,
505 616 'message' => "Cannot save jobs status file");
506 617  
507   - return $this->getJobInfo($id);
  618 + return $this->getJobInfoById($dom, $args['id']);
508 619 }
509 620  
510   - public function lockService(){}
511   - public function unlockService(){}
512 621 /*
513   - * @brief Get the list of jobs with a specific status
  622 + * @brief Get the list of jobs with a specific status in a $dom
514 623 */
515   - public function getJobsByStatus($status)
  624 + protected function getJobsByStatusInDom($dom, $status)
516 625 {
517   - $res = $this->init();
518   - if (!$res['success'])
519   - return $res;
520   -
521   - $xp = new domxpath($this->jobXml);
  626 + $xp = new domxpath($dom);
522 627 $jobs = $xp->query("//job[@status='".$status."']");
523 628  
524 629 $jobsId = array();
... ... @@ -529,15 +634,11 @@ class IHMJobsManagerClass {
529 634 }
530 635  
531 636 /*
532   - * @brief Get jobs that use a specific working dir
  637 + * @brief Get jobs that use a specific working dir in a $dom
533 638 */
534   - public function getJobsByWorkingDir($folder)
  639 + protected function getJobsByWorkingDirInDom($dom, $folder)
535 640 {
536   - $res = $this->init();
537   - if (!$res['success'])
538   - return $res;
539   -
540   - $xp = new domxpath($this->jobXml);
  641 + $xp = new domxpath($dom);
541 642 $jobs = $xp->query("//job[@folder='".$folder."']");
542 643  
543 644 $jobsId = array();
... ... @@ -548,16 +649,12 @@ class IHMJobsManagerClass {
548 649 }
549 650  
550 651 /*
551   - * @brief Get all jobs to clean (immediate result jobs)
  652 + * @brief Get all jobs to clean (immediate result jobs) in a $dom
552 653 */
553   - public function getJobsToClean()
  654 + protected function getJobsToCleanInDom($dom)
554 655 {
555   - $res = $this->init();
556   - if (!$res['success'])
557   - return $res;
558   -
559 656 // Get immediate jobs
560   - $xp = new domxpath($this->jobXml);
  657 + $xp = new domxpath($dom);
561 658 $jobs = $xp->query("//job[@immediate='1']");
562 659  
563 660 $jobsId = array();
... ...
src/InputOutput/IHMImpl/Tools/IHMParamManagerClass.php
... ... @@ -189,6 +189,7 @@ class IHMParamManagerClass
189 189  
190 190 //check templated parameter
191 191 $real_param_id = $paramId;
  192 + $paramPath = "";
192 193 if ($this->templateParamsManager->isTemplatedParam($paramId)) {
193 194 $paramPath = $this->templateParamsManager->generateTemplatedParamFile($paramId, $templateArgs, $tableLink);
194 195 $real_param_id = $this->templateParamsManager->getTemplatedParamId($paramId, $templateArgs);
... ... @@ -205,7 +206,7 @@ class IHMParamManagerClass
205 206  
206 207 $this->addLinkedLocalParams($paramId, $paramsData, $templateArgs);
207 208  
208   - return array("id" => $real_param_id, "indexes" => $indexes, "calib_infos" => $calib_infos);
  209 + return array("id" => $real_param_id, "indexes" => $indexes, "calib_infos" => $calib_infos, "path" => $paramPath);
209 210 }
210 211  
211 212 /*
... ...
src/InputOutput/IHMImpl/Tools/IHMParamTemplateClass.php
... ... @@ -114,7 +114,6 @@ class IHMParamTemplateClass
114 114 }
115 115  
116 116 $exploded_args = sscanf($template_args_str , $args_format);
117   - error_log($exploded_args);
118 117  
119 118 if ($exploded_args === -1)
120 119 return FALSE;
... ...
src/InputOutput/IHMImpl/Tools/IHMUserWSManagerClass.php 0 → 100644
... ... @@ -0,0 +1,192 @@
  1 +<?php
  2 +
  3 +/**
  4 + * @class IHMUserWSManagerClass
  5 + * @brief Manager for IHM user workspace
  6 + * @details
  7 + */
  8 +class IHMUserWSManagerClass
  9 +{
  10 + private static $WS_VERSION = 1;
  11 +
  12 + protected $wsInfo = null;
  13 +
  14 + public function init()
  15 + {
  16 + //check user workspace
  17 + if (IHMConfigClass::getUserName() == "" || !is_dir(IHMConfigClass::getUserPath()))
  18 + throw new Exception('Cannot find user workspace.');
  19 +
  20 + //Load info about WS
  21 + if (!$this->loadWSInfoFile())
  22 + throw new Exception('Error to load workspace info file.');
  23 +
  24 + //Update WS if need
  25 + if (!$this->update())
  26 + throw new Exception('Error during user workspace conversion.');
  27 +
  28 + return TRUE;
  29 + }
  30 +
  31 + public function update()
  32 + {
  33 + while (IHMUserWSManagerClass::$WS_VERSION > $this->wsInfo['version']) {
  34 + $updateMethod = "updateFromVersion".$this->wsInfo['version'];
  35 + if (method_exists($this,$updateMethod)) {
  36 + if (!$this->{$updateMethod}()) {
  37 + return FALSE;
  38 + }
  39 + }
  40 + $this->wsInfo['version'] += 1;
  41 + if (!$this->saveWSInfoFile()) {
  42 + return FALSE;
  43 + }
  44 + }
  45 + return TRUE;
  46 + }
  47 +
  48 + private function loadWSInfoFile()
  49 + {
  50 + if (file_exists(IHMConfigClass::getUserWSInfoFilePath())) {
  51 + $infoContent = file_get_contents(IHMConfigClass::getUserWSInfoFilePath());
  52 + if (empty($infoContent)) {
  53 + return FALSE;
  54 + }
  55 + $this->wsInfo = json_decode($infoContent, TRUE);
  56 + if (empty($this->wsInfo)) {
  57 + return FALSE;
  58 + }
  59 +
  60 + return TRUE;
  61 + }
  62 +
  63 + //Init info file
  64 + $this->wsInfo = array(
  65 + "version" => 0,
  66 + );
  67 +
  68 + return $this->saveWSInfoFile();
  69 + }
  70 +
  71 + private function saveWSInfoFile()
  72 + {
  73 + if (empty($this->wsInfo)) {
  74 + return FALSE;
  75 + }
  76 +
  77 + $json_data = json_encode($this->wsInfo);
  78 +
  79 + if ($json_data === FALSE) {
  80 + return FALSE;
  81 + }
  82 +
  83 +
  84 + return file_put_contents(IHMConfigClass::getUserWSInfoFilePath(),$json_data);
  85 + }
  86 +
  87 + private function updateFromVersion0() {
  88 + // This update split plot requests
  89 +
  90 + // Load user requests file
  91 + $req_mgr_file_path = IHMConfigClass::getUserRequestManagerFilePath();
  92 + if (!file_exists($req_mgr_file_path)) {
  93 + return TRUE;
  94 + }
  95 +
  96 + $dom = new DOMDocument();
  97 + if (!$dom->load($req_mgr_file_path)) {
  98 + return FALSE;
  99 + }
  100 +
  101 + // Retrieve all plot requests and last request id
  102 + $plot_requests = array();
  103 + $last_id = 0;
  104 + foreach ($dom->getElementsByTagName('request') as $requestNode) {
  105 + $request_id = $requestNode->getAttribute("xml:id");
  106 + $plot_requests[$request_id] = $requestNode;
  107 + sscanf($request_id, "req_%d", $crt_id);
  108 + if ($crt_id > $last_id) {
  109 + $last_id = $crt_id;
  110 + }
  111 + }
  112 +
  113 + if (empty($plot_requests)) {
  114 + //No plot requests
  115 + return TRUE;
  116 + }
  117 +
  118 + // Split requests
  119 + $split_plot = array();
  120 + foreach ($plot_requests as $id => $node) {
  121 + $req_data_path = IHMConfigClass::getStoredRequestPath() . $id;
  122 + if (!file_exists($req_data_path)) {
  123 + continue;
  124 + }
  125 + $req_data_content = file_get_contents($req_data_path);
  126 + if (!$req_data_content) {
  127 + continue;
  128 + }
  129 + $req_data_json = json_decode($req_data_content,TRUE);
  130 + if (!$req_data_json) {
  131 + continue;
  132 + }
  133 + if (array_key_exists("tabs", $req_data_json)) {
  134 + $split_plot[$id] = array();
  135 + $tab_index = 1;
  136 + foreach ($req_data_json["tabs"] as $tab) {
  137 + $new_splitted_request = array_merge(array(), $tab);
  138 + foreach (array_keys($req_data_json) as $key) {
  139 + if (in_array($key, array('tabs', 'startDate', 'stopDate', 'durationDay', 'durationHour', 'durationMin', 'durationSec'))) {
  140 + continue;
  141 + }
  142 + $new_splitted_request[$key] = $req_data_json[$key];
  143 + }
  144 + if (count($req_data_json["tabs"]) > 1) {
  145 + if (!empty($new_splitted_request['tab-name'])) {
  146 + $new_splitted_request['name'] .= ('_' . $new_splitted_request['tab-name']);
  147 + }
  148 + else {
  149 + $new_splitted_request['name'] .= ('_Plot' . $tab_index);
  150 + }
  151 + }
  152 + foreach (array("tab-name", "last-plotted-tab", "active-tab-id", "last-tab-id", "multi-plot-linked") as $key) {
  153 + unset($new_splitted_request[$key]);
  154 + }
  155 + ++$last_id;
  156 + $new_splitted_request['id'] = "req_".$last_id;
  157 + file_put_contents(IHMConfigClass::getStoredRequestPath() . $new_splitted_request['id'], json_encode($new_splitted_request));
  158 + $split_plot[$id][$new_splitted_request['id']] = $new_splitted_request['name'];
  159 + ++$tab_index;
  160 + }
  161 + }
  162 + }
  163 +
  164 + if (!empty($split_plot)) {
  165 + //Backup
  166 + $backupPath = IHMConfigClass::getMigrationBackupPath($this->wsInfo['version']);
  167 + copy($req_mgr_file_path, $backupPath.basename($req_mgr_file_path));
  168 + foreach ($split_plot as $old_key => $split) {
  169 + $req_data_path = IHMConfigClass::getStoredRequestPath() . $old_key;
  170 + copy($req_data_path, $backupPath.basename($req_data_path));
  171 + }
  172 +
  173 + //Apply split in user requests file + cleanup
  174 + foreach ($split_plot as $old_key => $split) {
  175 + $parentNode = $plot_requests[$old_key]->parentNode;
  176 + $parentNode->removeChild($plot_requests[$old_key]);
  177 + unlink(IHMConfigClass::getStoredRequestPath() . $old_key);
  178 + foreach ($split as $new_key => $new_name) {
  179 + $new_node = $dom->createElement("request");
  180 + $new_node->setAttribute("xml:id", $new_key);
  181 + $new_node->setAttribute("name", $new_name);
  182 + $parentNode->appendChild($new_node);
  183 + }
  184 + }
  185 +
  186 + $dom->save($req_mgr_file_path);
  187 + }
  188 +
  189 + return TRUE;
  190 + }
  191 +}
  192 +
... ...
src/InputOutput/WSImpl/Config/WSConfigClass.php
... ... @@ -21,12 +21,14 @@ class WSConfigClass
21 21  
22 22 private static $wsResultDir = "WSRESULT";
23 23 private static $jobsFile = "WSjobs.xml";
24   - private static $LockFile = "LOCK";
25 24  
26 25 private static $WebUrl;
27 26  
28 27 private static $dataSetInfoDir = "LocalData/DataSetInfo";
29 28  
  29 + private static $anonymousUserName = "impex";
  30 + private static $anonymousUserPwd = "impexfp7";
  31 +
30 32 public static function getUrl()
31 33 {
32 34 //self::$WebUrl = "http://apus.irap.omp.eu/NEWAMDA/data/";
... ... @@ -45,22 +47,6 @@ class WSConfigClass
45 47 return IHMConfigClass::getDataDir().self::$wsResultDir.'/'.self::$jobsFile;
46 48 }
47 49  
48   - public static function lockServices()
49   - {
50   - touch(IHMConfigClass::getDataDir().self::$wsResultDir.'/'.self::$LockFile);
51   - }
52   -
53   - public static function isLockedServices()
54   - {
55   - return file_exists(IHMConfigClass::getDataDir().self::$wsResultDir.'/'.self::$LockFile);
56   - }
57   -
58   - public static function unlockServices()
59   - {
60   - if (file_exists(IHMConfigClass::getDataDir().self::$wsResultDir.'/'.self::$LockFile))
61   - unlink(IHMConfigClass::getDataDir().self::$wsResultDir.'/'.self::$LockFile);
62   - }
63   -
64 50 public static function getDataSetInfoDir()
65 51 {
66 52 return IHMConfigClass::getGenericDataPath().self::$dataSetInfoDir.'/';
... ... @@ -75,5 +61,15 @@ class WSConfigClass
75 61 {
76 62 return IHMConfigClass::getGenericDataPath()."LocalData/OrbitsAll.xml";
77 63 }
  64 +
  65 + public static function getAnonymousUserName()
  66 + {
  67 + return self::$anonymousUserName;
  68 + }
  69 +
  70 + public static function getAnonymousUserPwd()
  71 + {
  72 + return self::$anonymousUserPwd;
  73 + }
78 74 }
79 75 ?>
... ...
src/InputOutput/WSImpl/Params/DownloadImpl/WSInputOutputParamsDownloadClass.php
... ... @@ -7,6 +7,8 @@
7 7 */
8 8 class WSInputOutputParamsDownloadClass extends IHMInputOutputParamsAbstractClass
9 9 {
  10 + protected $templateParamsManager = null;
  11 +
10 12 /*
11 13 * @brief Constructor
12 14 */
... ... @@ -14,7 +16,17 @@ class WSInputOutputParamsDownloadClass extends IHMInputOutputParamsAbstractClass
14 16 {
15 17 $this->paramManager = new IHMParamManagerClass();
16 18 $this->jobsManager = new WSJobsManagerClass();
  19 + $this->templateParamsManager = new IHMParamTemplateClass();
17 20 }
  21 +
  22 + /*
  23 + * @brief Get Task
  24 + */
  25 + protected function getTask($input)
  26 + {
  27 + return WSInputOutputClass::getService();
  28 + }
  29 +
18 30 /*
19 31 * @brief method to unmarshall a download request
20 32 */
... ... @@ -31,6 +43,9 @@ class WSInputOutputParamsDownloadClass extends IHMInputOutputParamsAbstractClass
31 43 $outputsNode = $requestNode->getOutputsNode();
32 44 $downloadNode = $outputsNode->addNewOutput(RequestOutputTypeEnum::DOWNLOAD);
33 45  
  46 + // hash is used to be sure to have a unique file name for two differents requests
  47 + $hash = "";
  48 +
34 49 switch (strtoupper($input->timeformat))
35 50 {
36 51 case 'ISO08601' :
... ... @@ -42,6 +57,7 @@ class WSInputOutputParamsDownloadClass extends IHMInputOutputParamsAbstractClass
42 57 default :
43 58 $downloadNode->setTimeFormat(RequestOutputDownloadTimeFormatEnum::ISO);
44 59 }
  60 + $hash .= $input->timeformat;
45 61  
46 62 switch ($input->fileformat)
47 63 {
... ... @@ -67,38 +83,46 @@ class WSInputOutputParamsDownloadClass extends IHMInputOutputParamsAbstractClass
67 83  
68 84 //add params to output
69 85 $resultFile = WSInputOutputClass::getService();
  86 + $resultFile .= "_".$input->file_info;
70 87 $isFirst = true;
  88 + $firstParam = "";
  89 +
71 90  
72 91 foreach ($input->list as $param)
73 92 {
74   - $paramInfo = $this->paramManager->addExistingParam($param->paramid, $this->paramsData, $param->template_args);
75   - // $this->paramManager->applyRangesAndIndexes($this->paramsData, $param, FALSE, $paramInfo);
  93 + $id = $param->paramid;
  94 + $parsedParam = $this->templateParamsManager->parseTemplatedParam($id);
  95 + $tempArgs = array();
  96 + if ($parsedParam !== FALSE) {
  97 + $id = $parsedParam['paramid'];
  98 + foreach ($parsedParam['template_args'] as $key => $val) {
  99 + $tempArgs[$key] = $val;
  100 + }
  101 + }
  102 + $paramInfo = $this->paramManager->addExistingParam($id, $this->paramsData, $tempArgs);
76 103  
77 104 $downloadNode->addParam($paramInfo['id'],$paramInfo['indexes'],$paramInfo['calib_infos']);
78 105 $paramsNode->addParam($paramInfo['id']);
79 106  
80   - if ( WSInputOutputClass::getService() == WSConfigClass::DATASET && $isFirst)
81   - {
82   - $resultFile .= "_".$this->getDatasetIdFromParamInfo($param->paramid);
83   - $isFirst = false;
  107 + if ($isFirst) {
  108 + $firstParam = $paramInfo['id'];
  109 + $isFirst = FALSE;
84 110 }
85   - elseif ( WSInputOutputClass::getService() != WSConfigClass::DATASET )
86   - {
87   - $resultFile .= "_".$paramInfo['id'];
88   - if (!empty($paramInfo['indexes']))
89   - foreach ($paramInfo['indexes'] as $index)
90   - $resultFile .= "_".$index;
91   - }
92   -
93 111 }
94 112  
95   - if ($input->sampling)
96   - {
  113 + if (isset($input->sampling))
  114 + {
97 115 $downloadNode->setSamplingTime($input->sampling);
98 116 $downloadNode->setStructure(RequestOutputDownloadStructureEnum::ONE_FILE);
99   - }
  117 + $hash .= $input->sampling;
  118 + }
  119 + else if (isset($input->ref_sampling_param))
  120 + {
  121 + $downloadNode->setStructure(RequestOutputDownloadStructureEnum::ONE_FILE_REFPARAM);
  122 + $hash .= $input->ref_sampling_param;
  123 + }
100 124 else {
101   - $downloadNode->setStructure(RequestOutputDownloadStructureEnum::ONE_FILE_PER_PARAMETER_PER_INTERVAL);
  125 + $downloadNode->setStructure(RequestOutputDownloadStructureEnum::ONE_FILE_PER_PARAMETER_PER_INTERVAL);
102 126 }
103 127  
104 128 switch ($input->compression)
... ... @@ -114,28 +138,29 @@ class WSInputOutputParamsDownloadClass extends IHMInputOutputParamsAbstractClass
114 138 $resultFilePrefix = "output-";
115 139 }
116 140  
117   - $resultFile .= "_".date("Ymd\THis", strtotime($input->startDate))."_".date("Ymd\THis",strtotime($input->stopDate));
  141 + $resultFile .= '_' . md5($hash) . "_".date("Ymd\THis", strtotime($input->startDate))."_".date("Ymd\THis",strtotime($input->stopDate));
118 142  
119 143 $this->paramsData->addWaitingResult(WSInputOutputClass::getService(), $resultFile.$extension);
120 144  
121 145 // internal kernel output
122   - $postProcessCmd = "mv ".$resultFilePrefix."*";
  146 + $postProcessCmd = "mv ".$resultFilePrefix.$firstParam."*[0-9]";
123 147  
124 148 $postProcessCmd .= $extension;
125 149 $postProcessCmd .= " ".WSConfigClass::getWsResultDir().$resultFile.$extension;
126 150  
127 151 $this->paramsData->setPostCmd($postProcessCmd);
128   -
129   -
  152 +
130 153 $this->paramsData->setBatchEnable(WSConfigClass::$enableBatch);
131 154  
  155 + $this->paramsData->setFromWS(true);
  156 +
132 157 return $this->paramsData;
133 158 }
134 159  
135 160 /*
136 161 * @brief Unmarshall the time definition from the WS request
137 162 */
138   - protected function unmarshallTimeDefinition($input, $requestIndex)
  163 + protected function unmarshallTimeDefinition($input, $requestIndex, $ttFileIndex = -1, $ttIntIndex = -1)
139 164 {
140 165 $requestNodes = $this->paramsData->getRequestNodes();
141 166 $timesNode = $requestNodes[$requestIndex]->getTimesNode();
... ... @@ -154,27 +179,18 @@ class WSInputOutputParamsDownloadClass extends IHMInputOutputParamsAbstractClass
154 179 protected function addToJobsFile($data,$resultKey)
155 180 {
156 181 $waitingResult = $data->getWaitingResult($resultKey);
157   -
158   - return $this->jobsManager->addJob(
  182 +
  183 + $result = $this->jobsManager->addJob(
159 184 $this->input,
160 185 $data->getId(),
161 186 $this->getWorkingDirName(),
162 187 $data->getStatus() == ProcessStatusEnumClass::RUNNING,
163 188 $data->getStart(),
164 189 $waitingResult,
165   - $data->getErrorCode());
166   - }
167   -
168   - protected function getDatasetIdFromParamInfo($paramId)
169   - {
170   - $paramInfoFilePath = IHMConfigClass::getLocalParamDBPath().$paramId.".xml";
171   - $dom = new DomDocument("1.0");
172   -
173   - $dom->load($paramInfoFilePath);
174   -
175   - return $dom->getElementsByTagName("dataset_id")->item(0)->nodeValue;
176   -
177   -
  190 + $data->getErrorCode(),
  191 + $data->getExecTime());
  192 +
  193 + return $result;
178 194 }
179 195  
180 196 /*
... ...
src/InputOutput/WSImpl/Params/PlotImpl/WSInputOutputParamsPlotClass.php
... ... @@ -14,6 +14,14 @@ class WSInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
14 14 $this->paramManager = new IHMParamManagerClass();
15 15 $this->jobsManager = new WSJobsManagerClass();
16 16 }
  17 +
  18 + /*
  19 + * @brief Get Task
  20 + */
  21 + protected function getTask($input)
  22 + {
  23 + return WSInputOutputClass::getService();
  24 + }
17 25  
18 26 /*
19 27 * @brief method to unmarshall a plot request
... ... @@ -21,18 +29,14 @@ class WSInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
21 29 protected function unmarshallRequest($input)
22 30 {
23 31 //Request
24   - $requestIndexInParamData = 0;
25   - $tabRequestIndex = 1;
26   -
27 32 $postProcessCmd = "";
28 33  
29 34 $requestNode = $this->paramsData->addRequestNode();
30   - $requestNode->setRealIndex($tabRequestIndex);
31 35 $outputsNode = $requestNode->getOutputsNode();
32 36 $paramsNode = $requestNode->getParamsNode();
33 37  
34 38 //unmarshall time definition
35   - $this->unmarshallTimeDefinition($input, $tabRequestIndex-1, $requestIndexInParamData);
  39 + $this->unmarshallTimeDefinition($input, 0);
36 40  
37 41 $plotOutputNode = $outputsNode->addNewOutput(RequestOutputTypeEnum::PLOT);
38 42 $plotOutputNode->setWriteContextFile("false");
... ... @@ -112,6 +116,8 @@ class WSInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
112 116  
113 117 $this->paramsData->setBatchEnable(true);
114 118 $this->paramsData->setPostCmd($postProcessCmd);
  119 +
  120 + $this->paramsData->setFromWS(true);
115 121  
116 122 return $this->paramsData;
117 123 }
... ... @@ -170,7 +176,8 @@ class WSInputOutputParamsPlotClass extends IHMInputOutputParamsAbstractClass
170 176 $data->getStatus() == ProcessStatusEnumClass::RUNNING,
171 177 $data->getStart(),
172 178 $waitingResult,
173   - $data->getErrorCode());
  179 + $data->getErrorCode(),
  180 + $data->getExecTime());
174 181 }
175 182  
176 183 /*
... ...
src/InputOutput/WSImpl/Tools/WSJobsManagerClass.php
... ... @@ -23,211 +23,25 @@ class WSJobsManagerClass extends IHMJobsManagerClass {
23 23 */
24 24 function __construct()
25 25 {
  26 + $this->isWSJob = TRUE;
26 27 }
27 28  
28   - /*
29   - * @brief Load jobs file and create it if needed
30   - */
31   - protected function init()
32   - {
33   - $this->jobXmlName = WSConfigClass::getWsJobsFile();
34   - $this->jobXml = new DomDocument("1.0");
35   -
36   - if (!file_exists($this->jobXmlName))
37   - {
38   - $res = $this->createJobsFile();
39   - if (!$res['success']) {
40   - error_log("WebServices Error : Cannot create WSjobs.xml", 1, email);
41   - return $res;
42   - }
43   - }
44   -
45   - while (WSConfigClass::isLockedServices())
46   - sleep(1);
47   -
48   - $res = $this->jobXml->load($this->jobXmlName);
49   - if (!$res) {
50   - error_log("WebServices Error : Cannot load WSjobs.xml", 1, email);
51   - return array(
52   - "success" => false,
53   - "message" => "Cannot load jobs file");
54   - }
55   -
56   - return array("success" => true);
57   - }
58   -
59   - /*
60   - * @brief get job info about a job
61   - */
62   - public function getJobInfo($id)
63   - {
64   - $res = $this->init();
65   - if (!$res['success'])
66   - return $res;
67   -
68   - $job = $this->jobXml->getElementById($id);
69   - $format = 'unknown';
70   - $compression = 'unknown';
71   - if($job)
72   - {
73   - // $name = $job->getAttribute('name');
74   - $status = $job->getAttribute('status');
75   - $jobType = $job->getAttribute('jobType');
76   - // $info = $job->getAttribute('info');
77   - $start = $job->getAttribute('start');
78   - $stop = $job->getAttribute('stop');
79   - $result = $job->getAttribute('result');
80   - $folder = $job->getAttribute('folder');
81   - $request_obj = $this->getRequestObjectFile($id);
82   - if (isset($request_obj))
83   - {
84   - if (isset($request_obj->fileformat))
85   - {
86   - $format = strtolower($request_obj->format);
87   - if (($format == "pdf") || ($format == "ps"))
88   - //auto compression for plot request
89   - $compression = ".tar.gz";
90   -
91   - // if ($format == "ascii") $format = 'txt';
92   - }
93   - if (isset($request_obj->compression))
94   - $compression = strtolower($request_obj->compression);
95   - }
96   - }
97   - return array(
98   - 'success' => true,
99   - 'id' => $id,
100   - // 'name' => $name,
101   - 'status' => $status,
102   - 'jobType' => $jobType,
103   - // 'info' => $info,
104   - 'start' => $start,
105   - 'stop' => $stop,
106   - 'folder' => $folder,
107   - 'result' => $result,
108   - 'format' => $format,
109   - 'compression' => $compression
110   - );
111   - }
112   -
113   - public function lockService(){
114   - if (!WSConfigClass::isLockedServices())
115   - WSConfigClass::lockServices();
116   - }
117   -
118   - public function unlockService(){
119   - if (WSConfigClass::isLockedServices())
120   - WSConfigClass::unlockServices();
121   - }
122   - /*
123   - * @brief Add a new job
124   - */
125   - public function addJob($obj, $id, $folder,
126   - $running, $start, $result, $exitcode)
127   - {
128   - $res = $this->init();
129   -
130   - if (!$res['success'])
131   - return $res;
132   -
133   - $this->lockService();
134   -
135   - $key = WSInputOutputClass::getService();
136   -
137   - $newJob = $this->jobXml->createElement('job');
138   -
139   - $newJob->setAttribute('xml:id', $id);
140   - $newJob->setAttribute('jobType', $key);
141   -
142   - $newJob->setAttribute('result', $result);
143   - $newJob->setAttribute('folder', $folder);
144   - $newJob->setAttribute('start', date('d-m-Y H:i:s', $start));
145   - $newJob->setAttribute('user', IHMConfigClass::getUserName());
146   - $newJob->setAttribute('host', IHMConfigClass::getUserHost());
  29 + protected function getJobsFilePath()
  30 + {
  31 + return WSConfigClass::getWsJobsFile();
  32 + }
147 33  
148   - if ($running)
149   - {
150   - $rootJobNode = $this->jobXml->getElementById($this->bkgRootNode[$key]);
151   - if (!$rootJobNode)
152   - {
153   - $rootJobNode = $this->jobXml->createElement("$key");
154   - $rootJobNode->setAttribute('xml:id', $this->bkgRootNode[$key]);
155   - $jobsInProgress = $this->jobXml->getElementsByTagName('jobsInProgress')->item(0);
156   - $jobsInProgress->appendChild($rootJobNode);
157   - }
158   - }
159   - else
160   - {
161   - $rootJobNode = $this->jobXml->getElementById($this->resRootNode[$key]);
162   - if (!$rootJobNode)
163   - {
164   - $rootJobNode = $this->jobXml->createElement("$key");
165   - $rootJobNode->setAttribute('xml:id', $this->resRootNode[$key]);
166   - $jobsFinished = $this->jobXml->getElementsByTagName('jobsFinished')->item(0);
167   - $jobsFinished->appendChild($rootJobNode);
168   - }
169   - }
170   -
171   - $rootJobNode->appendChild($newJob);
172   -
173   - if (!$this->jobXml->save($this->jobXmlName)) {
174   - $this->unlockService();
175   - return array("success" => false, "message" => "Cannot save job manager file");
176   - }
177   - $this->unlockService();
178   - $this->saveRequestObjectFile($obj, $id);
179   -
180   - $res = $this->updateJobStatus($id, $running, $exitcode);
181   -
182   - return $res;
183   -
  34 + protected function sendErrorNotification($message) {
  35 + error_log("WebServices Error : ".$message);
  36 + error_log("WebServices Error : ".$message, email);
184 37 }
185 38  
186   -
187 39 /*
188   - * @brief delete a job
189   - */
190   - public function deleteJob($id)
  40 + * @brief Get job key
  41 + */
  42 + protected function getJobKey($obj)
191 43 {
192   - $res = $this->init();
193   - if (!$res['success'])
194   - return $res;
195   -
196   - $job = $this->jobXml->getElementById($id);
197   -
198   - //delete job
199   - if (!$job)
200   - return array('success' => false, 'message' => "Job not reachable");
201   -
202   - $folder = $job->getAttribute('folder');
203   -
204   - //be sure that it's an AMDA working dir before deletion...
205   - $fullFolderPath = IHMConfigClass::getRequestPath().$folder.'/';
206   -
207   - if ((isset($folder)) &&
208   - ($folder != "") &&
209   - is_dir($fullFolderPath) &&
210   - (preg_match("/DD[0-9A-Za-z]*_/",$folder) ||
211   - preg_match("/Plot[0-9]*_/",$folder)))
212   - {
213   - foreach (glob($fullFolderPath.'*') as $filename)
214   - {
215   - if (is_dir($filename) && (basename($filename) == 'params'))
216   - {
217   - //recursive deletion only for "params" dir (a full recursive deletion is probably too dangerous...)
218   - foreach (glob($filename.'/*') as $paramname)
219   - unlink($paramname);
220   - rmdir($filename);
221   - }
222   - else
223   - unlink($filename);
224   - }
225   - rmdir($fullFolderPath);
226   - }
227   -
228   - $this->deleteRequestObjectFile($id);
229   -
230   - return array('success' => true, 'id' => $id);
  44 + return WSInputOutputClass::getService();
231 45 }
232 46  
233 47 public function getResultFromProcessId($id)
... ...
src/Request/Config/KernelConfigClass.php
... ... @@ -223,6 +223,8 @@ class KernelConfigClass
223 223 $appProperties["app.process.DYNAMIC_LOADING"] = "false";
224 224 $appProperties["app.process.plugins.xml"] = KERNEL_CONFIG_DIR.'/plugins.xml';
225 225  
  226 + $appProperties["app.process.plugins.xsd"] = AMDA_KERNEL_DIR.'/config/xsd/parser/plugins.xsd';
  227 +
226 228 $appProperties["app.plot.configfile"] = KERNEL_CONFIG_DIR.'/'.self::$plotConfigFile;
227 229  
228 230 $appProperties["app.param.gapthreshold"] = self::$defaultGapThreshold;
... ...
src/Request/ParamsRequestImpl/Nodes/Requests/RequestNodeClass.php
... ... @@ -82,8 +82,6 @@ define (&quot;REQUEST_NAME&quot;, &quot;request&quot;);
82 82 */
83 83 class RequestNodeClass extends NodeClass
84 84 {
85   - private $realIndex = 0;
86   -
87 85 public function __construct()
88 86 {
89 87 parent::__construct(REQUEST_NAME);
... ... @@ -108,16 +106,6 @@ class RequestNodeClass extends NodeClass
108 106 return $this->getFirstChildByName(REQUESTOUTPUTS_NAME);
109 107 }
110 108  
111   - public function setRealIndex($index)
112   - {
113   - $this->realIndex = $index;
114   - }
115   -
116   - public function getRealIndex()
117   - {
118   - return $this->realIndex;
119   - }
120   -
121 109 public function loadFromNode($xmlNode)
122 110 {
123 111 $paramsXmlNode = $this->getXmlNodeChildByTagName($xmlNode, REQUESTPARAMS_NAME);
... ... @@ -135,4 +123,4 @@ class RequestNodeClass extends NodeClass
135 123 }
136 124 }
137 125  
138   -?>
139 126 \ No newline at end of file
  127 +?>
... ...
src/Request/ParamsRequestImpl/ParamsRequestClass.php
... ... @@ -27,7 +27,7 @@ class ParamsRequestClass extends ProcessRequestClass
27 27 {
28 28 if ($cmd != "")
29 29 $cmd .= " && ";
30   - $cmd .= KernelConfigClass::getKernelBinPath()."amdaXMLRequestorTool ".$this->getRequestFilePath($requestNode->getRealIndex());
  30 + $cmd .= KernelConfigClass::getKernelBinPath()."amdaXMLRequestorTool ".$this->getRequestFilePath();
31 31 }
32 32 $this->requestData->setCmd($cmd);
33 33 break;
... ... @@ -72,15 +72,15 @@ class ParamsRequestClass extends ProcessRequestClass
72 72  
73 73 if (!$xmlNode = $requestNode->toXMLNode($doc))
74 74 {
75   - $this->requestData->setLastErrorMessage('Cannot create params request XML file for request '.$requestNode->getRealIndex());
  75 + $this->requestData->setLastErrorMessage('Cannot create params request XML file for request');
76 76 return false;
77 77 }
78 78  
79 79 $doc->appendChild($xmlNode);
80 80  
81   - if (!$doc->save($this->getRequestFilePath($requestNode->getRealIndex())))
  81 + if (!$doc->save($this->getRequestFilePath()))
82 82 {
83   - $this->requestData->setLastErrorMessage('Cannot save params request XML file for request '.$requestNode->getRealIndex());
  83 + $this->requestData->setLastErrorMessage('Cannot save params request XML file for request');
84 84 return false;
85 85 }
86 86  
... ... @@ -96,7 +96,7 @@ class ParamsRequestClass extends ProcessRequestClass
96 96 //}
97 97 //libxml_clear_errors();
98 98  
99   - $this->requestData->setLastErrorMessage('Params request XML file not valid for request '.$requestNode->getRealIndex()/*.' ('.$error_msg.')'*/);
  99 + $this->requestData->setLastErrorMessage('Params request XML file not valid for request'/*.' ('.$error_msg.')'*/);
100 100 return false;
101 101 }
102 102 //libxml_use_internal_errors(false);
... ... @@ -243,9 +243,9 @@ class ParamsRequestClass extends ProcessRequestClass
243 243 /*
244 244 * @brief Get the request file path for AMDA_Kernel
245 245 */
246   - private function getRequestFilePath($requestIndex)
  246 + private function getRequestFilePath()
247 247 {
248   - return $this->requestData->getWorkingPath()."request_".$requestIndex.".xml";
  248 + return $this->requestData->getWorkingPath()."request_".$this->requestData->getRequestIndex().".xml";
249 249 }
250 250 }
251 251 ?>
... ...
src/Request/ParamsRequestImpl/ParamsRequestDataClass.php
... ... @@ -32,6 +32,7 @@ class ParamsRequestDataClass extends ProcessRequestDataClass
32 32 private $paramId = "";
33 33 private $datasetId = array();
34 34 private $task = "";
  35 + private $requestIndex = 0;
35 36  
36 37 function __construct()
37 38 {
... ... @@ -77,6 +78,16 @@ class ParamsRequestDataClass extends ProcessRequestDataClass
77 78 {
78 79 $this->task = $task;
79 80 }
  81 +
  82 + public function getRequestIndex()
  83 + {
  84 + return $this->requestIndex;
  85 + }
  86 +
  87 + public function setRequestIndex($requestIndex)
  88 + {
  89 + $this->requestIndex = $requestIndex;
  90 + }
80 91  
81 92 public function addRequestNode()
82 93 {
... ...
src/Request/ProcessRequestImpl/Process/ProcessClass.php
... ... @@ -19,16 +19,18 @@ class ProcessClass
19 19 private $pID;
20 20 private $runningPath;
21 21 private $runningStart;
  22 + private $fromWS;
22 23  
23 24 /*
24 25 * @brief Constructor
25 26 */
26   - function __construct($command, $postProcessCmd = "", $getErrorMsgCmd = "")
  27 + function __construct($command, $postProcessCmd = "", $getErrorMsgCmd = "", $fromWS = FALSE)
27 28 {
28 29 $this->command = $command;
29 30 $this->postProcessCmd = $postProcessCmd;
30 31 $this->getErrorMsgCmd = $getErrorMsgCmd;
31 32 $this->pID = 0;
  33 + $this->fromWS = $fromWS;
32 34 }
33 35  
34 36 /*
... ... @@ -187,6 +189,14 @@ class ProcessClass
187 189 }
188 190  
189 191 /*
  192 + * @brief To know if a process is running from WebService
  193 + */
  194 + public function getFromWS()
  195 + {
  196 + return $this->fromWS;
  197 + }
  198 +
  199 + /*
190 200 * @brief Run the process
191 201 */
192 202 public function run($runningPath, $envArray)
... ...
src/Request/ProcessRequestImpl/Process/ProcessManagerClass.php
... ... @@ -19,9 +19,9 @@ class ProcessManagerClass
19 19 /*
20 20 * @brief Run a process
21 21 */
22   - public function runProcess($cmd, $runningPath, $envArray, $postProcessCmd, $getErrorMsgCmd, $batchEnabled)
  22 + public function runProcess($cmd, $runningPath, $envArray, $postProcessCmd, $getErrorMsgCmd, $batchEnabled, $fromWS = FALSE)
23 23 {
24   - $process = new ProcessClass($cmd, $postProcessCmd, $getErrorMsgCmd);
  24 + $process = new ProcessClass($cmd, $postProcessCmd, $getErrorMsgCmd, $fromWS);
25 25  
26 26 if (!$process->run($runningPath, $envArray))
27 27 return array("success" => false, "message" => "Cannot run the process");
... ... @@ -168,6 +168,7 @@ class ProcessManagerClass
168 168 $this->updateProcessStatusToNode($dom,$processNode,"runningstart",$process->getRunningStart());
169 169 $this->updateProcessStatusToNode($dom,$processNode,"isrunning",$process->isRunning() ? "true" : "false");
170 170 $this->updateProcessStatusToNode($dom,$processNode,"lastupdate",time());
  171 + $this->updateProcessStatusToNode($dom,$processNode,"fromws", $process->getFromWS() ? "true" : "false");
171 172 }
172 173  
173 174 /*
... ... @@ -191,7 +192,8 @@ class ProcessManagerClass
191 192 "runningstart" => $this->getNodeValueFromNode($processNode, "runningstart"),
192 193 "isrunning" => ($this->getNodeValueFromNode($processNode, "isrunning") == "true"),
193 194 "iskilled" => ($this->getNodeValueFromNode($processNode, "iskilled") == "true"),
194   - "lastupdate" => $this->getNodeValueFromNode($processNode, "lastupdate")
  195 + "lastupdate" => $this->getNodeValueFromNode($processNode, "lastupdate"),
  196 + "fromws" => ($this->getNodeValueFromNode($processNode, "fromws") == "true"),
195 197 );
196 198 }
197 199  
... ...
src/Request/ProcessRequestImpl/ProcessRequestClass.php
... ... @@ -96,7 +96,7 @@ class ProcessRequestClass extends RequestAbstractClass
96 96 $this->requestData->setErrorMsg($processInfo['errormsg']);
97 97 }
98 98 $this->requestData->setExecTime($processInfo['exectime']);
99   - $processMgr->deleteProcess($processInfo['id'], $result['success']);
  99 + $processMgr->deleteProcess($processInfo['id']);
100 100 }
101 101  
102 102 $this->requestData->setStart($processInfo['runningstart']);
... ... @@ -127,7 +127,8 @@ class ProcessRequestClass extends RequestAbstractClass
127 127 $this->requestData->getEnvVars(),
128 128 $this->requestData->getPostCmd(),
129 129 $this->requestData->getGetErrorMsgCmd(),
130   - $this->requestData->getBatchEnable());
  130 + $this->requestData->getBatchEnable(),
  131 + $this->requestData->getFromWS());
131 132 if ($result['success']) {
132 133 $return_code = TRUE;
133 134 $this->updateProcess($result['result'], $processMgr);
... ...
src/Request/ProcessRequestImpl/ProcessRequestDataClass.php
... ... @@ -49,7 +49,8 @@ class ProcessRequestDataClass extends RequestDataClass
49 49 private $errorMsg = "";
50 50 private $execTime = 0;
51 51 private $start = 0;
52   - private $runningPath = "";
  52 + private $runningPath = "";
  53 + private $fromWS = false;
53 54  
54 55 public function getManagerFilePath()
55 56 {
... ... @@ -200,6 +201,16 @@ class ProcessRequestDataClass extends RequestDataClass
200 201 {
201 202 $this->execTime = $execTime;
202 203 }
  204 +
  205 + public function getFromWS()
  206 + {
  207 + return $this->fromWS;
  208 + }
  209 +
  210 + public function setFromWS($fromWS)
  211 + {
  212 + $this->fromWS = $fromWS;
  213 + }
203 214 }
204 215  
205 216 ?>
... ...
src/Request/UserRequestClass.php 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +<?php
  2 +/**
  3 + * @class UserRequestClass
  4 + * @brief Implementation of a RequestAbstractClass for a user request
  5 + * @details
  6 + */
  7 +class UserRequestClass extends RequestAbstractClass
  8 +{
  9 + /*
  10 + * @brief Init a user request
  11 + */
  12 + public function init()
  13 + {
  14 + //For the moment, nothing to do
  15 + return TRUE;
  16 + }
  17 +
  18 + /*
  19 + * @brief Run a user request
  20 + */
  21 + public function run()
  22 + {
  23 + //For the moment, nothing to do
  24 + return TRUE;
  25 + }
  26 +}
  27 +?>
... ...
src/RequestManagerClass.php
... ... @@ -82,6 +82,8 @@ Class RequestManagerClass
82 82 return new TTRequestClass($user, $userHost);
83 83 case FunctionTypeEnumClass::PARAMINFO :
84 84 return new ParamInfoRequestClass($user, $userHost);
  85 + case FunctionTypeEnumClass::USERWSINIT :
  86 + return new UserRequestClass($user, $userHost);
85 87 default :
86 88 throw new Exception('Request '.$function.' not implemented.');
87 89 }
... ...