. require_once( 'bug_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_; // import Issues options private $keepCategory_; private $defaultCategory_; public function __construct( $keepCategory, $defaultCategory ) { $this->newbug_ = new BugData; $this->keepCategory_ = $keepCategory; $this->defaultCategory_ = $defaultCategory; } // 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( ); $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_; if( version_compare( MANTIS_VERSION, '1.2', '>' ) === true ) { $reader->read( ); if( $this->keepCategory_ ) { # Check for the category's existence in the current project # well as its parents (if any) $t_projects_hierarchy = project_hierarchy_inheritance( $t_project_id ); foreach( $t_projects_hierarchy as $t_project ) { $t_category_id = category_get_id_by_name( $reader->value, $t_project, false ); if( $t_category_id !== false ) { $this->newbug_->category_id = $t_category_id; break; } } } // 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 '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(); //echo "\nnew bug: $this->new_id_\n"; } public function update_map( ImportXml_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; } }