Ejemplo n.º 1
0
 function handleTrackNode(&$conference, &$schedConf, &$trackNode, &$errors, &$user, $isCommandLine, &$dependentItems, $trackIndex = null)
 {
     $trackDao =& DAORegistry::getDAO('TrackDAO');
     $errors = array();
     $schedConfSupportedLocales = array_keys($schedConf->getSupportedLocaleNames());
     // => sched conf locales must be set up before
     $schedConfPrimaryLocale = $schedConf->getPrimaryLocale();
     // The following page or two is responsible for locating an
     // existing track based on title and/or abbrev, or, if none
     // can be found, creating a new one.
     $titles = array();
     for ($index = 0; $node = $trackNode->getChildByName('title', $index); $index++) {
         $locale = $node->getAttribute('locale');
         if ($locale == '') {
             $locale = $schedConfPrimaryLocale;
         } elseif (!in_array($locale, $schedConfSupportedLocales)) {
             $errors[] = array('plugins.importexport.native.import.error.trackTitleLocaleUnsupported', array('trackTitle' => $node->getValue(), 'locale' => $locale));
             return false;
             // or ignore this error?
         }
         $titles[$locale] = $node->getValue();
     }
     if (empty($titles)) {
         $errors[] = array('plugins.importexport.native.import.error.trackTitleMissing');
         return false;
     }
     $abbrevs = array();
     for ($index = 0; $node = $trackNode->getChildByName('abbrev', $index); $index++) {
         $locale = $node->getAttribute('locale');
         if ($locale == '') {
             $locale = $schedConfPrimaryLocale;
         } elseif (!in_array($locale, $schedConfSupportedLocales)) {
             $errors[] = array('plugins.importexport.native.import.error.trackAbbrevLocaleUnsupported', array('trackAbbrev' => $node->getValue(), 'locale' => $locale));
             return false;
             // or ignore this error?
         }
         $abbrevs[$locale] = $node->getValue();
     }
     $identifyTypes = array();
     for ($index = 0; $node = $trackNode->getChildByName('identify_type', $index); $index++) {
         $locale = $node->getAttribute('locale');
         if ($locale == '') {
             $locale = $schedConfPrimaryLocale;
         } elseif (!in_array($locale, $schedConfSupportedLocales)) {
             $errors[] = array('plugins.importexport.native.import.error.trackIdentifyTypeLocaleUnsupported', array('trackIdentifyType' => $node->getValue(), 'locale' => $locale));
             return false;
             // or ignore this error?
         }
         $identifyTypes[$locale] = $node->getValue();
     }
     $policies = array();
     for ($index = 0; $node = $trackNode->getChildByName('policy', $index); $index++) {
         $locale = $node->getAttribute('locale');
         if ($locale == '') {
             $locale = $schedConfPrimaryLocale;
         } elseif (!in_array($locale, $schedConfSupportedLocales)) {
             $errors[] = array('plugins.importexport.native.import.error.trackPolicyLocaleUnsupported', array('trackPolicy' => $node->getValue(), 'locale' => $locale));
             return false;
             // or ignore this error?
         }
         $policies[$locale] = $node->getValue();
     }
     // $title and, optionally, $abbrev contain information that can
     // be used to locate an existing track. Otherwise, we'll
     // create a new one. If $title and $abbrev each match an
     // existing track, but not the same track, throw an error.
     $track = null;
     $foundTrackId = $foundTrackTitle = null;
     $index = 0;
     foreach ($titles as $locale => $title) {
         $track = $trackDao->getTrackByTitle($title, $schedConf->getId());
         if ($track) {
             $trackId = $track->getId();
             if ($foundTrackId) {
                 if ($foundTrackId != $trackId) {
                     // Mismatching tracks found. Throw an error.
                     $errors[] = array('plugins.importexport.native.import.error.trackTitleMismatch', array('track1Title' => $title, 'track2Title' => $foundTrackTitle));
                     return false;
                 }
             } else {
                 if ($index > 0) {
                     // the current title matches, but the prev titles didn't => error
                     $errors[] = array('plugins.importexport.native.import.error.trackTitleMatch', array('trackTitle' => $title));
                     return false;
                 }
             }
             $foundTrackId = $trackId;
             $foundTrackTitle = $title;
         } else {
             if ($foundTrackId) {
                 // a prev title matched, but the current doesn't => error
                 $errors[] = array('plugins.importexport.native.import.error.trackTitleMatch', array('trackTitle' => $foundTrackTitle));
                 return false;
             }
         }
         $index++;
     }
     // check abbrevs:
     $abbrevTrack = null;
     $foundTrackId = $foundTrackAbbrev = null;
     $index = 0;
     foreach ($abbrevs as $locale => $abbrev) {
         $abbrevTrack = $trackDao->getTrackByAbbrev($abbrev, $schedConf->getId());
         if ($abbrevTrack) {
             $trackId = $abbrevTrack->getTrackId();
             if ($foundTrackId) {
                 if ($foundTrackId != $trackId) {
                     // Mismatching tracks found. Throw an error.
                     $errors[] = array('plugins.importexport.native.import.error.trackAbbrevMismatch', array('track1Abbrev' => $abbrev, 'track2Abbrev' => $foundTrackAbbrev));
                     return false;
                 }
             } else {
                 if ($index > 0) {
                     // the current abbrev matches, but the prev abbrevs didn't => error
                     $errors[] = array('plugins.importexport.native.import.error.trackAbbrevMatch', array('trackAbbrev' => $trackAbbrev));
                     return false;
                 }
             }
             $foundTrackId = $trackId;
             $foundTrackAbbrev = $abbrev;
         } else {
             if ($foundTrackId) {
                 // a prev abbrev matched, but the current doesn't => error
                 $errors[] = array('plugins.importexport.native.import.error.trackAbbrevMatch', array('trackAbbrev' => $foundTrackAbbrev));
                 return false;
             }
         }
         $index++;
     }
     if (!$track && !$abbrevTrack) {
         // The track was not matched. Create one.
         // Note that because tracks are global-ish,
         // we're not maintaining a list of created
         // tracks to delete in case the import fails.
         unset($track);
         $track = new Track();
         $track->setTitle($titles, null);
         $track->setAbbrev($abbrevs, null);
         $track->setIdentifyType($identifyTypes, null);
         $track->setPolicy($policies, null);
         $track->setSchedConfId($schedConf->getId());
         $track->setSequence(REALLY_BIG_NUMBER);
         $track->setMetaIndexed(1);
         $track->setEditorRestricted(1);
         $track->setTrackId($trackDao->insertTrack($track));
         $trackDao->resequenceTracks($schedConf > getSchedConfId());
     }
     if (!$track && $abbrevTrack) {
         unset($track);
         $track =& $abbrevTrack;
     }
     // $track *must* now contain a valid track, whether it was
     // found amongst existing tracks or created anew.
     $hasErrors = false;
     for ($index = 0; $node = $trackNode->getChildByName('paper', $index); $index++) {
         if (!NativeImportDom::handlePaperNode($conference, $schedConf, $node, $track, $paper, $publishedPaper, $paperErrors, $user, $isCommandLine, $dependentItems)) {
             $errors = array_merge($errors, $paperErrors);
             $hasErrors = true;
         }
     }
     if ($hasErrors) {
         return false;
     }
     return true;
 }