. require_once( 'bug_api.php' ); require_once( 'custom_field_api.php'); require_once( 'user_api.php' ); require_once( 'Interface.php' ); class ImportXml_Issue implements ImportXml_Interface { private $old_id_; private $new_id_; private $newbug_; private $custom_field_array_; // import Issues options private $keepCategory_; private $defaultCategory_; public function __construct( $keepCategory, $defaultCategory ) { $this->newbug_ = new BugData; $this->keepCategory_ = $keepCategory; $this->defaultCategory_ = $defaultCategory; $this->custom_field_array_ = array(); } // Read stream until current item finishes, processing // the data found public function process( XMLreader$reader ) { //print "\nImportIssue process()\n"; $t_project_id = helper_get_current_project(); // TODO: category_get_id_by_name could work by default on current project $userId = auth_get_current_user_id( ); $custom_field_in_project = custom_field_get_linked_ids( $t_project_id ); $depth = $reader->depth; while( $reader->read() && ($reader->depth > $depth || $reader->nodeType != XMLReader::END_ELEMENT)) { if( $reader->nodeType == XMLReader::ELEMENT ) { switch( $reader->localName ) { case 'reporter': $t_old_id = $reader->getAttribute( 'id' ); $reader->read( ); $this->newbug_->reporter_id = $this->get_user_id( $reader->value, $userId ); //echo "reporter: old id = $t_old_id - new id = {$this->newbug_->reporter_id}\n"; break; case 'handler': $t_old_id = $reader->getAttribute( 'id' ); $reader->read( ); $this->newbug_->handler_id = $this->get_user_id( $reader->value, $userId ); //echo "handler: old id = $t_old_id - new id = {$this->newbug_->handler_id}\n"; break; case 'category': $this->newbug_->category_id = $this->defaultCategory_; // TODO: if we port the import/export code to 1.1.x, this needs to be // improved to cope with the different cases (1.1 => 1.2, 1.2 => 1.1 etc) if( version_compare( MANTIS_VERSION, '1.2', '>' ) === true ) { $reader->read( ); if( $this->keepCategory_ ) { $t_category_id = category_get_id_by_name( $reader->value, $t_project_id ); if( $t_category_id !== false ) { $this->newbug_->category_id = $t_category_id; } } // echo "new id = {$this->newbug_->category_id}\n"; } break; case 'eta': case 'priority': case 'projection': case 'reproducibility': case 'resolution': case 'severity': case 'status': case 'view_state': $t_field = $reader->localName; $t_id = $reader->getAttribute( 'id' ); $reader->read( ); $t_value = $reader->value; // Here we assume ids have the same meaning in both installations // TODO add a check for customized values $this->newbug_->$t_field = $t_id; break; case 'id': $reader->read( ); $this->old_id_ = $reader->value; break; case 'custom_field': $t_custom_field_name = $reader->getAttribute( 'name' ); $reader->read( ); $t_custom_field_value = $reader->value; $this->custom_field_array_[] = array('name'=>$t_custom_field_name, 'value'=>$t_custom_field_value); break; case 'project'; // ignore original value, use current project $this->newbug_->project_id = $t_project_id; break; default: $field = $reader->localName; //echo "using default handler for field: $field\n"; $reader->read( ); $this->newbug_->$field = $reader->value; } } } // now save the new bug $this->new_id_ = $this->newbug_->create(); // now add the custom fields foreach($this->custom_field_array_ as $i => $cf_pair){ $cf_id = custom_field_get_id_from_name($cf_pair['name']); //Continue iff the custom_field exists and is linked to project if(!$cf_id === FALSE && in_array($cf_id,$custom_field_in_project)){ custom_field_set_value($cf_id, $this->new_id_, $cf_pair['value']); } unset($this->custom_field_array_[$i]); } //echo "\nnew bug: $this->new_id_\n"; } public function update_map( Mapper$mapper ) { $mapper->add( 'issue', $this->old_id_, $this->new_id_ ); } public function dumpbug( ) { var_dump( $this->newbug_ ); var_dump( $this->issueMap ); } /** * Return the user id in the destination tracker * * Current logic is: try to find the same user by username; * if it fails, use $squash_userid * * @param $field string bugdata filed to update * @param $username string username as imported * @param $squash_userid integer fallback userid */ private function get_user_id( $username, $squash_userid = 0 ) { $t_user_id = user_get_id_by_name( $username ); if( $t_user_id === false ) { //not found $t_user_id = $squash_userid; } return $t_user_id; } }