ILIAS  trunk Revision v11.0_alpha-1713-gd8962da2f67
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
ilFileXMLParser Class Reference
+ Inheritance diagram for ilFileXMLParser:
+ Collaboration diagram for ilFileXMLParser:

Public Member Functions

 __construct (public ilObjFile $file, string $a_xml_data, public int $obj_id=-1, public int $mode=0)
 Constructor. More...
 
 setImportDirectory (?string $a_val)
 Set import directory. More...
 
 getImportDirectory ()
 Get import directory. More...
 
 setHandlers ($a_xml_parser)
 set event handlers More...
 
 handlerBeginTag ($a_xml_parser, string $a_name, array $a_attribs)
 handler for begin of element More...
 
 handlerEndTag ($a_xml_parser, string $a_name)
 handler for end of element More...
 
 handlerCharacterData ($a_xml_parser, string $a_data)
 handler for character data More...
 
 setFileContents ()
 update file according to filename and version, does not update history has to be called after (!) file save for new objects, since file storage will be initialised with obj id. More...
 
 updateFileContents ()
 update file according to filename and version and create history entry has to be called after (!) file save for new objects, since file storage will be initialised with obj id. More...
 
 start ()
 starts parsing an changes object by side effect. More...
 
- Public Member Functions inherited from ilSaxParser
 __construct (?string $path_to_file='', ?bool $throw_exception=false)
 
 setXMLContent (string $a_xml_content)
 
 getXMLContent ()
 
 getInputType ()
 
 startParsing ()
 stores xml data in array More...
 
 createParser ()
 
 setHandlers ($a_xml_parser)
 
 parse ($a_xml_parser, $a_fp=null)
 

Static Public Member Functions

static normalizeRelativePath (string $path)
 Normalize relative directories in a path. More...
 

Data Fields

bool $result = false
 result of parsing and updating More...
 
string $tmpFilename = null
 file of temporary file where we store the file content instead of in memory More...
 
- Data Fields inherited from ilSaxParser
string $xml_file
 
bool $throw_exception = false
 

Static Public Attributes

static int $CONTENT_NOT_COMPRESSED = 0
 
static int $CONTENT_GZ_COMPRESSED = 1
 
static int $CONTENT_ZLIB_COMPRESSED = 2
 
static int $CONTENT_COPY = 4
 
static int $CONTENT_REST = 5
 

Protected Attributes

int $version = null
 
string $action = null
 
int $max_version = null
 
int $date = null
 
int $usr_id = null
 
array $versions = []
 
string $import_directory = null
 
string $cdata = null
 
- Protected Attributes inherited from ilSaxParser
ilLanguage $lng = null
 

Private Member Functions

 fastBase64Decode (string $filein, string $fileout)
 
 fastGunzip (string $in, string $out)
 

Additional Inherited Members

- Protected Member Functions inherited from ilSaxParser
 openXMLFile ()
 
 handleError (string $message)
 
 setThrowException (bool $throw_exception)
 

Detailed Description

Definition at line 32 of file class.ilFileXMLParser.php.

Constructor & Destructor Documentation

◆ __construct()

ilFileXMLParser::__construct ( public ilObjFile  $file,
string  $a_xml_data,
public int  $obj_id = -1,
public int  $mode = 0 
)

Constructor.

Parameters
$fileExercise object which has been parsed
$obj_idthis will be matched against the id in the xml in case we want to update an exercise
$modeContent compression mode, defaults to no compression

Definition at line 61 of file class.ilFileXMLParser.php.

References ILIAS\GlobalScreen\Provider\__construct(), and ilSaxParser\setXMLContent().

76  {
78  $this->setXMLContent($a_xml_data);
79  }
__construct(Container $dic, ilPlugin $plugin)
setXMLContent(string $a_xml_content)
+ Here is the call graph for this function:

Member Function Documentation

◆ fastBase64Decode()

ilFileXMLParser::fastBase64Decode ( string  $filein,
string  $fileout 
)
private

