ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
class.ilExportContainer.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once './Services/Export/classes/class.ilExportFileInfo.php';
5 include_once './Services/Export/classes/class.ilExport.php';
6 
7 
16 {
17  private $cont_export_dir = '';
18  private $cont_manifest_writer = null;
19  private $eo = null;
20 
21 
27  public function __construct(ilExportOptions $eo)
28  {
29  $this->eo = $eo;
30  parent::__construct();
31  }
32 
41  public function exportObject($a_type, $a_id, $a_target_release = "")
42  {
43  // if no target release specified, use latest major release number
44  if ($a_target_release == "") {
45  $v = explode(".", ILIAS_VERSION_NUMERIC);
46  $a_target_release = $v[0] . "." . $v[1] . ".0";
47  }
48 
49  // Create base export directory
51  $export_dir = ilExport::_getExportDirectory($a_id, "xml", $a_type);
52  $ts = time();
53  $sub_dir = $ts . "__" . IL_INST_ID . "__" . $a_type . "_" . $a_id;
54 
55  $this->cont_export_dir = $export_dir . DIRECTORY_SEPARATOR . $sub_dir;
56  ilUtil::makeDirParents($this->cont_export_dir);
57 
58  $GLOBALS['ilLog']->write(__METHOD__ . ' using base directory: ' . $this->export_run_dir);
59 
60  $this->manifestWriterBegin($a_type, $a_id, $a_target_release);
61  $this->addContainer();
62  $this->addSubitems($a_id, $a_type, $a_target_release);
63  $this->manifestWriterEnd($a_type, $a_id, $a_target_release);
64 
65  ilUtil::zip($this->cont_export_dir, $this->cont_export_dir . '.zip');
66  ilUtil::delDir($this->cont_export_dir);
67  }
68 
73  protected function manifestWriterBegin($a_type, $a_id, $a_target_release)
74  {
75  $GLOBALS['ilLog']->write(__METHOD__ . ': wrinting manifest');
76  include_once "./Services/Xml/classes/class.ilXmlWriter.php";
77  $this->cont_manifest_writer = new ilXmlWriter();
78  $this->cont_manifest_writer->xmlHeader();
79  $this->cont_manifest_writer->xmlStartTag(
80  'Manifest',
81  array(
82  "MainEntity" => $a_type,
83  "Title" => ilObject::_lookupTitle($a_id),
84  "TargetRelease" => $a_target_release,
85  "InstallationId" => IL_INST_ID,
86  "InstallationUrl" => ILIAS_HTTP_PATH)
87  );
88  }
89 
94  protected function addContainer()
95  {
96  }
97 
98 
105  protected function addSubitems($a_id, $a_type, $a_target_release)
106  {
107  $GLOBALS['ilLog']->write(__METHOD__);
108  $set_number = 1;
109  foreach ($this->eo->getSubitemsForExport() as $ref_id) {
110  // get last export file
111  $obj_id = ilObject::_lookupObjId($ref_id);
112 
113  $expi = ilExportFileInfo::lookupLastExport($obj_id, 'xml', $a_target_release);
114 
115  if (!$expi instanceof ilExportFileInfo) {
116  $GLOBALS['ilLog']->write(__METHOD__ . ': Cannot find export file for refId ' . $ref_id . ', type ' . ilObject::_lookupType($a_id));
117  continue;
118  }
119 
120  $exp_dir = ilExport::_getExportDirectory($obj_id, 'xml', ilObject::_lookupType($obj_id));
121  $exp_full = $exp_dir . DIRECTORY_SEPARATOR . $expi->getFilename();
122 
123  $GLOBALS['ilLog']->write(__METHOD__ . ': zip path ' . $exp_full);
124 
125  // Unzip
126  ilUtil::unzip($exp_full, true, false);
127 
128  // create set directory
129  ilUtil::makeDirParents($this->cont_export_dir . DIRECTORY_SEPARATOR . 'set_' . $set_number);
130 
131  // cut .zip
132  $new_path_rel = 'set_' . $set_number . DIRECTORY_SEPARATOR . $expi->getBasename();
133  $new_path_abs = $this->cont_export_dir . DIRECTORY_SEPARATOR . $new_path_rel;
134 
135  $GLOBALS['ilLog']->write(__METHOD__ . ': ' . $new_path_rel . ' ' . $new_path_abs);
136 
137  // Move export
138  rename(
139  $exp_dir . DIRECTORY_SEPARATOR . $expi->getBasename(),
140  $new_path_abs
141  );
142 
143  $GLOBALS['ilLog']->write($exp_dir . DIRECTORY_SEPARATOR . $expi->getBasename() . ' -> ' . $new_path_abs);
144 
145  // Delete latest container xml of source
146  if ($a_id == $obj_id) {
147  $expi->delete();
148  if (file_exists($exp_full)) {
149  $GLOBALS['ilLog']->write(__METHOD__ . ': Deleting' . $exp_full);
150  unlink($exp_full);
151  }
152  }
153 
154  $this->cont_manifest_writer->xmlElement(
155  'ExportSet',
156  array(
157  'Path' => $new_path_rel,
158  'Type' => ilObject::_lookupType($obj_id)
159  )
160  );
161 
162 
163  ++$set_number;
164  }
165  }
166 
174  protected function manifestWriterEnd($a_type, $a_id, $a_target_release)
175  {
176  $this->cont_manifest_writer->xmlEndTag('Manifest');
177  $GLOBALS['ilLog']->write(__METHOD__ . ': ' . $this->cont_export_dir . DIRECTORY_SEPARATOR . 'manifest.xml');
178  $this->cont_manifest_writer->xmlDumpFile($this->cont_export_dir . DIRECTORY_SEPARATOR . 'manifest.xml', true);
179  }
180 }
static _createExportDirectory($a_obj_id, $a_export_type="xml", $a_obj_type="")
static makeDirParents($a_dir)
Create a new directory and all parent directories.
__construct(ilExportOptions $eo)
Constructor.
const ILIAS_VERSION_NUMERIC
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
static unzip($a_file, $overwrite=false, $a_flat=false)
unzip file
XML writer class.
static _lookupTitle($a_id)
lookup object title
manifestWriterEnd($a_type, $a_id, $a_target_release)
Write manifest footer.
$a_type
Definition: workflow.php:92
manifestWriterBegin($a_type, $a_id, $a_target_release)
Write container manifest.
static _lookupObjId($a_id)
static lookupLastExport($a_obj_id, $a_type, $a_version='')
Lookup last export.
Stores information of creation date and versions of export files
static zip($a_dir, $a_file, $compress_content=false)
zips given directory/file into given zip.file
Create styles array
The data for the language used.
static _lookupType($a_id, $a_reference=false)
lookup object type
addContainer()
Add container description.
addSubitems($a_id, $a_type, $a_target_release)
Add subitems.
static _getExportDirectory($a_obj_id, $a_type="xml", $a_obj_type="", $a_entity="")
Get export directory for an repository object.
exportObject($a_type, $a_id, $a_target_release="")
Export a container.
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
static delDir($a_dir, $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively