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.'include/User.class.php';
29 require_once $gfcommon.'docman/DocumentReviewFactory.class.php';
30 require_once $gfcommon.'frs/FRSManager.class.php';
31 require_once $gfcommon.'tracker/ArtifactFactory.class.php';
32 require_once $gfcommon.'tracker/ArtifactTypeFactory.class.php';
33 require_once $gfcommon.'tracker/EffortUnitFactory.class.php';
36 function help($method = null) {
37 $methods = join('|', get_class_methods($this));
38 $dumpFormatInfo = "the following output formats are available:\n".
40 " pretty json formated string output\n".
41 " - raw: (default)\n".
42 " standard PHP array print_r format\n";
43 $importFormatInfo = "The <file> must contain the exact information to import.\n".
44 "Best practice is to reuse the result of an export and modify it.\n".
45 "Use getZipDump function to get binary organization sample.\n";
48 echo "Use: .../forge help ($methods)\n";
49 echo "to get detail on each command\n";
51 case 'pluginActivate':
52 echo "Use: .../forge pluginActivate <pluginName>\n";
53 echo "to activate the <pluginName> plugin\n";
55 case 'pluginDeactivate':
56 echo "Use: .../forge pluginDeactivate <pluginName>\n";
57 echo "to deactivate the <pluginName> plugin\n";
60 echo "Use: .../forge artifactDump <aid> [json|raw]\n";
61 echo "to dump an artifact from a specific tracker of a project.\n";
64 case 'artifactImport':
65 echo "Use: .../forge artifactImport <file> [json|raw]\n";
66 echo "to import an artifact.\n";
67 echo $dumpFormatInfo.$importFormatInfo;
70 echo "Use: .../forge trackerDump <atid> [json|raw]\n";
71 echo "to dump a tracker from a specific project.\n";
75 echo "Use: .../forge trackerImport <file> [json|raw]\n";
76 echo "to import a tracker and all his elements.\n";
77 echo $dumpFormatInfo.$importFormatInfo;
80 echo "Use: .../forge documentDump <docid> [json|raw]\n";
81 echo "to dump a document from a specific project.\n";
84 case 'documentImport':
85 echo "Use: .../forge documentImport <file> [json|raw]\n";
86 echo "to import a document.\n";
87 echo $dumpFormatInfo.$importFormatInfo;
90 echo "Use: .../forge docgroupDump <docgroupid> [json|raw]\n";
91 echo "to dump a document group (folder) from a specific project.\n";
94 case 'docgroupImport':
95 echo "Use: .../forge docgroupImport <file> [json|raw]\n";
96 echo "to import a document group (folder) and all his elements.\n";
97 echo $dumpFormatInfo.$importFormatInfo;
100 echo "Use: .../forge docmanDump <groupid> [json|raw]\n";
101 echo "to dump docman from a specific project.\n";
102 echo $dumpFormatInfo;
105 echo "Use: .../forge docmanImport <file> [json|raw]\n";
106 echo "to import a docman setup and all his elements.\n";
107 echo $dumpFormatInfo.$importFormatInfo;
110 echo "Use: .../forge releaseDump <releaseid> [json|raw]\n";
111 echo "to dump a spectific FRS release from a specific project.\n";
112 echo $dumpFormatInfo;
114 case 'releaseImport':
115 echo "Use: .../forge releaseImport <file> [json|raw]\n";
116 echo "to import a specific FRS release and all his elements into a package.\n";
117 echo $dumpFormatInfo.$importFormatInfo;
120 echo "Use: .../forge packageDump <packageid> [json|raw]\n";
121 echo "to dump a spectific FRS package from a specific project.\n";
122 echo $dumpFormatInfo;
124 case 'packageImport':
125 echo "Use: .../forge packageImport <file> [json|raw]\n";
126 echo "to import a specific FRS package and all his elements.\n";
127 echo $dumpFormatInfo.$importFormatInfo;
130 echo "Use: .../forge frsDump <groupid> [json|raw]\n";
131 echo "to dump FRS from a specific project.\n";
132 echo $dumpFormatInfo;
135 echo "Use: .../forge frsImport <file> [json|raw]\n";
136 echo "to import a full FRS setup and all his elements.\n";
137 echo $dumpFormatInfo.$importFormatInfo;
140 echo "Use: .../forge pmDump <groupid> [json|raw]\n";
141 echo "to dump Project Management (tasks) from a specific project.\n";
142 echo $dumpFormatInfo;
145 echo "Use: .../forge surveyDump <surveyid> [json|raw]\n";
146 echo "to dump a specific survey from a specific project.\n";
147 echo $dumpFormatInfo;
150 echo "Use: .../forge groupDump <groupid> [json|raw]\n";
151 echo "to dump a group.\n";
152 echo $dumpFormatInfo;
155 echo "Use: .../forge groupImport <file> [json|raw]\n";
156 echo "to import a full group and all his elements.\n";
157 echo $dumpFormatInfo.$importFormatInfo;
160 echo "Use: .../forge userDump <user_id> [json|raw]\n";
161 echo "to dump an user from the forge.\n";
162 echo $dumpFormatInfo;
165 echo "Use: .../forge userImport <file> [json|raw]\n";
166 echo "to import an user.\n";
167 echo $dumpFormatInfo.$importFormatInfo;
170 echo "Use: .../forge forumDump <forum_id> [json|raw]\n";
171 echo "to dump a forum from the specific project.\n";
172 echo $dumpFormatInfo;
175 echo "Use: .../forge getDataDump file [json|raw]\n";
176 echo "to generate a zip file that includes all data based on parameter file.\n";
177 echo "The file can be generated by using other Dump functions such as groupDump.\n";
180 echo "Usage: .../forge ($methods) [arguments...]\n" ;
181 echo "Get more info use: .../forge help help\n";
186 function pluginActivate($name) {
187 $pm = plugin_manager_get_object();
188 $pm->activate($name);
189 $pm->LoadPlugin($name);
190 $plugin = $pm->GetPluginObject($name);
194 function pluginDeactivate($name) {
195 $pm = plugin_manager_get_object();
196 $pm->deactivate($name);
199 function getZipDump($file, $format = 'json') {
200 $stream = $this->loadFile($file, $format);
205 $zipfile = 'fusionforge-zipDump-'.$time.'.zip';
207 $zip = new ZipArchive();
208 if($zip->open($zipfile, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== true) {
209 echo _('Unable to create zip file')._(': ').$zipfile;
213 function copyStorageRef(&$value, $key) {
215 if ($key == 'storageref' && $value != null) {
216 if (is_file($value) && is_readable($value)) {
217 $localname = str_replace(forge_get_config('data_path').'/', '', $value);
218 $zip->addFile($value, $localname);
226 array_walk_recursive($stream, 'copyStorageRef');
227 if ($format == 'json') {
228 $stream = json_encode($stream, JSON_PRETTY_PRINT);
230 file_put_contents('parameter.'.$format, $stream);
231 $zip->addFile('parameter.'.$format, basename('parameter.'.$format));
233 @unlink('parameter.'.$format);
234 return file_exists($zipfile);
237 function artifactDump($aid, $format = 'json') {
238 $artifactDump['id'] = $aid;
239 $artf = artifact_get_object($aid);
240 if ($artf && is_object($artf) && !$artf->isError()) {
241 $artifactDump = (array)$artf;
242 unset($artifactDump['ArtifactType']);
243 $artifactDump['history'] = array();
244 $hist = $artf->getHistory();
245 if (db_numrows($hist) > 0) {
246 while ($arr = db_fetch_array($hist, PGSQL_ASSOC)) {
247 $artifactDump['history'][] = $arr;
250 $artifactDump['monitor'] = $artf->getMonitorIds();
251 $artifactDump['messages'] = array();
252 $messages = $artf->getMessages();
253 if (db_numrows($messages) > 0) {
254 while ($arr = db_fetch_array($messages, PGSQL_ASSOC)) {
255 $artifactDump['messages'][] = $arr;
258 $files = $artf->getFiles();
259 foreach ($files as $key => $file) {
260 unset($file->Artifact);
261 $artifactDump['files'][$key] = (array)$file;
262 $artifactDump['files'][$key]['storageref'] = $file->getFile();
264 $artifactDump['relatedtasks'] = array();
265 $tasks = $artf->getRelatedTasks();
266 if (db_numrows($tasks) > 0) {
267 while ($arr = db_fetch_array($tasks, PGSQL_ASSOC)) {
268 $artifactDump['relatedtasks'][] = $arr;
271 $artifactDump['votes'] = $artf->getVotes();
272 $extra_field_data = $artf->getExtraFieldDataText();
273 $extra_field_element_ids = $artf->getExtraFieldData();
274 if (is_array($extra_field_element_ids)) {
275 foreach ($extra_field_element_ids as $key => $extra_field_element_id) {
276 if (isset($extra_field_data[$key])) {
277 $extra_field_data[$key]['element_id'] = $extra_field_element_id;
281 $artifactDump['extra_field_data'] = $extra_field_data;
283 $artifactDump['error'][] = _('Unable to get artifact id')._(': ').$aid;
285 ksort($artifactDump);
286 $this->print_result($artifactDump, $format);
287 return $artifactDump;
290 function artifactImport($file, $format = 'json') {
291 global $importRefMapping;
292 $stream = $this->loadFile($file, $format);
296 $group_artifact_id = $this->getMappingId($stream['data_array']['group_artifact_id'], 'artifact_type');
297 $at = artifactType_get_object($group_artifact_id);
298 if ($at && is_object($at) && !$at->isError()) {
300 $artf = new Artifact($at);
301 $assigned_to = $this->getMappingId($stream['data_array']['assigned_to'], 'user');
302 $extra_fields = array();
303 if (isset($stream['extra_field_data']) && is_array($stream['extra_field_data'])) {
304 foreach ($stream['extra_field_data'] as $key => $extra_field_data) {
305 if (isset($extra_field_data['element_id']) && isset($extra_field_data['type'])) {
306 $efid = $this->getMappingId($key, 'extrafield');
307 if ($extra_field_data['type'] == ARTIFACT_EXTRAFIELDTYPE_DATETIME) {
308 $extra_fields[$efid] = date(_('Y-m-d H:i'), $extra_field_data['value']);
310 if (!is_array($extra_field_data['element_id'])) {
311 $elid = $this->getMappingId($extra_field_data['element_id'], 'extrafield_element');
315 $extra_fields[$efid] = $elid;
320 $importData['user'] = $this->getMappingId($stream['data_array']['submitted_by'], 'user');
321 $importData['nopermcheck'] = true;
322 $importData['nonotice'] = true;
323 $importData['time'] = $stream['data_array']['open_date'];
324 if (!$artf->create($stream['data_array']['summary'], $stream['data_array']['details'], $assigned_to, $stream['data_array']['priority'], $extra_fields, $importData)) {
325 echo $artf->getErrorMessage()."\n";
329 $importRefMapping['artifact'][$stream['data_array']['artifact_id']] = $artf->getID();
330 if (isset($stream['files']) && is_array($stream['files'])) {
332 foreach ($stream['files'] as $file) {
333 if (isset($file['storageref']) && is_file($path.'/'.$file['storageref'])) {
334 $filedataname = $path.'/'.$file['storageref'];
335 if (function_exists('finfo_open')) {
336 $finfo = finfo_open(FILEINFO_MIME_TYPE);
337 $filedatatype = finfo_file($finfo, $filedataname);
339 $filedatatype = $file['data_array']['filetype'];
341 $af = new ArtifactFile($artf);
342 $importFileData['user'] = $this->getMappingId($file['data_array']['submitted_by'], 'user');
343 $importFileData['time'] = $file['data_array']['adddate'];
344 if (!$af->create($file['data_array']['filename'], $filedatatype, $file['data_array']['filesize'], $filedataname, $file['data_array']['description'], $importData)) {
345 echo $af->getErrorMessage()."\n";
352 if (isset($stream['messages']) && is_array($stream['messages'])) {
353 foreach ($stream['messages'] as $message) {
354 $am = new ArtifactMessage($artf);
355 $importMessageData['user'] = $this->getMappingId($message['user_id'], 'user');
356 $importData['nopermcheck'] = true;
357 $importData['nonotice'] = true;
358 $importData['time'] = $message['adddate'];
359 $body = $this->parseStringForReference($message['body']);
360 if (!$am->create($body, false, $importMessageData)) {
361 echo $am->getErrorMessage()."\n";
368 echo _('Artifact injected')."\n";
371 echo _('Unable to get tracker to inject artifact')._(': ').$group_artifact_id."\n";
376 function groupDump($lgroup_id, $format = 'json') {
377 // that is ugly... group_id is used as global var. it needs to be defined.
379 $group_id = $lgroup_id;
380 $groupDump['id'] = $group_id;
381 $group = group_get_object($group_id);
382 if ($group && is_object($group) && !$group->isError()) {
383 $groupDump['setup'] = (array)$group;
384 $groupDump['setup']['membersArr'] = $group->getMembers(false);
385 $groupDump['setup']['roles'] = $group->getRoles();
386 foreach ($groupDump['setup']['roles'] as $role) {
387 $users = $role->getUsers();
389 $role->userids = array();
390 foreach ($users as $user) {
391 $role->userids[] = $user->getID();
394 $effortUnitSet = new EffortUnitSet($group, $group->getEffortUnitSet());
395 $unitFactory = new EffortUnitFactory($effortUnitSet);
396 $groupDump['setup']['units_set'] = $unitFactory->getUnitsData();
397 $groupDump['setup']['homepage'] = $group->getWidgetLayoutConfig();
398 if ($group->usesDocman()) {
399 $groupDump['docman'] = $this->docmanDump($group_id, 'return');
401 if ($group->usesTracker()) {
402 $groupDump['trackers'] = array();
403 $atf = new ArtifactTypeFactory($group);
404 $atid_arr = $atf->getAllArtifactTypeIds();
405 foreach ($atid_arr as $atid) {
406 $groupDump['trackers'][] = $this->trackerDump($atid, 'return');
409 if ($group->usesForum()) {
410 $groupDump['forums'] = array();
411 $ff = new ForumFactory($group);
412 $ffid_arr = $ff->getAllForumIds();
413 foreach ($ffid_arr as $ffid) {
414 $groupDump['forums'][] = $this->forumDump($ffid, 'return');
417 if ($group->usesFRS()) {
418 $groupDump['frs'] = $this->frsDump($group_id, 'return');
420 if ($group->usesNews()) {
421 $groupDump['news'] = array();
422 $resultdb = db_query_params('SELECT forum_id FROM news_bytes WHERE news_bytes.group_id = $1',
425 if ($resultdb && db_numrows($resultdb)) {
426 $forumIds = util_result_column_to_array($resultdb);
428 foreach ($forumIds as $forumId) {
429 $groupDump['news'][] = $this->forumDump($forumId, 'return');
432 if ($group->usesSurvey()) {
433 $groupDump['surveys'] = array();
434 $sf = new SurveyFactory($group);
435 $sfid_arr = $sf->getSurveysIds();
436 foreach ($sfid_arr as $sfid) {
437 $groupDump['surveys'][] = $this->surveyDump($sfid, 'return');
440 if ($group->usesPM()) {
441 $groupDump['pm'] = array();
442 $pgf = new ProjectGroupFactory($group);
443 $pgfid_arr = $pgf->getAllProjectGroupIds();
444 foreach ($pgfid_arr as $pgfid) {
445 $groupDump['pm'][] = $this->pmDump($pgfid, 'return');
448 plugin_hook_by_reference('pluginDump', $groupDump);
450 $groupDump['error'][] = _('Unable to get group id')._(': ').$group_id;
453 $this->print_result($groupDump, $format);
456 function groupImport($file, $format = 'json') {
457 global $importRefMapping;
458 $stream = $this->loadFile($file, $format);
463 if (isset($stream['setup']['membersArr']) && is_array($stream['setup']['membersArr'])) {
464 foreach ($stream['setup']['membersArr'] as $member) {
465 $filename = 'userDump-'.$member['data_array']['user_id'].'.'.$format;
466 $this->createSubfile($filename, $member, $format);
467 if (!$this->userImport($filename, $format)) {
468 echo _('Unable to inject member')."\n";
475 $new_group = new Group();
476 if ($new_group && is_object($new_group) && !$new_group->isError()) {
477 //need to find a admin user
478 if (isset($stream['setup']['roles']) && is_array($stream['setup']['roles'])) {
479 foreach ($stream['setup']['roles'] as $role) {
480 if (isset($role['perms_array']['project_admin'][$stream['setup']['data_array']['group_id']]) && $role['perms_array']['project_admin'][$stream['setup']['data_array']['group_id']]) {
481 if (isset($role['userids']) && is_array($role['userids'])) {
482 foreach ($role['userids'] as $uid) {
483 $mappeduid = $this->getMappingId($uid, 'user');
484 $adminUser = user_get_object($mappeduid);
485 if ($adminUser && is_object($adminUser) && !$adminUser->isError()) {
493 if (!isset($adminUser)) {
494 echo _('Warning')._(': ')._('No admin found. Use default forge admin')."\n";
495 $admins = RBACEngine::getInstance()->getUsersByAllowedAction("forge_admin", -1);
496 $adminUser = $admins[0];
498 if (isset($stream['setup']['data_array']['unix_box'])) {
499 $unix_box = $stream['setup']['data_array']['unix_box'];
501 $unix_box = 'shell1';
503 if (isset($stream['setup']['data_array']['scm_box'])) {
504 $scm_box = $stream['setup']['data_array']['scm_box'];
508 if (isset($stream['setup']['data_array']['scm_box'])) {
509 $scm_box = $stream['setup']['data_array']['scm_box'];
513 if (isset($stream['setup']['data_array']['register_time'])) {
514 $createtimestamp = $stream['setup']['data_array']['register_time'];
516 $createtimestamp = null;
518 if (!$new_group->create($adminUser, $stream['setup']['data_array']['group_name'], $stream['setup']['data_array']['unix_group_name'], $stream['setup']['data_array']['short_description'], $stream['setup']['data_array']['register_purpose'], $unix_box,
519 $scm_box, false, 0, $createtimestamp)) {
520 echo $new_group->getErrorMessage()."\n";
524 $importRefMapping['group'][$stream['setup']['data_array']['group_id']] = $new_group->getID();
526 if (isset($stream['setup']['data_array']['is_template']) && $stream['setup']['data_array']['is_template']) {
527 $new_group->setAsTemplate($stream['setup']['data_array']['is_template']);
529 //add users as members to the project
530 $defrole = new Role($new_group);
531 $adminperms = array('project_admin' => array ($new_group->getID() => 1));
532 $default_role_id = (int)$defrole->create('TOBEDELETED', $adminperms, true);
533 if (isset($stream['setup']['membersArr']) && is_array($stream['setup']['membersArr'])) {
534 foreach ($stream['setup']['membersArr'] as $member) {
535 $muid = (int)$this->getMappingId($member['data_array']['user_id'], 'user');
536 if (!$new_group->addUser($muid, $default_role_id)) {
537 echo sprintf(_('Unable to add user to group with %s role'), 'TOBEDELETED')."\n";
541 echo sprintf(_('User %d added to group with role'), $muid)._(': ').'TOBEDELETED'."\n";
545 //inject trackers if any
546 if (forge_get_config('use_tracker')) {
547 if (isset($stream['setup']['data_array']['use_tracker'])) {
548 $new_group->setUseTracker($stream['setup']['data_array']['use_tracker']);
549 if ($new_group->usesTracker() && isset($stream['trackers']) && is_array($stream['trackers'])) {
550 foreach ($stream['trackers'] as $tracker) {
551 $filename = 'trackerDump-'.$tracker['setup']['group_artifact_id'].'.'.$format;
552 $this->createSubfile($filename, $tracker, $format);
553 if (!$this->trackerImport($filename, $format)) {
554 echo _('Unable to inject tracker')."\n";
562 $new_group->setUseTracker(false);
565 //inject docman if any
566 if (forge_get_config('use_docman')) {
567 if (isset($stream['setup']['data_array']['use_docman'])) {
568 $new_group->setUseDocman($stream['setup']['data_array']['use_docman']);
569 if ($new_group->usesDocman() && isset($stream['docman'])) {
570 $filename = 'docmanDump-'.$stream['setup']['data_array']['group_id'].'.'.$format;
571 $this->createSubfile($filename, $stream['docman'], $format);
572 if (!$this->docmanImport($filename, $format)) {
573 echo _('Unable to inject docman')."\n";
580 $new_group->setUseDocman(false);
583 // enable SCM if requested
584 if (forge_get_config('use_scm')) {
585 if (isset($stream['setup']['data_array']['use_scm'])) {
586 $new_group->setUseSCM($stream['setup']['data_array']['use_scm']);
588 $new_group->setUseSCM(false);
591 // enable activity if requested
592 if (forge_get_config('use_activity')) {
593 if (isset($stream['setup']['data_array']['use_activity'])) {
594 $new_group->setUseActivity($stream['setup']['data_array']['use_activity']);
596 $new_group->setUseActivity(false);
600 if (forge_get_config('use_frs')) {
601 if (isset($stream['setup']['data_array']['use_frs'])) {
602 $new_group->setUseFRS($stream['setup']['data_array']['use_frs']);
603 if ($new_group->usesFRS() && isset($stream['frs'])) {
604 //TODO: do the injection :-)
607 $new_group->setUseFRS(false);
610 //inject forum if any
611 if (forge_get_config('use_forum')) {
612 if (isset($stream['setup']['data_array']['use_frs'])) {
613 $new_group->setUseForum($stream['setup']['data_array']['use_frs']);
614 if ($new_group->usesForum() && isset($stream['frs']) && is_array($stream['forums'])) {
615 //TODO: do the injection :-)
618 $new_group->setUseForum(false);
621 // recompute if any association with activated & injected features.
622 // association between doc - artifact - frs release
623 if (forge_get_config('use_object_associations')) {
624 if (forge_get_config('use_docman') && isset($stream['docman']['data']) && is_array($stream['docman']['data'])) {
625 foreach ($stream['docman']['data'] as $stream_docgroup) {
626 if (isset($stream_docgroup['files']) && is_array($stream_docgroup['files'])) {
627 foreach ($stream_docgroup['files'] as $stream_file) {
628 // we do not compute associatedFromArray, since it will be compute by the related element
629 if (isset($stream_file['associatedToArray']) && is_array($stream_file['associatedToArray'])) {
630 $ndocid = $this->getMappingId($stream_file['data_array']['docid'], 'document');
631 $ndocObject = document_get_object($ndocid);
632 foreach ($stream_file['associatedToArray'] as $associatedToElement) {
633 if (isset($associatedToElement['Artifact']) && forge_get_config('use_tracker') && $new_group->usesTracker()) {
636 if (isset($associatedToElement['Document'][$stream['setup']['data_array']['group_id']]) && forge_get_config('use_docman') && $new_group->usesTracker() && is_array($associatedToElement['Document'][$stream['setup']['data_array']['group_id']])) {
637 foreach ($associatedToElement['Document'][$stream['setup']['data_array']['group_id']] as $refdocid) {
638 $nrefdocid = $this->getMappingId($refdocid, 'document');
639 $nrefdocObject = document_get_object($nrefdocid);
640 if (!$ndocObject->addAssociationTo($nrefdocObject)) {
641 echo $ndocObject->getErrorMessage()."\n";
647 if (isset($associatedToElement['FRSRelease']) && forge_get_config('use_frs') && $new_group->usesFRS() && is_array($associatedToElement['FRSRelease'])) {
658 if (isset($stream['setup']['homepage'])) {
659 $lm = new WidgetLayoutManager();
660 if (!$lm->createLayoutForProjectFromArray($this->getMappingId($stream['setup']['data_array']['group_id'], 'group'), $stream['setup']['homepage'])) {
661 echo _('Unable to create group homepage layout')."\n";
666 //add new roles and link users to roles
667 //delete initial default role!
668 if (isset($stream['setup']['roles']) && is_array($stream['setup']['roles'])) {
669 foreach($stream['setup']['roles'] as $role_def) {
670 $role = new Role($new_group);
672 if (isset($role_def['perms_array'])) {
673 foreach ($role_def['perms_array'] as $key => $value) {
675 case 'project_admin':
681 case 'tracker_admin':
687 $perms[$key][$this->getMappingId($stream['setup']['data_array']['group_id'], 'group')] = current($value);
690 // foreach ($value as $frsp_key => $frsp_val) {
691 // $perms[$key][$this->getMappingId($frsp_key, 'package')] = $frsp_val;
695 // foreach ($value as $fr_key => $fr_val) {
696 // $perms[$key][$this->getMappingId($fr_key, 'forum')] = $fr_val;
700 foreach ($value as $at_key => $at_val) {
701 $perms[$key][$this->getMappingId($at_key, 'tracker')] = $at_val;
705 // foreach ($value as $pm_key => $pm_val) {
706 // $perms[$key][$this->getMappingId($pm_key, 'subproject')] = $pm_val;
712 if (isset($role_def['data_array']['role_class']) && $role_def['data_array']['role_class'] == 1) {
713 if (!$role->create($role_def['data_array']['role_name'], $perms, true)) {
714 echo $role->getErrorMessage()."\n";
718 if (isset($role_def['userids']) && is_array($role_def['userids'])) {
719 foreach ($role_def['userids'] as $ruserid) {
720 $nruserid = (int)$this->getMappingId($ruserid, 'user');
721 if (!$new_group->addUser($nruserid, $role->getID())) {
722 echo _('Unable to add user to group with role')._(': ').$role_def['data_array']['role_name']."\n";
726 echo sprintf(_('User %d added to group with role'), $nruserid)._(': ').$role_def['data_array']['role_name']."\n";
733 if (isset($stream['setup']['membersArr']) && is_array($stream['setup']['membersArr'])) {
734 $userObjectArr = array();
735 foreach ($stream['setup']['membersArr'] as $member) {
736 $muid = $this->getMappingId($member['data_array']['user_id'], 'user');
737 $userObjectArr[] = user_get_object($muid);
740 $defrole->removeUsers($userObjectArr);
743 // set the final status
744 if (isset($stream['setup']['data_array']['status']) && $stream['setup']['data_array']['status'] == 'A') {
745 $new_group->approve($adminUser);
747 echo _('Group imported.')."\n";
752 echo _('Unable to get group object to inject group')."\n";
758 function userDump($userid, $format = 'json') {
759 $user = user_get_object($userid);
760 if ($user && is_object($user) && !$user->isError()) {
761 $userDump = (array)$user;
762 unset($userDump['Group']);
764 $userDump['error'][] = _('Unable to get user id')._(': ').$userid;
766 $userDump['id'] = $userid;
768 $this->print_result($userDump, $format);
773 function userImport($file, $format = 'json') {
774 global $importRefMapping;
775 $stream = $this->loadFile($file, $format);
779 $ffuser = user_get_object_by_name($stream['data_array']['user_name']);
780 if ($ffuser && is_object($ffuser) && !$ffuser->isError()) {
781 $importRefMapping['user'][$stream['data_array']['user_id']] = $ffuser->getID();
782 echo sprintf(_('User %s already exists. Mapping retrieved.'), $stream['data_array']['user_name'])."\n";
785 $ffuser = new FFUser();
786 if ($ffuser && is_object($ffuser) && !$ffuser->isError()) {
788 // need to check for each value to test if isset else set default value
789 if (isset($stream['data_array']['password'])) {
790 $password = $stream['data_array']['password'];
792 $password = 'Inject123$';
794 if (isset($stream['data_array']['mail_siteupdates'])) {
795 $mail_siteupdates = $stream['data_array']['mail_siteupdates'];
797 $mail_siteupdates = 0;
799 if (isset($stream['data_array']['mail_va'])) {
800 $mail_va = $stream['data_array']['mail_va'];
804 if (isset($stream['data_array']['language'])) {
805 $language_id = $stream['data_array']['language'];
809 if (isset($stream['data_array']['timezone'])) {
810 $timezone = $stream['data_array']['timezone'];
814 if (isset($stream['data_array']['theme_id'])) {
815 $theme_id = $stream['data_array']['theme_id'];
817 $theme_id = getThemeIdFromName(forge_get_config('default_theme'));
819 if (isset($stream['data_array']['unix_box'])) {
820 $unix_box = $stream['data_array']['unix_box'];
824 if (isset($stream['data_array']['address'])) {
825 $address = $stream['data_array']['address'];
829 if (isset($stream['data_array']['address2'])) {
830 $address2 = $stream['data_array']['address2'];
834 if (isset($stream['data_array']['phone'])) {
835 $phone = $stream['data_array']['phone'];
839 if (isset($stream['data_array']['fax'])) {
840 $fax = $stream['data_array']['fax'];
844 if (isset($stream['data_array']['title'])) {
845 $title = $stream['data_array']['title'];
849 if (isset($stream['data_array']['ccode'])) {
850 $ccode = $stream['data_array']['ccode'];
854 if (isset($stream['data_array']['send_mail'])) {
855 $send_mail = $stream['data_array']['send_mail'];
859 if (isset($stream['data_array']['tooltips'])) {
860 $tooltips = $stream['data_array']['tooltips'];
864 if (isset($stream['data_array']['add_date'])) {
865 $createtimestamp = $stream['data_array']['add_date'];
867 $createtimestamp = null;
869 if (!$ffuser->create($stream['data_array']['user_name'], $stream['data_array']['firstname'], $stream['data_array']['lastname'], $password, $password,
870 $stream['data_array']['email'], $mail_siteupdates, $mail_va, $language_id, $timezone, null, null, $theme_id, $unix_box,
871 $address, $address2, $phone, $fax, $title, $ccode, $send_mail, $tooltips)) {
872 echo $ffuser->getErrorMessage()."\n";
876 if (isset($stream['data_array']['user_id'])) {
877 $importRefMapping['user'][$stream['data_array']['user_id']] = $ffuser->getID();
879 echo _('User injected')."\n";
883 echo _('Unable to get user object to inject user')."\n";
888 function surveyDump($sid, $format = 'json') {
889 $surveyDump['id'] = $sid;
890 $survey = survey_get_object($sid);
891 if ($survey && is_object($survey) && !$survey->isError()) {
892 $survey->getQuestionInstances();
893 $surveyDump['setup'] = (array)$survey;
894 unset($surveyDump['setup']['Group']);
895 foreach($surveyDump['setup']['all_question_array'] as $question) {
896 unset($question->Group);
899 $surveyDump['error'][] = _('Unable to get survey id')._(': ').$sid;
902 $this->print_result($surveyDump, $format);
906 function forumDump($fid, $format = 'json') {
907 $forumDump['id'] = $fid;
908 $forum = forum_get_object($fid);
909 if ($forum && is_object($forum) && !$forum->isError()) {
910 unset($forum->Group);
911 $forumDump['setup'] = (array)$forum;
913 $forumDump['error'][] = _('Unable to get forum id')._(': ').$fid;
916 $this->print_result($forumDump, $format);
920 function trackerDump($atid, $format = 'json') {
921 $trackerDump['id'] = $atid;
922 $at = artifactType_get_object($atid);
923 if ($at && is_object($at) && !$at->isError()) {
924 $trackerDump['setup'] = $at->getSettings();
925 $effortUnitSet = new EffortUnitSet($at, $at->getEffortUnitSet());
926 $unitFactory = new EffortUnitFactory($effortUnitSet);
927 $trackerDump['setup']['units_set'] = $unitFactory->getUnitsData();
928 $af = new ArtifactFactory($at);
929 if ($af && is_object($af) && !$at->isError()) {
930 $af->setup(0, '', '', 0, 'overwrite', false, false, array(), false);
931 $artifacts = $af->getArtifacts();
932 foreach ($artifacts as $artf) {
933 $trackerDump['data'][] = $this->artifactDump($artf->getID(), 'return');
935 $trackerDump['monitor'] = $at->getMonitorIds();
937 $trackerDump['error'][] = _('Unable to retrieve artifacts');
940 $trackerDump['error'][] = _('Unable to get tracker id')._(': ').$atid;
943 $this->print_result($trackerDump, $format);
947 function trackerImport($file, $format = 'json') {
948 global $importRefMapping;
949 $stream = $this->loadFile($file, $format);
953 $group_id = $this->getMappingId($stream['setup']['group_id'], 'group');
954 $group = group_get_object($group_id);
955 if ($group && is_object($group) && !$group->isError() && $group->usesTracker()) {
957 $at = new ArtifactType($group);
958 $due_period = $stream['setup']['due_period']/(60*60*24); //in days
959 if (!$at->create($stream['setup']['name'], $stream['setup']['description'], $stream['setup']['email_all_updates'], $stream['setup']['email_address'],
960 $due_period, 0, $stream['setup']['submit_instructions'], $stream['setup']['browse_instructions'])) {
961 echo $at->getErrorMessage()."\n";
965 $importRefMapping['artifact_type'][$stream['setup']['group_artifact_id']] = $at->getID();
966 if (isset($stream['setup']['extra_fields']) && is_array($stream['setup']['extra_fields'])) {
967 foreach ($stream['setup']['extra_fields'] as $extra_field) {
968 $ef = new ArtifactExtraField($at);
969 if (!$ef->create($extra_field['name'], $extra_field['field_type'], $extra_field['attribute1'], $extra_field['attribute2'],
970 $extra_field['is_required'], $extra_field['alias'], $extra_field['show100'], $extra_field['show100label'],
971 $extra_field['description'], $extra_field['pattern'], $extra_field['parent'], $extra_field['autoassign'],
972 $extra_field['is_hidden_on_submit'], $extra_field['is_disabled'])) {
973 echo $ef->getErrorMessage()."\n";
977 $importRefMapping['extrafield'][$extra_field['extra_field_id']] = $ef->getID();
978 if (isset($extra_field['available_values']) && is_array($extra_field['available_values'])) {
979 $clean_status = true;
980 foreach ($extra_field['available_values'] as $available_value) {
981 $efe = new ArtifactExtraFieldElement($ef);
982 //by default extrafield status is created with default values: 'Open' & 'Closed'
983 if ($clean_status && $ef->getType() == ARTIFACT_EXTRAFIELDTYPE_STATUS) {
984 $existingElements = $ef->getAvailableValues();
985 foreach($existingElements as $existingElement) {
986 $existingElement = new ArtifactExtraFieldElement($ef, $existingElement);
987 $existingElement->delete();
989 $clean_status = false;
991 if (!$efe->create($available_value['element_name'], $available_value['status_id'], $available_value['auto_assign_to'], $available_value['is_default'])) {
992 echo $efe->getErrorMessage()."\n";
996 $importRefMapping['extrafield_element'][$available_value['element_id']] = $efe->getID();
1001 if (isset($stream['setup']['browse_list'])) {
1002 $colids = explode(',', $stream['setup']['browse_list']);
1004 if (is_array($colids)) {
1005 foreach($colids as $colid) {
1006 $browse_list .= $this->getMappingId($colid, 'extrafield').',';
1009 $browse_list = substr($browse_list, 1, -1);
1010 if (strlen($browse_list)) {
1011 $at->setBrowseList($browse_list);
1014 if (isset($stream['setup']['use_tracker_widget_display'])) {
1015 $lm = new WidgetLayoutManager();
1016 // remap the extrafield ids with the new ones if any
1017 $artifact_layout = $stream['setup']['use_tracker_widget_display'];
1018 foreach ($artifact_layout['rows'] as &$row) {
1019 foreach($row['columns'] as &$column) {
1020 foreach ($column['contents'] as &$nwidget) {
1021 if ($nwidget['content']['id'] == 'trackercontent') {
1022 foreach ($nwidget['content']['layoutExtraFieldIDs'] as $efrkey => &$efrow) {
1023 foreach ($efrow as &$efcol) {
1025 $nkey = $this->getMappingId($key, 'extrafield');
1026 if ($nkey != $key) {
1027 $efcol[$nkey] = $efcol[$key];
1028 unset($efcol[$key]);
1036 if (!$lm->createLayoutForTrackerFromArray($this->getMappingId($stream['setup']['group_artifact_id'], 'artifact_type'), $artifact_layout)) {
1037 echo _('Unable to create tracker layout')."\n";
1042 if (isset($stream['data']) && is_array($stream['data'])) {
1043 foreach ($stream['data'] as $n_artifact) {
1044 $filename = 'artifactDump-'.$n_artifact['data_array']['artifact_id'].'.'.$format;
1045 $this->createSubfile($filename, $n_artifact, $format);
1046 if (!$this->artifactImport($filename, $format)) {
1047 echo _('Unable to inject child artifact')."\n";
1055 echo _('Tracker injected')."\n";
1058 echo _('Unable to get project to inject tracker')._(': ').$group_id."\n";
1063 function documentDump($docid, $format = 'json') {
1064 $doc = document_get_object($docid);
1065 if ($doc && is_object($doc) && !$doc->isError()) {
1066 $dvf = new DocumentVersionFactory($doc);
1067 $documentDump = (array)$doc;
1068 unset($documentDump['Group']);
1069 $documentDump['versions'] = $dvf->getVersions();
1070 $serialIDs = $dvf->getSerialIDs();
1071 $drf = new DocumentReviewFactory($doc);
1072 $documentDump['reviews'] = $drf->getReviews($serialIDs);
1073 $documentDump['monitor'] = $doc->getMonitorIds();
1075 $documentDump['error'][] = _('Unable to get document id')._(': ').$docid;
1077 $documentDump['id'] = $docid;
1078 ksort($documentDump);
1079 $this->print_result($documentDump, $format);
1080 return $documentDump;
1083 function documentImport($file, $format = 'json') {
1084 global $importRefMapping;
1085 $stream = $this->loadFile($file, $format);
1089 $group_id = $this->getMappingId($stream['data_array']['group_id'], 'group');
1090 $group = group_get_object($group_id);
1091 $importSerialIdRef = array();
1092 if ($group && is_object($group) && !$group->isError() && $group->usesDocman()) {
1094 $firstversion = true;
1096 foreach ($stream['versions'] as $key => $version) {
1097 if ($version['filetype'] != 'URL' && $version['storageref'] != null) {
1098 if (!is_file($path.'/'.$version['storageref'])) {
1099 echo $path.'/'.$version['storageref'].':'._('Invalid file name.')."\n";
1103 $filedataname = $path.'/'.$version['storageref'];
1104 if (function_exists('finfo_open')) {
1105 $finfo = finfo_open(FILEINFO_MIME_TYPE);
1106 $filedatatype = finfo_file($finfo, $filedataname);
1108 $filedatatype = 'application/binary';
1111 $filedatatype = $version['filetype'];
1115 $doc_group_id = $this->getMappingId($stream['data_array']['doc_group'], 'doc_group');
1116 $doc_group = documentgroup_get_object_byid($doc_group_id);
1117 if (!$doc_group || !is_object($doc_group) || $doc_group->isError()) {
1118 echo _('Invalid document group (folder)')._(': ').$doc_group_id."\n";
1122 $importData['user'] = $this->getMappingId($version['created_by'], 'user');
1123 $importData['nopermcheck'] = true;
1124 $importData['nonotice'] = true;
1125 $importData['time'] = $version['createdate'];
1126 if ($firstversion == true) {
1127 $d = new Document($group);
1128 if (!$d->create($version['filename'], $filedatatype, $filedataname, $doc_group_id, $version['title'], $version['description'], $stream['data_array']['stateid'], $version['vcomment'], $importData)) {
1129 echo $version['filename'].':'.$d->getErrorMessage()."\n";
1133 $firstversion = false;
1136 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'])) {
1137 echo $version['filename'].':'.$d->getErrorMessage()."\n";
1142 $dv = new DocumentVersion($d, $key + 1);
1143 $importSerialIdRef[$version['serial_id']] = $dv->getID();
1145 if ($d && !$d->isError()) {
1146 foreach($stream['reviews'] as $review) {
1147 $dr = new DocumentReview($d);
1148 $reviewmandatoryusers = array();
1149 $reviewoptionalusers = array();
1150 foreach($review['users'] as $reviewuser) {
1151 $userid = $this->getMappingId($reviewuser['userid'], 'user');
1152 if ($reviewuser['typeid'] == 1) {
1153 $reviewmandatoryusers[] = $userid;
1154 } elseif ($reviewuser['typeid'] == 2) {
1155 $reviewoptionalusers[] = $userid;
1158 $importData['user'] = $this->getMappingId($review['created_by'], 'user');
1159 $importData['startdate'] = $review['startdate'];
1160 $importData['enddate'] = $review['enddate'];
1161 $importData['nonotice'] = true;
1162 if (!$dr->create($importSerialIdRef[$review['serialid']], $review['title'], $review['description'], $review['enddate'], $reviewmandatoryusers, $reviewoptionalusers, false, $importData)) {
1163 echo $dr->getErrorMessage()."\n";
1167 foreach($review['comments'] as $comment) {
1168 $nc = new DocumentReviewComment($dr);
1169 if (!$nc->create($comment['data_array']['userid'], $dr->getID(), $comment['data_array']['rcomment'], $comment['data_array']['createdate'])) {
1170 echo $nc->getErrorMessage()."\n";
1174 if (isset($comment['attachment']['storageref']) && $comment['attachment']['storageref'] != null) {
1175 if (!$nc->attachFile($comment['attachment']['data_array']['filename'], $comment['attachment']['data_array']['filetype'], $comment['attachment']['data_array']['createdate'], $comment['attachment']['storageref'])) {
1176 echo $nc->getErrorMessage()."\n";
1187 $importRefMapping['document'][$stream['data_array']['docid']] = $d->getID();
1188 echo _('Document injected')."\n";
1191 echo _('Unable to get project to inject document')._(': ').$group_id."\n";
1196 function docgroupDump($docgroup_id, $format = 'json') {
1197 $docgroup = documentgroup_get_object_byid($docgroup_id);
1198 if ($docgroup && is_object($docgroup) && !$docgroup->isError()) {
1199 $dm = new DocumentManager($docgroup->getGroup());
1200 if ($dm && is_object($dm) && !$dm->isError()) {
1201 $docgroupDump = (array)$docgroup;
1202 unset($docgroupDump['Group']);
1203 $docgroupDump['subdocgroups'] = $dm->getTree($docgroup_id);
1204 $df = new DocumentFactory($docgroup->getGroup());
1205 $df->setDocGroupID($docgroup_id);
1206 $df->setStateID(array(1, 2, 3, 4, 5));
1207 $df->setOrder(array('docid'));
1208 $docgroupDump['files'] = (array)$df->getDocumentsWithVersions();
1210 $docgroupDump['error'][] = _('Unable to get document manager for docgroup id')._(': ').$docgroup_id;
1213 $docgroupDump['error'][] = _('Unable to get docgroup id')._(': ').$docgroup_id;
1215 $docgroupDump['id'] = $docgroup_id;
1216 ksort($docgroupDump);
1217 $this->print_result($docgroupDump, $format);
1218 return $docgroupDump;
1221 function docgroupImport($file, $format = 'json') {
1222 global $importRefMapping;
1223 $stream = $this->loadFile($file, $format);
1227 $group_id = $this->getMappingId($stream['data_array']['group_id'], 'group');
1228 $group = group_get_object($group_id);
1229 $importSerialIdRef = array();
1230 if ($group && is_object($group) && !$group->isError() && $group->usesDocman()) {
1232 $dg = new DocumentGroup($group);
1233 if ($stream['data_array']['groupname'] == '.trash') {
1234 $dm = new DocumentManager($group);
1235 $dg = documentgroup_get_object_byid($dm->getTrashID());
1236 if ($dg->isError()) {
1237 echo $dg->getErrorMessage()."\n";
1242 $parent_doc_group = (int)$this->getMappingId($stream['data_array']['parent_doc_group'], 'doc_group');
1243 if (!$dg->create($stream['data_array']['groupname'], $parent_doc_group, $stream['data_array']['stateid'], $stream['data_array']['createdate'])) {
1244 echo $dg->getErrorMessage()."\n";
1249 $importRefMapping['doc_group'][$stream['data_array']['doc_group']] = $dg->getID();
1250 if (isset($stream['subdocgroups']) && is_array($stream['subdocgroups'])) {
1251 foreach ($stream['subdocgroups'] as $subdocgroup) {
1252 $filename = 'docgroupDump-'.$subdocgroup['data_array']['doc_group'].'.'.$format;
1253 $this->createSubfile($filename, $subdocgroup, $format);
1254 if (!$this->docgroupImport($filename, $format)) {
1255 echo _('Unable to inject child docgroup')."\n";
1262 if (isset($stream['files']) && is_array($stream['files'])) {
1263 foreach ($stream['files'] as $file) {
1264 $filename = 'documentDump-'.$file['data_array']['docid'].'.'.$format;
1265 $this->createSubfile($filename, $file, $format);
1266 if (!$this->documentImport($filename, $format)) {
1267 echo _('Unable to inject child file')."\n";
1275 echo _('Document Group injected')."\n";
1278 echo _('Unable to get project to inject document group')._(': ').$group_id."\n";
1283 function docmanDump($group_id, $format = 'json') {
1284 $docmanDump = array();
1285 $group = group_get_object($group_id);
1286 if ($group && is_object($group) && !$group->isError()) {
1287 if ($group->usesDocman()) {
1288 $dm = new DocumentManager($group);
1289 if ($dm && is_object($dm) && !$dm->isError()) {
1290 $docmanDump['setup'] = $dm->getSettings();
1291 $docmanDump['data'] = $dm->getTree();
1293 $docmanDump['error'][] = _('Unable to get document manager for group id')._(': ').$group_id;
1296 $docmanDump['error'][] = _('Document manager not enabled for group id')._(': ').$group_id;
1299 $docmanDump['error'][] = _('Unable to get group id')._(': ').$group_id;
1302 $this->print_result($docmanDump, $format);
1306 function docmanImport($file, $format = 'json') {
1307 global $importRefMapping;
1308 $stream = $this->loadFile($file, $format);
1312 $group_id = $this->getMappingId($stream['setup']['group_id'], 'group');
1313 $group = group_get_object($group_id);
1314 if ($group && is_object($group) && !$group->isError() && $group->usesDocman()) {
1316 if (isset($stream['setup']['new_doc_address'])) {
1317 $group->setDocEmailAddress($stream['setup']['new_doc_address']);
1319 if (isset($stream['setup']['use_docman_search'])) {
1320 $group->setDocmanSearchStatus($stream['setup']['use_docman_search']);
1322 if (isset($stream['setup']['use_webdav'])) {
1323 $group->setDocmanWebdav($stream['setup']['use_webdav']);
1325 if (isset($stream['setup']['use_docman_create_online'])) {
1326 $group->setDocmanCreateOnlineStatus($stream['setup']['use_docman_create_online']);
1328 if (isset($stream['setup']['send_all_docs'])) {
1329 $group->setDocEmailAll($stream['setup']['send_all_docs']);
1331 if (isset($stream['data']) && is_array($stream['data'])) {
1332 foreach ($stream['data'] as $element) {
1333 $filename = 'docgroupDump-'.$element['data_array']['doc_group'].'.'.$format;
1334 $this->createSubfile($filename, $element, $format);
1335 if (!$this->docgroupImport($filename, $format)) {
1336 echo _('Unable to inject child element')."\n";
1344 echo _('Docman injected')."\n";
1347 echo _('Unable to get project to inject docman')._(': ').$group_id."\n";
1352 function frsDump($group_id, $format = 'json') {
1354 $group = group_get_object($group_id);
1355 if ($group && is_object($group) && !$group->isError()) {
1356 if ($group->usesFRS()) {
1357 $frsm = new FRSManager($group);
1358 $frsDump['setup'] = $frsm->getSettings();
1359 $frsfp = new FRSPackageFactory($group);
1360 if ($frsfp && is_object($frsfp) && !$frsfp->isError()) {
1361 $frspIds = $frsfp->getAllPackagesIds();
1362 foreach ($frspIds as $frspId) {
1363 $frsDump['package'][] = $this->packageDump($frspId, 'return');
1366 $frsDump['error'][] = _('Unable to get FRS for group id')._(': ').$group_id;
1369 $frsDump['error'][] = _('FRS not enabled for group id')._(': ').$group_id;
1372 $frsDump['error'][] = _('Unable to get group id')._(': ').$group_id;
1375 $this->print_result($frsDump, $format);
1379 function frsImport($file, $format = 'json') {
1380 global $importRefMapping;
1381 $stream = $this->loadFile($file, $format);
1385 $group_id = $this->getMappingId($stream['setup']['group_id'], 'group');
1386 $group = group_get_object($group_id);
1387 if ($group && is_object($group) && !$group->isError() && $group->usesDocman()) {
1389 if (isset($stream['setup']['new_frs_address'])) {
1390 $group->setFRSEmailAddress($stream['setup']['new_frs_address']);
1392 if (isset($stream['setup']['send_frs_docs'])) {
1393 $group->setFRSEmailAll($stream['setup']['send_frs_docs']);
1395 if (isset($stream['package']) && is_array($stream['package'])) {
1396 foreach ($stream['package'] as $element) {
1397 $filename = 'packageDump-'.$element['data_array']['package_id'].'.'.$format;
1398 $this->createSubfile($filename, $element, $format);
1399 if (!$this->packageImport($filename, $format)) {
1400 echo _('Unable to inject package element')."\n";
1408 echo _('FRS injected')."\n";
1411 echo _('Unable to get project to inject FRS')._(': ').$group_id."\n";
1415 function packageDump($packageid, $format = 'json') {
1416 $packageDump['id'] = $packageid;
1417 $package = frspackage_get_object($packageid);
1418 if ($package && is_object($package) && !$package->isError()) {
1419 unset($package->Group);
1420 $packageDump = (array)$package;
1421 $frsrs = $package->getReleases();
1422 $packageDump['package_releases'] = array();
1423 foreach ($frsrs as $frsr) {
1424 unset($frsr->FRSPackage);
1425 $packageDump['package_releases'][] = $frsr;
1427 $packageDump['monitor'] = $package->getMonitorIds();
1429 $packageDump['error'][] = _('Unable to get package id')._(': ').$packageid;
1431 ksort($packageDump);
1432 $this->print_result($packageDump, $format);
1433 return $packageDump;
1436 function packageImport($file, $format = 'json') {
1437 global $importRefMapping;
1438 $stream = $this->loadFile($file, $format);
1445 function releaseDump($releaseid, $format = 'json') {
1446 $releaseDump['id'] = $releaseid;
1447 $release = frsrelease_get_object($releaseid);
1448 if ($release && is_object($release) && !$release->isError()) {
1449 unset($release->FRSPackage);
1450 $releaseDump = (array)$release;
1452 $releaseDump['error'][] = _('Unable to get release id')._(': ').$releaseid;
1454 ksort($releaseDump);
1455 $this->print_result($releaseDump, $format);
1456 return $releaseDump;
1459 function releaseImport($file, $format = 'json') {
1460 global $importRefMapping;
1461 $stream = $this->loadFile($file, $format);
1468 function pmDump($projectgroupid, $format = 'json') {
1469 $pmDump['id'] = $projectgroupid;
1470 $pg = projectgroup_get_object($projectgroupid);
1471 if ($pg && is_object($pg) && !$pg->isError()) {
1473 $pmDump['setup'] = (array)$pg;
1475 $pmDump['error'][] = _('Unable to get project group id')._(': ').$projectgroupid;
1478 $this->print_result($pmDump, $format);
1482 private function print_result($arrayDump, $format = 'json') {
1483 if (in_array($format, array('json', 'raw', 'return'))) {
1486 $arrayDump['error'][] = _('Unknown format. Fallback to raw');
1494 echo json_encode($arrayDump, JSON_PRETTY_PRINT)."\n";
1498 print_r($arrayDump);
1502 private function loadFile($file, $format) {
1503 if (!is_file($file)) {
1504 echo _('Unable to load file')._(': ').$file;
1507 if (!in_array($format, array('json', 'raw'))) {
1508 echo _('Wrong file format')._('? ').$format;
1511 $stream_ori = file_get_contents($file);
1512 if ($format == 'json') {
1513 $stream = json_decode($stream_ori, true);
1515 $stream = $stream_ori;
1521 private function getMappingId($idtofind, $objecttofind) {
1522 global $importRefMapping;
1523 if (isset($importRefMapping[$objecttofind][$idtofind])) {
1524 return $importRefMapping[$objecttofind][$idtofind];
1526 //not found, return the idtofind.
1531 private function createSubfile($filename, $data, $format) {
1532 if ($format == 'json') {
1533 $stream = json_encode($data, JSON_PRETTY_PRINT);
1537 file_put_contents($filename, $stream);
1540 private function parseStringForReference($string) {
1541 $artf_refs = preg_match_all('/\[\#[1-9]{1,3}\]/', $string);
1542 if ($artf_refs && is_array($artf_refs)) {
1543 foreach ($artf_refs as $artf_ref) {
1544 $artfid = substr($artf_ref, 2, -1); //remove [# & ]
1545 $nartfid = $this->getMappingId($artfid, 'artifact');
1546 str_replace($artfid, '[#'.$nartfid.']', $string);
1553 session_set_admin();
1555 if (count($argv) >= 3) {
1558 if (count($argv) >= 3) {
1560 for ($i = 3; $i < count($argv); $i++) {
1561 $params[$j] = $argv[$i];
1570 $ctl = new CliActions();
1571 if (method_exists($ctl, $action)) {
1572 if (isset($params[0])) {
1573 $ctl->$action($name, $params[0]);
1575 $ctl->$action($name);