4 * FusionForge source control management
6 * Copyright 2012, Alain Peyrat
7 * Copyright 2017, Franck Villaume - TrivialDev
9 * This file is part of FusionForge.
11 * FusionForge is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published
13 * by the Free Software Foundation; either version 2 of the License,
14 * or (at your option) any later version.
16 * FusionForge is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with FusionForge; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 require (dirname(__FILE__).'/../common/include/env.inc.php');
27 require_once $gfcommon.'include/pre.php';
28 require_once $gfcommon.'tracker/ArtifactFactory.class.php';
29 require_once $gfcommon.'tracker/ArtifactTypeFactory.class.php';
30 require_once $gfcommon.'docman/DocumentReviewFactory.class.php';
33 function help($method = null) {
34 $methods = join('|', get_class_methods($this));
35 $dumpFormatInfo = "the following output formats are available:\n".
37 " pretty json formated string output\n".
38 " - raw: (default)\n".
39 " standard PHP array print_r format\n";
40 $importFormatInfo = "The <file> must contain the exact information to import.\n".
41 "Best practice is to reuse the result of an export and modify it.\n".
42 "Use getZipDump function to get binary organization sample.\n";
45 echo "Use: .../forge help ($methods)\n";
46 echo "to get detail on each command\n";
48 case 'pluginActivate':
49 echo "Use: .../forge pluginActivate <pluginName>\n";
50 echo "to activate the <pluginName> plugin\n";
52 case 'pluginDeactivate':
53 echo "Use: .../forge pluginDeactivate <pluginName>\n";
54 echo "to deactivate the <pluginName> plugin\n";
57 echo "Use: .../forge artifactDump <aid> [json|raw]\n";
58 echo "to dump an artifact from a specific tracker of a project.\n";
61 case 'artifactImport':
62 echo "Use: .../forge artifactImport <file> [json|raw]\n";
63 echo "to import an artifact.\n";
64 echo $dumpFormatInfo.$importFormatInfo;
67 echo "Use: .../forge trackerDump <atid> [json|raw]\n";
68 echo "to dump a tracker from a specific project.\n";
72 echo "Use: .../forge trackerImport <file> [json|raw]\n";
73 echo "to import a tracker and all his elements.\n";
74 echo $dumpFormatInfo.$importFormatInfo;
77 echo "Use: .../forge documentDump <docid> [json|raw]\n";
78 echo "to dump a document from a specific project.\n";
81 case 'documentImport':
82 echo "Use: .../forge documentImport <file> [json|raw]\n";
83 echo "to import a document.\n";
84 echo $dumpFormatInfo.$importFormatInfo;
87 echo "Use: .../forge docgroupDump <docgroupid> [json|raw]\n";
88 echo "to dump a document group (folder) from a specific project.\n";
91 case 'docgroupImport':
92 echo "Use: .../forge docgroupImport <file> [json|raw]\n";
93 echo "to import a document group (folder) and all his elements.\n";
94 echo $dumpFormatInfo.$importFormatInfo;
97 echo "Use: .../forge docmanDump <groupid> [json|raw]\n";
98 echo "to dump docman from a specific project.\n";
102 echo "Use: .../forge releaseDump <releaseid> [json|raw]\n";
103 echo "to dump a spectific FRS release from a specific project.\n";
104 echo $dumpFormatInfo;
107 echo "Use: .../forge packageDump <packageid> [json|raw]\n";
108 echo "to dump a spectific FRS package from a specific project.\n";
109 echo $dumpFormatInfo;
112 echo "Use: .../forge frsDump <groupid> [json|raw]\n";
113 echo "to dump FRS from a specific project.\n";
114 echo $dumpFormatInfo;
117 echo "Use: .../forge surveyDump <surveyid> [json|raw]\n";
118 echo "to dump a specific survey from a specific project.\n";
119 echo $dumpFormatInfo;
122 echo "Use: .../forge groupDump <groupid> [json|raw]\n";
123 echo "to dump a group.\n";
124 echo $dumpFormatInfo;
127 echo "Use: .../forge getDataDump file [json|raw]\n";
128 echo "to generate a zip file that includes all data based on parameter file.\n";
129 echo "The file can be generated by using other Dump functions such as groupDump.\n";
132 echo "Usage: .../forge ($methods) [arguments...]\n" ;
133 echo "Get more info use: .../forge help help\n";
138 function pluginActivate ($name) {
139 $pm = plugin_manager_get_object();
140 $pm->activate($name);
141 $pm->LoadPlugin($name);
142 $plugin = $pm->GetPluginObject($name);
146 function pluginDeactivate ($name) {
147 $pm = plugin_manager_get_object();
148 $pm->deactivate($name);
151 function getZipDump($file, $format = 'json') {
152 $stream = $this->loadFile($file, $format);
157 $zipfile = 'fusionforge-zipDump-'.$time.'.zip';
159 $zip = new ZipArchive();
160 if($zip->open($zipfile, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== true) {
161 echo _('Unable to create zip file')._(': ').$zipfile;
165 function copyStorageRef(&$value, $key) {
167 if ($key == 'storageref' && $value != null) {
168 if (is_file($value) && is_readable($value)) {
169 $localname = str_replace(forge_get_config('data_path').'/', '', $value);
170 $zip->addFile($value, $localname);
176 array_walk_recursive($stream, 'copyStorageRef');
177 if ($format == 'json') {
178 $stream = json_encode($stream, JSON_PRETTY_PRINT);
180 file_put_contents('parameter.'.$format, $stream);
181 $zip->addFile('parameter.'.$format, basename('parameter.'.$format));
183 @unlink('parameter.'.$format);
184 return file_exists($zipfile);
187 function artifactDump($aid, $format = 'json') {
188 $artifactDump['id'] = $aid;
189 $artf = artifact_get_object($aid);
190 if ($artf && is_object($artf) && !$artf->isError()) {
191 $artifactDump = (array)$artf;
192 unset($artifactDump['ArtifactType']);
193 $artifactDump['history'] = array();
194 $hist = $artf->getHistory();
195 if (db_numrows($hist) > 0) {
196 while ($arr = db_fetch_array($hist, PGSQL_ASSOC)) {
197 $artifactDump['history'][] = $arr;
200 $artifactDump['monitor'] = $artf->getMonitorIds();
201 $artifactDump['messages'] = array();
202 $messages = $artf->getMessages();
203 if (db_numrows($messages) > 0) {
204 while ($arr = db_fetch_array($messages, PGSQL_ASSOC)) {
205 $artifactDump['messages'][] = $arr;
208 $files = $artf->getFiles();
209 foreach ($files as $key => $file) {
210 unset($file->Artifact);
211 $artifactDump['files'][$key] = (array)$file;
212 $artifactDump['files'][$key]['storageref'] = $file->getFile();
214 $artifactDump['relatedtasks'] = array();
215 $tasks = $artf->getRelatedTasks();
216 if (db_numrows($tasks) > 0) {
217 while ($arr = db_fetch_array($tasks, PGSQL_ASSOC)) {
218 $artifactDump['relatedtasks'][] = $arr;
221 $artifactDump['votes'] = $artf->getVotes();
222 $extra_field_data = $artf->getExtraFieldDataText();
223 $extra_field_element_ids = $artf->getExtraFieldData();
224 if (is_array($extra_field_element_ids)) {
225 foreach ($extra_field_element_ids as $key => $extra_field_element_id) {
226 if (isset($extra_field_data[$key])) {
227 $extra_field_data[$key]['element_id'] = $extra_field_element_id;
231 $artifactDump['extra_field_data'] = $extra_field_data;
233 $artifactDump['error'][] = _('Unable to get artifact id')._(': ').$aid;
235 ksort($artifactDump);
236 $this->print_result($artifactDump, $format);
237 return $artifactDump;
240 function artifactImport($file, $format = 'json') {
241 global $importRefMapping;
242 $stream = $this->loadFile($file, $format);
246 $group_artifact_id = $this->getMappingId($stream['data_array']['group_artifact_id'], 'artifact_type');
247 $at = artifactType_get_object($group_artifact_id);
248 if ($at && is_object($at) && !$at->isError()) {
250 $artf = new Artifact($at);
251 $assigned_to = $this->getMappingId($stream['data_array']['assigned_to'], 'user');
252 $extra_fields = array();
253 if (isset($stream['extra_field_data']) && is_array($stream['extra_field_data'])) {
254 foreach ($stream['extra_field_data'] as $key => $extra_field_data) {
255 if (isset($extra_field_data['element_id'])) {
256 $efid = $this->getMappingId($key, 'extrafield');
257 $elid = $this->getMappingId($extra_field_data['element_id'], 'extrafield_element');
258 $extra_fields[$efid] = $elid;
262 $importData['user'] = $this->getMappingId($stream['data_array']['submitted_by'], 'user');
263 $importData['nopermcheck'] = true;
264 $importData['nonotice'] = true;
265 $importData['time'] = $stream['data_array']['open_date'];
266 if (!$artf->create($stream['data_array']['summary'], $stream['data_array']['details'], $assigned_to, $stream['data_array']['priority'], $extra_fields, $importData)) {
267 echo $artf->getErrorMessage()."\n";
271 $importRefMapping['artifact'][$stream['data_array']['artifact_id']] = $artf->getID();
272 if (isset($stream['files']) && is_array($stream['files'])) {
274 foreach ($stream['files'] as $file) {
275 if (isset($file['storageref']) && is_file($path.'/'.$file['storageref'])) {
276 $filedataname = $path.'/'.$file['storageref'];
277 if (function_exists('finfo_open')) {
278 $finfo = finfo_open(FILEINFO_MIME_TYPE);
279 $filedatatype = finfo_file($finfo, $filedataname);
281 $filedatatype = $file['data_array']['filetype'];
283 $af = new ArtifactFile($artf);
284 $importFileData['user'] = $this->getMappingId($file['data_array']['submitted_by'], 'user');
285 $importFileData['time'] = $file['data_array']['adddate'];
286 if (!$af->create($file['data_array']['filename'], $filedatatype, $file['data_array']['filesize'], $filedataname, $file['data_array']['description'], $importData)) {
287 echo $af->getErrorMessage()."\n";
295 echo _('Artifact injected')."\n";
298 echo _('Unable to get tracker to inject artifact')._(': ').$group_artifact_id."\n";
303 function groupDump($lgroup_id, $format = 'json') {
304 // that is ugly... group_id is used as global var. it needs to be defined.
306 $group_id = $lgroup_id;
307 $groupDump['id'] = $group_id;
308 $group = group_get_object($group_id);
309 if ($group && is_object($group) && !$group->isError()) {
310 $groupDump['setup'] = (array)$group;
311 $groupDump['setup']['membersArr'] = $group->getMembers(false);
312 $groupDump['setup']['roles'] = $group->getRoles();
313 foreach ($groupDump['setup']['roles'] as $role) {
316 $groupDump['setup']['homepage'] = $group->getWidgetLayoutConfig();
317 if ($group->usesDocman()) {
318 $groupDump['docman'] = $this->docmanDump($group_id, 'return');
320 if ($group->usesTracker()) {
321 $groupDump['trackers'] = array();
322 $atf = new ArtifactTypeFactory($group);
323 $atid_arr = $atf->getAllArtifactTypeIds();
324 foreach ($atid_arr as $atid) {
325 $groupDump['trackers'][] = $this->trackerDump($atid, 'return');
328 if ($group->usesForum()) {
329 $groupDump['forums'] = array();
330 $ff = new ForumFactory($group);
331 $ffid_arr = $ff->getAllForumIds();
332 foreach ($ffid_arr as $ffid) {
333 $groupDump['forums'][] = $this->forumDump($ffid, 'return');
336 if ($group->usesFRS()) {
337 $groupDump['frs'] = $this->frsDump($group_id, 'return');
339 if ($group->usesNews()) {
340 $groupDump['news'] = array();
341 $resultdb = db_query_params ('SELECT forum_id FROM news_bytes WHERE news_bytes.group_id = $1',
344 if ($resultdb && db_numrows($resultdb)) {
345 $forumIds = util_result_column_to_array($resultdb);
347 foreach ($forumIds as $forumId) {
348 $groupDump['news'][] = $this->forumDump($forumId, 'return');
351 if ($group->usesSurvey()) {
352 $groupDump['surveys'] = array();
353 $sf = new SurveyFactory($group);
354 $sfid_arr = $sf->getSurveysIds();
355 foreach ($sfid_arr as $sfid) {
356 $groupDump['surveys'][] = $this->surveyDump($sfid, 'return');
359 if ($group->usesPM()) {
360 $groupDump['pm'] = array();
361 $pgf = new ProjectGroupFactory($group);
362 $pgfid_arr = $pgf->getAllProjectGroupIds();
363 foreach ($pgfid_arr as $pgfid) {
364 $groupDump['pm'][] = $this->pmDump($pgfid, 'return');
367 plugin_hook_by_reference('pluginDump', $groupDump);
369 $groupDump['error'][] = _('Unable to get group id')._(': ').$group_id;
372 $this->print_result($groupDump, $format);
375 function groupImport($file, $format = 'json') {
376 global $importRefMapping;
377 $stream = $this->loadFile($file, $format);
383 function surveyDump($sid, $format = 'json') {
384 $surveyDump['id'] = $sid;
385 $surveyObject = survey_get_object($sid);
386 $surveyObject->getQuestionInstances();
387 $surveyDump['setup'] = (array)$surveyObject;
388 unset($surveyDump['setup']['Group']);
389 foreach($surveyDump['setup']['all_question_array'] as $question) {
390 unset($question->Group);
393 $this->print_result($surveyDump, $format);
397 function forumDump($fid, $format = 'json') {
398 $forumDump['id'] = $fid;
399 $forum = forum_get_object($fid);
400 if ($forum && is_object($forum) && !$forum->isError()) {
401 unset($forum->Group);
402 $forumDump['setup'] = (array)$forum;
404 $forumDump['error'][] = _('Unable to get forum id')._(': ').$fid;
407 $this->print_result($forumDump, $format);
411 function trackerDump($atid, $format = 'json') {
412 $trackerDump['id'] = $atid;
413 $at = artifactType_get_object($atid);
414 if ($at && is_object($at) && !$at->isError()) {
415 $trackerDump['setup'] = $at->getSettings();
416 $af = new ArtifactFactory($at);
417 if ($af && is_object($af) && !$at->isError()) {
418 $af->setup(0, '', '', 0, 'overwrite', false, false, array(), false);
419 $artifacts = $af->getArtifacts();
420 foreach ($artifacts as $artf) {
421 $trackerDump['data'][] = $this->artifactDump($artf->getID(), 'return');
423 $trackerDump['monitor'] = $at->getMonitorIds();
425 $trackerDump['error'][] = _('Unable to retrieve artifacts');
428 $trackerDump['error'][] = _('Unable to get tracker id')._(': ').$atid;
431 $this->print_result($trackerDump, $format);
435 function trackerImport($file, $format = 'json') {
436 global $importRefMapping;
437 $stream = $this->loadFile($file, $format);
441 $group_id = $this->getMappingId($stream['setup']['group_id'], 'group');
442 $group = group_get_object($group_id);
443 if ($group && is_object($group) && !$group->isError() && $group->usesTracker()) {
445 $at = new ArtifactType($group);
446 $due_period = $stream['setup']['due_period']/(60*60*24); //in days
447 if (!$at->create($stream['setup']['name'], $stream['setup']['description'], $stream['setup']['email_all_updates'], $stream['setup']['email_address'],
448 $due_period, 0, $stream['setup']['submit_instructions'], $stream['setup']['browse_instructions'])) {
449 echo $at->getErrorMessage()."\n";
453 $importRefMapping['artifact_type'][$stream['setup']['group_artifact_id']] = $at->getID();
454 if (isset($stream['setup']['extra_fields']) && is_array($stream['setup']['extra_fields'])) {
455 foreach ($stream['setup']['extra_fields'] as $extra_field) {
456 $ef = new ArtifactExtraField($at);
457 if (!$ef->create($extra_field['name'], $extra_field['field_type'], $extra_field['attribute1'], $extra_field['attribute2'],
458 $extra_field['is_required'], $extra_field['alias'], $extra_field['show100'], $extra_field['show100label'],
459 $extra_field['description'], $extra_field['pattern'], $extra_field['parent'], $extra_field['autoassign'],
460 $extra_field['is_hidden_on_submit'], $extra_field['is_disabled'])) {
461 echo $ef->getErrorMessage()."\n";
465 $importRefMapping['extrafield'][$extra_field['extra_field_id']] = $ef->getID();
466 if (isset($extra_field['available_values']) && is_array($extra_field['available_values'])) {
467 $clean_status = true;
468 foreach ($extra_field['available_values'] as $available_value) {
469 $efe = new ArtifactExtraFieldElement($ef);
470 //by default extrafield status is created with default values: 'Open' & 'Closed'
471 if ($clean_status && $ef->getType() == ARTIFACT_EXTRAFIELDTYPE_STATUS) {
472 $existingElements = $ef->getAvailableValues();
473 foreach($existingElements as $existingElement) {
474 $existingElement = new ArtifactExtraFieldElement($ef, $existingElement);
475 $existingElement->delete();
477 $clean_status = false;
479 if (!$efe->create($available_value['element_name'], $available_value['status_id'], $available_value['auto_assign_to'], $available_value['is_default'])) {
480 echo $efe->getErrorMessage()."\n";
484 $importRefMapping['extrafield_element'][$available_value['element_id']] = $efe->getID();
489 if (isset($stream['data']) && is_array($stream['data'])) {
490 foreach ($stream['data'] as $n_artifact) {
491 $filename = 'artifactDump-'.$n_artifact['data_array']['artifact_id'].'.'.$format;
492 $this->createSubfile($filename, $n_artifact, $format);
493 if (!$this->artifactImport($filename, $format)) {
494 echo _('Unable to inject child artifact')."\n";
502 echo _('Tracker injected')."\n";
505 echo _('Unable to get project to inject tracker')._(': ').$group_id."\n";
510 function documentDump($docid, $format = 'json') {
511 $doc = document_get_object($docid);
512 if ($doc && is_object($doc) && !$doc->isError()) {
513 $dvf = new DocumentVersionFactory($doc);
514 $documentDump = (array)$doc;
515 unset($documentDump['Group']);
516 $documentDump['versions'] = $dvf->getVersions();
517 $serialIDs = $dvf->getSerialIDs();
518 $drf = new DocumentReviewFactory($doc);
519 $documentDump['reviews'] = $drf->getReviews($serialIDs);
520 $documentDump['monitor'] = $doc->getMonitorIds();
522 $documentDump['error'][] = _('Unable to get document id')._(': ').$docid;
524 $documentDump['id'] = $docid;
525 ksort($documentDump);
526 $this->print_result($documentDump, $format);
527 return $documentDump;
530 function documentImport($file, $format = 'json') {
531 global $importRefMapping;
532 $stream = $this->loadFile($file, $format);
536 $group_id = $this->getMappingId($stream['data_array']['group_id'], 'group');
537 $group = group_get_object($group_id);
538 $importSerialIdRef = array();
539 if ($group && is_object($group) && !$group->isError() && $group->usesDocman()) {
541 $firstversion = true;
543 foreach ($stream['versions'] as $key => $version) {
544 if ($version['filetype'] != 'URL' && $version['storageref'] != null) {
545 if (!is_file($path.'/'.$version['storageref'])) {
546 echo _('Invalid file name.')."\n";
550 $filedataname = $path.'/'.$version['storageref'];
551 if (function_exists('finfo_open')) {
552 $finfo = finfo_open(FILEINFO_MIME_TYPE);
553 $filedatatype = finfo_file($finfo, $filedataname);
555 $filedatatype = 'application/binary';
558 $filedatatype = $version['filetype'];
562 $doc_group_id = $this->getMappingId($stream['data_array']['doc_group'], 'doc_group');
563 $doc_group = documentgroup_get_object_byid($doc_group_id);
564 if (!$doc_group || !is_object($doc_group) || $doc_group->isError()) {
565 echo _('Invalid document group (folder)')._(': ').$doc_group_id."\n";
569 $importData['user'] = $this->getMappingId($version['created_by'], 'user');
570 $importData['nopermcheck'] = true;
571 $importData['nonotice'] = true;
572 $importData['time'] = $version['createdate'];
573 if ($firstversion == true) {
574 $d = new Document($group);
575 if (!$d->create($version['filename'], $filedatatype, $filedataname, $doc_group_id, $version['title'], $version['description'], $stream['data_array']['stateid'], $version['vcomment'], $importData)) {
576 echo $d->getErrorMessage()."\n";
580 $firstversion = false;
583 if (!$d->update($version['filename'], $filedatatype, $filedataname, $doc_group_id, $version['title'], $version['description'], $stream['data_array']['stateid'], 0, $version['current_version'], 1, $importData, $version['vcomment'])) {
584 echo $d->getErrorMessage()."\n";
589 $dv = new DocumentVersion($d, $key + 1);
590 $importSerialIdRef[$version['serial_id']] = $dv->getID();
592 if ($d && !$d->isError()) {
593 foreach($stream['reviews'] as $review) {
594 $dr = new DocumentReview($d);
595 $reviewmandatoryusers = array();
596 $reviewoptionalusers = array();
597 foreach($review['users'] as $reviewuser) {
598 $userid = $this->getMappingId($reviewuser['userid'], 'user');
599 if ($reviewuser['typeid'] == 1) {
600 $reviewmandatoryusers[] = $userid;
601 } elseif ($reviewuser['typeid'] == 2) {
602 $reviewoptionalusers[] = $userid;
605 $importData['user'] = $this->getMappingId($review['created_by'], 'user');
606 $importData['startdate'] = $review['startdate'];
607 $importData['enddate'] = $review['enddate'];
608 $importData['nonotice'] = true;
609 if (!$dr->create($importSerialIdRef[$review['serialid']], $review['title'], $review['description'], $review['enddate'], $reviewmandatoryusers, $reviewoptionalusers, false, $importData)) {
610 echo $dr->getErrorMessage()."\n";
614 foreach($review['comments'] as $comment) {
615 $nc = new DocumentReviewComment($dr);
616 if (!$nc->create($comment['data_array']['userid'], $dr->getID(), $comment['data_array']['rcomment'], $comment['data_array']['createdate'])) {
617 echo $nc->getErrorMessage()."\n";
621 if (isset($comment['attachment']['storageref']) && $comment['attachment']['storageref'] != null) {
622 if (!$nc->attachFile($comment['attachment']['data_array']['filename'], $comment['attachment']['data_array']['filetype'], $comment['attachment']['data_array']['createdate'], $comment['attachment']['storageref'])) {
623 echo $nc->getErrorMessage()."\n";
634 $importRefMapping['document'][$stream['data_array']['docid']] = $d->getID();
635 echo _('Document injected')."\n";
638 echo _('Unable to get project to inject document')._(': ').$group_id."\n";
643 function docgroupDump($docgroup_id, $format = 'json') {
644 $docgroup = documentgroup_get_object_byid($docgroup_id);
645 if ($docgroup && is_object($docgroup) && !$docgroup->isError()) {
646 $dm = new DocumentManager($docgroup->getGroup());
647 if ($dm && is_object($dm) && !$dm->isError()) {
648 $docgroupDump = (array)$docgroup;
649 unset($docgroupDump['Group']);
650 $docgroupDump['subdocgroups'] = $dm->getTree($docgroup_id);
651 $df = new DocumentFactory($docgroup->getGroup());
652 $df->setDocGroupID($docgroup_id);
653 $df->setStateID(array(1, 2, 3, 4, 5));
654 $df->setOrder(array('docid'));
655 $docgroupDump['files'] = (array)$df->getDocumentsWithVersions();
657 $docgroupDump['error'][] = _('Unable to get document manager for docgroup id')._(': ').$docgroup_id;
660 $docgroupDump['error'][] = _('Unable to get docgroup id')._(': ').$docgroup_id;
662 $docgroupDump['id'] = $docgroup_id;
663 ksort($docgroupDump);
664 $this->print_result($docgroupDump, $format);
665 return $docgroupDump;
668 function docgroupImport($file, $format = 'json') {
669 global $importRefMapping;
670 $stream = $this->loadFile($file, $format);
674 $group_id = $this->getMappingId($stream['data_array']['group_id'], 'group');
675 $group = group_get_object($group_id);
676 $importSerialIdRef = array();
677 if ($group && is_object($group) && !$group->isError() && $group->usesDocman()) {
679 $dg = new DocumentGroup($group);
680 $parent_doc_group = (int)$this->getMappingId($stream['data_array']['parent_doc_group'], 'doc_group');
681 if (!$dg->create($stream['data_array']['groupname'], $parent_doc_group, $stream['data_array']['stateid'], $stream['data_array']['createdate'])) {
682 echo $dg->getErrorMessage()."\n";
686 $importRefMapping['doc_group'][$stream['data_array']['doc_group']] = $dg->getID();
687 if (isset($stream['subdocgroups']) && is_array($stream['subdocgroups'])) {
688 foreach ($stream['subdocgroups'] as $subdocgroup) {
689 $filename = 'docgroupDump-'.$subdocgroup['data_array']['doc_group'].'.'.$format;
690 $this->createSubfile($filename, $subdocgroup, $format);
691 if (!$this->docgroupImport($filename, $format)) {
692 echo _('Unable to inject child docgroup')."\n";
699 if (isset($stream['files']) && is_array($stream['files'])) {
700 foreach ($stream['files'] as $file) {
701 $filename = 'documentDump-'.$file['data_array']['docid'].'.'.$format;
702 $this->createSubfile($filename, $file, $format);
703 if (!$this->documentImport($filename, $format)) {
704 echo _('Unable to inject child file')."\n";
712 echo _('Document Group injected')."\n";
715 echo _('Unable to get project to inject document group')._(': ').$group_id."\n";
720 function docmanDump($group_id, $format = 'json') {
721 $docmanDump = array();
722 $group = group_get_object($group_id);
723 if ($group && is_object($group) && !$group->isError()) {
724 if ($group->usesDocman()) {
725 $dm = new DocumentManager($group);
726 if ($dm && is_object($dm) && !$dm->isError()) {
727 $docmanDump['setup'] = $dm->getSettings();
728 $docmanDump['data'] = $dm->getTree();
730 $docmanDump['error'][] = _('Unable to get document manager for group id')._(': ').$group_id;
733 $docmanDump['error'][] = _('Document manager not enabled for group id')._(': ').$group_id;
736 $docmanDump['error'][] = _('Unable to get group id')._(': ').$group_id;
739 $this->print_result($docmanDump, $format);
743 function docmanImport($file, $format = 'json') {
744 global $importRefMapping;
745 $stream = $this->loadFile($file, $format);
749 $group_id = $this->getMappingId($stream['setup']['group_id'], 'group');
750 $group = group_get_object($group_id);
751 if ($group && is_object($group) && !$group->isError() && $group->usesDocman()) {
753 if (isset($stream['setup']['new_doc_address'])) {
754 $group->setDocEmailAddress($stream['setup']['new_doc_address']);
756 if (isset($stream['setup']['use_docman_search'])) {
757 $group->setDocmanSearchStatus($stream['setup']['use_docman_search']);
759 if (isset($stream['setup']['use_webdav'])) {
760 $group->setDocmanWebdav($stream['setup']['use_webdav']);
762 if (isset($stream['setup']['use_docman_create_online'])) {
763 $group->setDocmanCreateOnlineStatus($stream['setup']['use_docman_create_online']);
765 if (isset($stream['setup']['send_all_docs'])) {
766 $group->setDocmanCreateOnlineStatus($stream['setup']['send_all_docs']);
768 if (isset($stream['data']) && is_array($stream['data'])) {
769 foreach ($stream['data'] as $element) {
770 $filename = 'docgroupDump-'.$element['data_array']['doc_group'].'.'.$format;
771 $this->createSubfile($filename, $element, $format);
772 if (!$this->docgroupImport($filename, $format)) {
773 echo _('Unable to inject child element')."\n";
781 echo _('Docman injected')."\n";
783 echo _('Unable to get project to inject docman')._(': ').$group_id."\n";
788 function frsDump($group_id, $format = 'json') {
790 $group = group_get_object($group_id);
791 if ($group && is_object($group) && !$group->isError()) {
792 if ($group->usesFRS()) {
793 $frsfp = new FRSPackageFactory($group);
794 if ($frsfp && is_object($frsfp) && !$frsfp->isError()) {
795 $frspIds = $frsfp->getAllPackagesIds();
796 foreach ($frspIds as $frspId) {
797 $frsDump['package'][] = $this->packageDump($frspId, 'return');
800 $frsDump['error'][] = _('Unable to get FRS for group id')._(': ').$group_id;
803 $frsDump['error'][] = _('FRS not enabled for group id')._(': ').$group_id;
806 $frsDump['error'][] = _('Unable to get group id')._(': ').$group_id;
809 $this->print_result($frsDump, $format);
813 function packageDump($packageid, $format = 'json') {
814 $packageDump['id'] = $packageid;
815 $package = frspackage_get_object($packageid);
816 if ($package && is_object($package) && !$package->isError()) {
817 unset($package->Group);
818 $packageDump['setup'] = (array)$package;
819 $frsrs = $package->getReleases();
820 $packageDump['setup']['package_releases'] = array();
821 foreach ($frsrs as $frsr) {
822 unset($frsr->FRSPackage);
823 $packageDump['setup']['package_releases'][] = $frsr;
825 $packageDump['monitor'] = $package->getMonitorIds();
827 $packageDump['error'][] = _('Unable to get package id')._(': ').$packageid;
830 $this->print_result($packageDump, $format);
834 function releaseDump($releaseid, $format = 'json') {
835 $releaseDump['id'] = $releaseid;
836 $release = frsrelease_get_object($releaseid);
837 if ($release && is_object($release) && !$release->isError()) {
838 unset($release->FRSPackage);
839 $releaseDump['setup'] = $release;
841 $releaseDump['error'][] = _('Unable to get release id')._(': ').$releaseid;
844 $this->print_result($releaseDump, $format);
848 function pmDump($projectgroupid, $format = 'json') {
849 $pmDump['id'] = $projectgroupid;
850 $pg = projectgroup_get_object($projectgroupid);
851 if ($pg && is_object($pg) && !$pg->isError()) {
853 $pmDump['setup'] = (array)$pg;
855 $pmDump['error'][] = _('Unable to get project group id')._(': ').$projectgroupid;
858 $this->print_result($pmDump, $format);
862 function print_result($arrayDump, $format = 'json') {
863 if (in_array($format, array('json', 'raw', 'return'))) {
866 $arrayDump['error'][] = _('Unknown format. Fallback to raw');
874 echo json_encode($arrayDump, JSON_PRETTY_PRINT)."\n";
882 function loadFile($file, $format) {
883 if (!is_file($file)) {
884 echo _('Unable to load file')._(': ').$file;
887 if (!in_array($format, array('json', 'raw'))) {
888 echo _('Wrong file format')._('? ').$format;
891 $stream_ori = file_get_contents($file);
892 if ($format == 'json') {
893 $stream = json_decode($stream_ori, true);
895 $stream = $stream_ori;
901 function getMappingId($idtofind, $objecttofind) {
902 global $importRefMapping;
903 if (isset($importRefMapping[$objecttofind][$idtofind])) {
904 return $importRefMapping[$objecttofind][$idtofind];
906 //not found, return the idtofind.
911 function createSubfile($filename, $data, $format) {
912 if ($format == 'json') {
913 $stream = json_encode($data, JSON_PRETTY_PRINT);
917 file_put_contents($filename, $stream);
923 if (count($argv) >= 3) {
926 if (count($argv) >= 3) {
928 for ($i = 3; $i < count($argv); $i++) {
929 $params[$j] = $argv[$i];
938 $ctl = new CliActions();
939 if (method_exists($ctl, $action)) {
940 if (isset($params[0])) {
941 $ctl->$action($name, $params[0]);
943 $ctl->$action($name);