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; }