Definition at line 430 of file class.ilFileXMLParser.php.

Referenced by handlerEndTag().

430  : bool
431  {
432  $fh = fopen($filein, 'rb');
433  $fh2 = fopen($fileout, 'wb');
434  stream_filter_append($fh2, 'convert.base64-decode');
435 
436  while (!feof($fh)) {
437  $chunk = fgets($fh);
438  if ($chunk === false) {
439  break;
440  }
441  fwrite($fh2, $chunk);
442  }
443  fclose($fh);
444  fclose($fh2);
445 
446  return true;
447  }
+ Here is the caller graph for this function:

◆ fastGunzip()

ilFileXMLParser::fastGunzip ( string  $in,
string  $out 
)
private

Definition at line 449 of file class.ilFileXMLParser.php.

Referenced by handlerEndTag().

449  : bool
450  {
451  if (!file_exists($in)) {
452  return false;
453  }
454  if (!is_readable($in)) {
455  return false;
456  }
457  if (!file_exists($out) && !is_writable(dirname($out))) {
458  return false;
459  }
460  if (file_exists($out) && !is_writable($out)) {
461  return false;
462  }
463  $in_file = gzopen($in, "rb");
464  $out_file = fopen($out, "wb");
465 
466  while (!gzeof($in_file)) {
467  $buffer = gzread($in_file, 4096);
468  fwrite($out_file, $buffer, 4096);
469  }
470 
471  gzclose($in_file);
472  fclose($out_file);
473 
474  return true;
475  }
$out
Definition: buildRTE.php:24
+ Here is the caller graph for this function:

◆ getImportDirectory()

ilFileXMLParser::getImportDirectory ( )

Get import directory.

Returns
mixed|null import directory

Definition at line 96 of file class.ilFileXMLParser.php.

References $import_directory.

Referenced by handlerEndTag().

96  : ?string
97  {
99  }
+ Here is the caller graph for this function:

◆ handlerBeginTag()

ilFileXMLParser::handlerBeginTag (   $a_xml_parser,
string  $a_name,
array  $a_attribs 
)

handler for begin of element

Parameters
resource$a_xml_parserxml parser
string$a_nameelement name
array$a_attribselement attributes array
Exceptions
ilFileExceptionwhen obj id != - 1 and if it it does not match the id in the xml or deflation mode is not supported

Definition at line 124 of file class.ilFileXMLParser.php.

References $CONTENT_COPY, $CONTENT_GZ_COMPRESSED, $CONTENT_NOT_COMPRESSED, $CONTENT_REST, $CONTENT_ZLIB_COMPRESSED, $date, $DIC, ilFileException\$ID_DEFLATE_METHOD_MISMATCH, ilFileException\$ID_MISMATCH, $usr_id, ilUtil\__extractId(), IL_INST_ID, ILIAS\Repository\int(), and null.

Referenced by setHandlers().

