ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilImport.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
11 class ilImport
12 {
16  protected $log;
17 
18  protected $install_id = "";
19  protected $install_url = "";
20  protected $entities = "";
21  protected $tmp_import_dir = "";
22 
23  protected $mapping = null;
24  protected $skip_entity = array();
25  protected $configs = array();
26 
33  public function __construct($a_target_id = 0)
34  {
35  include_once("./Services/Export/classes/class.ilImportMapping.php");
36  $this->mapping = new ilImportMapping();
37  $this->mapping->setTargetId($a_target_id);
38  $this->log = ilLoggerFactory::getLogger('exp');
39  }
40 
48  public function getConfig($a_comp)
49  {
50  // if created, return existing config object
51  if (isset($this->configs[$a_comp])) {
52  return $this->configs[$a_comp];
53  }
54 
55  // create instance of export config object
56  $comp_arr = explode("/", $a_comp);
57  $a_class = "il" . $comp_arr[1] . "ImportConfig";
58  $import_config_file = "./" . $a_comp . "/classes/class." . $a_class . ".php";
59  if (!is_file($import_config_file)) {
60  include_once("./Services/Export/exceptions/class.ilImportException.php");
61  throw new ilImportException('Component "' . $a_comp . '" does not provide ImportConfig class.');
62  }
63  include_once($import_config_file);
64  $imp_config = new $a_class();
65  $this->configs[$a_comp] = $imp_config;
66 
67  return $imp_config;
68  }
69 
74  public function getMapping()
75  {
76  return $this->mapping;
77  }
78 
84  final public function setEntityTypes($a_val)
85  {
86  $this->entity_types = $a_val;
87  }
88 
94  final public function getEntityTypes()
95  {
96  return $this->entity_types;
97  }
98 
105  public function addSkipEntity($a_component, $a_entity, $skip = true)
106  {
107  $this->skip_entity[$a_component][$a_entity] = $skip;
108  }
109 
115  public function setCurrentDataset($a_val)
116  {
117  $this->current_dataset = $a_val;
118  }
119 
126  public function getCurrentDataset()
127  {
128  return $this->current_dataset;
129  }
130 
134  public function afterEntityTypes()
135  {
136  $this->getCurrentDataset()->setImport($this);
137  }
138 
144  public function importRecord($a_entity, $a_types, $a_record)
145  {
146  $this->getCurrentDataset()->importRecord($a_entity, $a_types, $a_record);
147  }
148 
149 
153  final public function importEntity(
154  $a_tmp_file,
155  $a_filename,
156  $a_entity,
157  $a_component,
158  $a_copy_file = false
159  ) {
160  $this->importObject(null, $a_tmp_file, $a_filename, $a_entity, $a_component, $a_copy_file);
161  }
162 
163 
169  final public function importObject(
170  $a_new_obj,
171  $a_tmp_file,
172  $a_filename,
173  $a_type,
174  $a_comp = "",
175  $a_copy_file = false
176  ) {
177 
178  // create temporary directory
179  $tmpdir = ilUtil::ilTempnam();
180  ilUtil::makeDir($tmpdir);
181  if ($a_copy_file) {
182  copy($a_tmp_file, $tmpdir . "/" . $a_filename);
183  } else {
184  ilUtil::moveUploadedFile($a_tmp_file, $a_filename, $tmpdir . "/" . $a_filename);
185  }
186 
187  $this->log->debug("unzip: " . $tmpdir . "/" . $a_filename);
188 
189  ilUtil::unzip($tmpdir . "/" . $a_filename);
190  $dir = $tmpdir . "/" . substr($a_filename, 0, strlen($a_filename) - 4);
191 
192  $this->setTemporaryImportDir($dir);
193 
194  $this->log->debug("dir: " . $dir);
195 
196  $ret = $this->doImportObject($dir, $a_type, $a_comp, $tmpdir);
197  $new_id = null;
198  if (is_array($ret)) {
199  $new_id = $ret['new_id'];
200  }
201 
202  // delete temporary directory
203  ilUtil::delDir($tmpdir);
204  return $new_id;
205  }
206 
213  public function importFromDirectory($dir, $a_type, $a_comp)
214  {
215  $ret = $this->doImportObject($dir, $a_type, $a_comp);
216 
217  if (is_array($ret)) {
218  return $ret['new_id'];
219  }
220  return null;
221  }
222 
223 
229  protected function setTemporaryImportDir($a_val)
230  {
231  $this->tmp_import_dir = $a_val;
232  }
233 
239  public function getTemporaryImportDir()
240  {
241  return $this->tmp_import_dir;
242  }
243 
249  protected function doImportObject($dir, $a_type, $a_component = "", $a_tmpdir = "")
250  {
251  if ($a_component == "") {
252  include_once("./Services/Export/classes/class.ilImportExportFactory.php");
253  $a_component = ilImportExportFactory::getComponentForExport($a_type);
254  }
255  $this->comp = $a_component;
256 
257  // get import class
258  $success = true;
259 
260  // process manifest file
261  include_once("./Services/Export/classes/class.ilManifestParser.php");
262  if (!is_file($dir . "/manifest.xml")) {
263  include_once("./Services/Export/exceptions/class.ilManifestFileNotFoundImportException.php");
264  $mess = (DEVMODE)
265  ? 'Manifest file not found: "' . $dir . "/manifest.xml" . '".'
266  : 'Manifest file not found: "manifest.xml."';
268  $e->setManifestDir($dir);
269  $e->setTmpDir($a_tmpdir);
270  throw $e;
271  }
272  $parser = new ilManifestParser($dir . "/manifest.xml");
273  $this->mapping->setInstallUrl($parser->getInstallUrl());
274  $this->mapping->setInstallId($parser->getInstallId());
275 
276  // check for correct type
277  if ($parser->getMainEntity() != $a_type) {
278  include_once("./Services/Export/exceptions/class.ilImportObjectTypeMismatchException.php");
279  $e = new ilImportObjectTypeMismatchException("Object type does not match. Import file has type '" . $parser->getMainEntity() . "' but import being processed for '" . $a_type . "'.");
280  throw $e;
281  }
282 
283  // process export files
284  $expfiles = $parser->getExportFiles();
285 
286  include_once("./Services/Export/classes/class.ilExportFileParser.php");
287  include_once("./Services/Export/classes/class.ilImportExportFactory.php");
288  $all_importers = array();
289  foreach ($expfiles as $expfile) {
290  $comp = $expfile["component"];
291  $class = ilImportExportFactory::getImporterClass($comp);
292 
293  // log a warning for inactive page component plugins, but continue import
294  // page content will be imported, but not its additional data
295  // (other plugins throw an exception in ilImportExportFactory)
296  if ($class == '') {
297  $this->log->warning("no class found for component: $comp");
298  continue;
299  }
300 
301  $this->log->debug("create new class = $class");
302 
303  $this->importer = new $class();
304  $this->importer->setImport($this);
305  $all_importers[] = $this->importer;
306  $this->importer->setImportDirectory($dir);
307  $this->importer->init();
308  $this->current_comp = $comp;
309  try {
310  $this->log->debug("Process file: " . $dir . "/" . $expfile["path"]);
311  $parser = new ilExportFileParser($dir . "/" . $expfile["path"], $this, "processItemXml");
312  } catch (Exception $e) {
313  $this->log->error("Import failed: " . $e->getMessage());
314  throw $e;
315  }
316  }
317 
318  // write import ids before(!) final processing
319  $obj_map = $this->getMapping()->getMappingsOfEntity('Services/Container', 'objs');
320  if (is_array($obj_map)) {
321  foreach ($obj_map as $obj_id_old => $obj_id_new) {
322  ilObject::_writeImportId($obj_id_new, "il_" . $this->mapping->getInstallId() . "_" . ilObject::_lookupType($obj_id_new) . "_" . $obj_id_old);
323  }
324  }
325 
326  // final processing
327  foreach ($all_importers as $imp) {
328  $this->log->debug("Call finalProcessing for: " . get_class($imp));
329  $imp->finalProcessing($this->mapping);
330  }
331 
332  // we should only get on mapping here
333  $top_mapping = $this->mapping->getMappingsOfEntity($this->comp, $a_type);
334  $new_id = (int) current($top_mapping);
335  return array(
336  'new_id' => $new_id,
337  'importers' => (array) $all_importers
338  );
339  }
340 
346  public function processItemXml($a_entity, $a_schema_version, $a_id, $a_xml, $a_install_id, $a_install_url)
347  {
348  global $DIC;
349 
350  $objDefinition = $DIC['objDefinition'];
351 
352  // skip
353  if ($this->skip_entity[$this->current_comp][$a_entity]) {
354  return;
355  }
356 
357  if ($objDefinition->isRBACObject($a_entity) &&
358  $this->getMapping()->getMapping('Services/Container', 'imported', $a_id)) {
359  $this->log->info('Ignoring referenced ' . $a_entity . ' with id ' . $a_id);
360  return;
361  }
362  $this->importer->setInstallId($a_install_id);
363  $this->importer->setInstallUrl($a_install_url);
364  $this->importer->setSchemaVersion($a_schema_version);
365  $this->importer->setSkipEntities($this->skip_entity);
366  $new_id = $this->importer->importXmlRepresentation($a_entity, $a_id, $a_xml, $this->mapping);
367 
368  // Store information about imported obj_ids in mapping to avoid double imports of references
369  if ($objDefinition->isRBACObject($a_entity)) {
370  $this->getMapping()->addMapping('Services/Container', 'imported', $a_id, 1);
371  }
372 
373  // @TODO new id is not always set
374  if ($new_id && $new_id !== true) {
375  $this->mapping->addMapping($this->comp, $a_entity, $a_id, $new_id);
376  }
377  }
378 }
importEntity( $a_tmp_file, $a_filename, $a_entity, $a_component, $a_copy_file=false)
Import entity.
setEntityTypes($a_val)
Set entity types.
doImportObject($dir, $a_type, $a_component="", $a_tmpdir="")
Import repository object export file.
global $DIC
Definition: saml.php:7
afterEntityTypes()
After entity types are parsed.
getMapping()
Get mapping object.
processItemXml($a_entity, $a_schema_version, $a_id, $a_xml, $a_install_id, $a_install_url)
Process item xml.
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
Import class.
importFromDirectory($dir, $a_type, $a_comp)
Import from directory.
addSkipEntity($a_component, $a_entity, $skip=true)
Add skip entity.
$a_type
Definition: workflow.php:92
getTemporaryImportDir()
Get temporary import directory.
$success
Definition: Utf8Test.php:86
General import exception.
manifest.xml file not found-exception for import
setCurrentDataset($a_val)
Set currrent dataset.
importObject( $a_new_obj, $a_tmp_file, $a_filename, $a_type, $a_comp="", $a_copy_file=false)
Import repository object export file.
static _lookupType($a_id, $a_reference=false)
lookup object type
getConfig($a_comp)
Get configuration (note that configurations are optional, null may be returned!)
Manifest parser for ILIAS standard export files.
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
getEntityTypes()
Get entity types.
static ilTempnam($a_temp_path=null)
Returns a unique and non existing Path for e temporary file or directory.
$parser
Definition: BPMN2Parser.php:23
static _writeImportId($a_obj_id, $a_import_id)
write import id to db (static)
$ret
Definition: parser.php:6
static getLogger($a_component_id)
Get component logger.
importRecord($a_entity, $a_types, $a_record)
After entity types are parsed.
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
setTemporaryImportDir($a_val)
Set temporary import directory.
getCurrentDataset()
Get currrent dataset.
__construct($a_target_id=0)
Constructor.