124  : void
125  {
126  global $DIC;
127 
128  global $DIC;
129 
130  switch ($a_name) {
131  case 'File':
132  if (isset($a_attribs["obj_id"])) {
133  $read_obj_id = ilUtil::__extractId($a_attribs["obj_id"], IL_INST_ID);
134  if ($this->obj_id != -1 && (int) $read_obj_id != -1 && $this->obj_id !== (int) $read_obj_id) {
135  throw new ilFileException(
136  "Object IDs (xml $read_obj_id and argument " . $this->obj_id . ") do not match!",
138  );
139  }
140  }
141 
142  break;
143  case 'Content': // Old import files
144  case 'Version':
145  if ($a_name === "Version" && !isset($a_attribs["mode"])) {
146  // Old import files
147  $this->version = null;
148  if ($this->date === null) {
149  // Version tag comes after Content tag. Take only first (= Should be latest)
150  $this->date = $a_attribs["date"];
151  $this->usr_id = (int) $a_attribs["usr_id"];
152  $this->versions[0]["date"] = $this->date;
153  $this->versions[0]["usr_id"] = $this->usr_id;
154  }
155  break;
156  }
157 
159  #echo $a_attribs["mode"];
160  if (isset($a_attribs["mode"])) {
161  if ($a_attribs["mode"] == "GZIP") {
162  if (!function_exists("gzread")) {
163  throw new ilFileException(
164  "Deflating with gzip is not supported",
166  );
167  }
168 
170  } elseif ($a_attribs["mode"] == "ZLIB") {
171  if (!function_exists("gzuncompress")) {
172  throw new ilFileException(
173  "Deflating with zlib (compress/uncompress) is not supported",
175  );
176  }
177 
179  } elseif ($a_attribs["mode"] == "COPY") {
180  $this->mode = ilFileXMLParser::$CONTENT_COPY;
181  } // begin-patch fm
182  elseif ($a_attribs['mode'] == 'REST') {
183  $this->mode = ilFileXMLParser::$CONTENT_REST;
184  }
185  // end-patch fm
186  }
187 
188  if ($a_name === "Version") {
189  $this->version = (int) $a_attribs["version"];
190  $this->max_version = (int) $a_attribs["max_version"];
191  $this->date = (int) $a_attribs["date"];
192  $this->usr_id = (int) $a_attribs["usr_id"];
193  $this->action = (string) $a_attribs["action"];
194  }
195  }
196  }
const IL_INST_ID
Definition: constants.php:40
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static int $CONTENT_GZ_COMPRESSED
global $DIC
Definition: shib_login.php:22
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static int $CONTENT_NOT_COMPRESSED
static int $CONTENT_ZLIB_COMPRESSED
static int $ID_DEFLATE_METHOD_MISMATCH
static __extractId(string $ilias_id, int $inst_id)
extract ref id from role title, e.g.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ handlerCharacterData()

ilFileXMLParser::handlerCharacterData (   $a_xml_parser,
string  $a_data 
)

handler for character data

Parameters
resource$a_xml_parserxml parser
string$a_datacharacter data

Definition at line 314 of file class.ilFileXMLParser.php.

References $CONTENT_COPY, and $CONTENT_REST.

Referenced by setHandlers().

314  : void
315  {
316  if ($a_data !== "\n") {
317  // begin-patch fm
318  if ($this->mode !== ilFileXMLParser::$CONTENT_COPY
319  && $this->mode !== ilFileXMLParser::$CONTENT_REST
320  ) { // begin-patch fm
321  $this->cdata .= $a_data;
322  } else {
323  $this->cdata .= $a_data;
324  }
325  }
326  }
+ Here is the caller graph for this function:

◆ handlerEndTag()

ilFileXMLParser::handlerEndTag (   $a_xml_parser,
string  $a_name 
)

handler for end of element

Parameters
resource$a_xml_parserxml parser
string$a_nameelement name

Definition at line 204 of file class.ilFileXMLParser.php.

References $action, $CONTENT_COPY, $CONTENT_GZ_COMPRESSED, $CONTENT_REST, $CONTENT_ZLIB_COMPRESSED, $date, ilFileException\$DECOMPRESSION_FAILED, $DIC, $GLOBALS, $max_version, $tmpFilename, $usr_id, $version, fastBase64Decode(), fastGunzip(), getImportDirectory(), ilFileUtils\ilTempnam(), and null.

Referenced by setHandlers().

204  : void
205  {
206  $this->cdata = trim($this->cdata ?? '');
207 
208  $GLOBALS['DIC']['ilLog']->write(__METHOD__ . ': ' . $this->cdata);
209 
210  switch ($a_name) {
211  case 'File':
212  $this->result = true;
213  break;
214  case 'Filename':
215  if ($this->cdata === '') {
216  throw new ilFileException("Filename ist missing!");
217  }
218 
219  $this->file->setFilename($this->cdata);
220  $this->file->setTitle($this->cdata);
221 
222  break;
223  case 'Title':
224  $this->file->setTitle(trim($this->cdata));
225  break;
226  case 'Description':
227  $this->file->setDescription(trim($this->cdata));
228  break;
229  case 'Rating':
230  $this->file->setRating((bool) $this->cdata);
231  break;
232  case 'Content': // Old import files
233  case 'Version':
234  if ($a_name === "Version" && $this->version === null) {
235  // Old import files
236  break;
237  }
238 
239  $baseDecodedFilename = ilFileUtils::ilTempnam();
240  if ($this->mode === ilFileXMLParser::$CONTENT_COPY) {
241  $this->tmpFilename = $this->getImportDirectory() . "/" . self::normalizeRelativePath($this->cdata);
242  } // begin-patch fm
243  elseif ($this->mode === ilFileXMLParser::$CONTENT_REST) {
244  $storage = new ilRestFileStorage();
245  $this->tmpFilename = $storage->getStoredFilePath(self::normalizeRelativePath($this->cdata));
246  if (!$this->fastBase64Decode($this->tmpFilename, $baseDecodedFilename)) {
247  throw new ilFileException("Base64-Decoding failed", ilFileException::$DECOMPRESSION_FAILED);
248  }
249  $this->tmpFilename = $baseDecodedFilename;
250  } // end-patch fm
251  else {
252  if (!$this->fastBase64Decode($this->tmpFilename, $baseDecodedFilename)) {
253  throw new ilFileException("Base64-Decoding failed", ilFileException::$DECOMPRESSION_FAILED);
254  }
255  if ($this->mode === ilFileXMLParser::$CONTENT_GZ_COMPRESSED) {
256  if (!$this->fastGunzip($baseDecodedFilename, $this->tmpFilename)) {
257  throw new ilFileException(
258  "Deflating with fastzunzip failed",
260  );
261  }
262  unlink($baseDecodedFilename);
263  } elseif ($this->mode === ilFileXMLParser::$CONTENT_ZLIB_COMPRESSED) {
264  if (!$this->fastGunzip($baseDecodedFilename, $this->tmpFilename)) {
265  throw new ilFileException(
266  "Deflating with fastDecompress failed",
268  );
269  }
270  unlink($baseDecodedFilename);
271  } else {
272  $this->tmpFilename = $baseDecodedFilename;
273  }
274  }
275 
276  //$this->content = $content;
277  // see #17211
278 
279  if ($this->version == $this->file->getVersion()) {
280  if (is_file($this->tmpFilename)) {
281  $this->file->setFileSize(filesize($this->tmpFilename)); // strlen($this->content));
282  }
283 
284  // if no file type is given => lookup mime type
285  if ($this->file->getFileType() === '' || $this->file->getFileType() === '0') {
286  global $DIC;
287  $this->file->setFileType(MimeType::getMimeType($this->tmpFilename));
288  }
289  }
290 
291  $this->versions[] = [
292  "version" => $this->version,
293  "max_version" => $this->max_version,
294  "tmpFilename" => $this->tmpFilename,
295  "date" => $this->date,
296  "usr_id" => $this->usr_id,
297  "action" => $this->action,
298  ];
299  $this->version = null;
300  $this->date = null;
301  $this->usr_id = null;
302  break;
303  }
304 
305  $this->cdata = '';
306  }
fastGunzip(string $in, string $out)
fastBase64Decode(string $filein, string $fileout)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static int $DECOMPRESSION_FAILED
string $tmpFilename
file of temporary file where we store the file content instead of in memory
$GLOBALS["DIC"]
Definition: wac.php:53
static int $CONTENT_GZ_COMPRESSED
global $DIC
Definition: shib_login.php:22
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static int $CONTENT_ZLIB_COMPRESSED
static ilTempnam(?string $a_temp_path=null)
Returns a unique and non existing Path for e temporary file or directory.
File storage handling.
getImportDirectory()
Get import directory.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ normalizeRelativePath()

static ilFileXMLParser::normalizeRelativePath ( string  $path)
static

Normalize relative directories in a path.

Source: https://github.com/thephpleague/flysystem/blob/master/src/Util.php#L96 Workaround until we have

Exceptions
LogicException

Definition at line 404 of file class.ilFileXMLParser.php.

References $parts.

404  : string
405  {
406  $path = str_replace('\\', '/', $path);
407 
408  while (preg_match('#\p{C}+|^\./#u', (string) $path)) {
409  $path = preg_replace('#\p{C}+|^\./#u', '', (string) $path);
410  }
411 
412  $parts = [];
413  foreach (explode('/', (string) $path) as $part) {
414  switch ($part) {
415  case '':
416  case '.':
417  break;
418  case '..':
419  array_pop($parts);
420  break;
421  default:
422  $parts[] = $part;
423  break;
424  }
425  }
426 
427  return implode('/', $parts);
428  }
if($clientAssertionType !='urn:ietf:params:oauth:client-assertion-type:jwt-bearer'|| $grantType !='client_credentials') $parts
Definition: ltitoken.php:61
$path
Definition: ltiservices.php:29

◆ setFileContents()

ilFileXMLParser::setFileContents ( )

update file according to filename and version, does not update history has to be called after (!) file save for new objects, since file storage will be initialised with obj id.

Definition at line 333 of file class.ilFileXMLParser.php.

References ilHistory\_removeEntriesForObject(), and ilLoggerFactory\getLogger().

333  : void
334  {
335  // Delete exists version 1 history
336  ilHistory::_removeEntriesForObject($this->file->getId());
337 
338  foreach ($this->versions as $version) {
339  if (!file_exists($version["tmpFilename"])) {
340  if (!isset($version["tmpFilename"])) {
341  continue;
342  }
343  // try to get first file of directory
344  $files = scandir(dirname((string) $version["tmpFilename"]));
345  $version["tmpFilename"] = rtrim(
346  dirname((string) $version["tmpFilename"]),
347  "/"
348  ) . "/" . $files[2];// because [0] = "." [1] = ".."
349  if (!file_exists($version["tmpFilename"])) {
350  ilLoggerFactory::getLogger('file')->error(
351  __METHOD__ . ' "' . ($version["tmpFilename"]) . '" file not found.'
352  );
353 
354  continue;
355  }
356  }
357 
358  if (filesize($version["tmpFilename"]) == 0) {
359  continue;
360  }
361 
362  // imported file version
363  $import_file_version_path = $version["tmpFilename"];
364 
365  $stream = Streams::ofResource(fopen($import_file_version_path, 'rb'));
366  $this->file->appendStream($stream, $this->file->getTitle());
367  }
368  }
static getLogger(string $a_component_id)
Get component logger.
static _removeEntriesForObject(int $a_obj_id)
remove all history entries for an object
+ Here is the call graph for this function:

◆ setHandlers()

ilFileXMLParser::setHandlers (   $a_xml_parser)

set event handlers

Parameters
resourcereference to the xml parser

private

Definition at line 108 of file class.ilFileXMLParser.php.

References handlerBeginTag(), handlerCharacterData(), and handlerEndTag().

108  : void
109  {
110  xml_set_element_handler($a_xml_parser, $this->handlerBeginTag(...), $this->handlerEndTag(...));
111  xml_set_character_data_handler($a_xml_parser, $this->handlerCharacterData(...));
112  }
handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs)
handler for begin of element
handlerEndTag($a_xml_parser, string $a_name)
handler for end of element
handlerCharacterData($a_xml_parser, string $a_data)
handler for character data
+ Here is the call graph for this function:

◆ setImportDirectory()

ilFileXMLParser::setImportDirectory ( ?string  $a_val)

Set import directory.

Parameters
stringimport directory

Definition at line 86 of file class.ilFileXMLParser.php.

86  : void
87  {
88  $this->import_directory = $a_val;
89  }

◆ start()

ilFileXMLParser::start ( )

starts parsing an changes object by side effect.

Returns
boolean true, if no errors happend.
Exceptions
ilFileExceptionwhen obj id != - 1 and if it it does not match the id in the xml

Definition at line 387 of file class.ilFileXMLParser.php.

References ilSaxParser\startParsing().

387  : bool
388  {
389  $this->startParsing();
390 
391  return $this->result > 0;
392  }
startParsing()
stores xml data in array
+ Here is the call graph for this function:

◆ updateFileContents()

ilFileXMLParser::updateFileContents ( )

update file according to filename and version and create history entry has to be called after (!) file save for new objects, since file storage will be initialised with obj id.

Definition at line 375 of file class.ilFileXMLParser.php.

375  : void
376  {
377  // removed
378  }

Field Documentation

◆ $action

string ilFileXMLParser::$action = null
protected

Definition at line 50 of file class.ilFileXMLParser.php.

Referenced by handlerEndTag().

◆ $cdata

string ilFileXMLParser::$cdata = null
protected

Definition at line 56 of file class.ilFileXMLParser.php.

◆ $CONTENT_COPY

int ilFileXMLParser::$CONTENT_COPY = 4
static

Definition at line 37 of file class.ilFileXMLParser.php.

Referenced by handlerBeginTag(), handlerCharacterData(), and handlerEndTag().

◆ $CONTENT_GZ_COMPRESSED

int ilFileXMLParser::$CONTENT_GZ_COMPRESSED = 1
static

Definition at line 35 of file class.ilFileXMLParser.php.

Referenced by handlerBeginTag(), and handlerEndTag().

◆ $CONTENT_NOT_COMPRESSED

int ilFileXMLParser::$CONTENT_NOT_COMPRESSED = 0
static

Definition at line 34 of file class.ilFileXMLParser.php.

Referenced by handlerBeginTag().

◆ $CONTENT_REST

int ilFileXMLParser::$CONTENT_REST = 5
static

Definition at line 39 of file class.ilFileXMLParser.php.

Referenced by handlerBeginTag(), handlerCharacterData(), and handlerEndTag().

◆ $CONTENT_ZLIB_COMPRESSED

int ilFileXMLParser::$CONTENT_ZLIB_COMPRESSED = 2
static

Definition at line 36 of file class.ilFileXMLParser.php.

Referenced by handlerBeginTag(), and handlerEndTag().

◆ $date

int ilFileXMLParser::$date = null
protected

Definition at line 52 of file class.ilFileXMLParser.php.

Referenced by handlerBeginTag(), and handlerEndTag().

◆ $import_directory

string ilFileXMLParser::$import_directory = null
protected

Definition at line 55 of file class.ilFileXMLParser.php.

Referenced by getImportDirectory().

◆ $max_version

int ilFileXMLParser::$max_version = null
protected

Definition at line 51 of file class.ilFileXMLParser.php.

Referenced by handlerEndTag().

◆ $result

bool ilFileXMLParser::$result = false

result of parsing and updating

Definition at line 43 of file class.ilFileXMLParser.php.

◆ $tmpFilename

string ilFileXMLParser::$tmpFilename = null

file of temporary file where we store the file content instead of in memory

Definition at line 47 of file class.ilFileXMLParser.php.

Referenced by handlerEndTag().

◆ $usr_id

int ilFileXMLParser::$usr_id = null
protected

Definition at line 53 of file class.ilFileXMLParser.php.

Referenced by handlerBeginTag(), and handlerEndTag().

◆ $version

int ilFileXMLParser::$version = null
protected

Definition at line 49 of file class.ilFileXMLParser.php.

Referenced by handlerEndTag().

◆ $versions

array ilFileXMLParser::$versions = []
protected

Definition at line 54 of file class.ilFileXMLParser.php.


The documentation for this class was generated from the following file: