/**
  * @param array[] $siteLinks
  * @param Item $item
  *
  * @return ChangeOp[]
  */
 private function getSiteLinksChangeOps(array $siteLinks, Item $item)
 {
     $siteLinksChangeOps = array();
     $sites = $this->siteLinkTargetProvider->getSiteList($this->siteLinkGroups);
     foreach ($siteLinks as $siteId => $arg) {
         $this->checkSiteLinks($arg, $siteId, $sites);
         $globalSiteId = $arg['site'];
         if (!$sites->hasSite($globalSiteId)) {
             $this->errorReporter->dieError("There is no site for global site id '{$globalSiteId}'", 'no-such-site');
         }
         $linkSite = $sites->getSite($globalSiteId);
         $shouldRemove = array_key_exists('remove', $arg) || !isset($arg['title']) && !isset($arg['badges']) || isset($arg['title']) && $arg['title'] === '';
         if ($shouldRemove) {
             $siteLinksChangeOps[] = $this->siteLinkChangeOpFactory->newRemoveSiteLinkOp($globalSiteId);
         } else {
             $badges = isset($arg['badges']) ? $this->parseSiteLinkBadges($arg['badges']) : null;
             if (isset($arg['title'])) {
                 $linkPage = $linkSite->normalizePageName($this->stringNormalizer->trimWhitespace($arg['title']));
                 if ($linkPage === false) {
                     $this->errorReporter->dieMessage('no-external-page', $globalSiteId, $arg['title']);
                 }
             } else {
                 $linkPage = null;
                 if (!$item->getSiteLinkList()->hasLinkWithSiteId($globalSiteId)) {
                     $this->errorReporter->dieMessage('no-such-sitelink', $globalSiteId);
                 }
             }
             $siteLinksChangeOps[] = $this->siteLinkChangeOpFactory->newSetSiteLinkOp($globalSiteId, $linkPage, $badges);
         }
     }
     return $siteLinksChangeOps;
 }
 /**
  * @param SiteList $sites
  * @param string $site
  * @param string $pageTitle
  *
  * @return array( Site $site, string $pageName )
  */
 private function getSiteAndNormalizedPageName(SiteList $sites, $site, $pageTitle)
 {
     $siteObj = $sites->getSite($site);
     $page = $siteObj->normalizePageName($pageTitle);
     if ($page === false) {
         $this->errorReporter->dieMessage('no-external-page', $site, $pageTitle);
     }
     return array($siteObj, $page);
 }
 /**
  * @param array $params
  *
  * @return ChangeOpSiteLink
  */
 private function getChangeOp(array $params)
 {
     if ($this->shouldRemove($params)) {
         $linksite = $this->stringNormalizer->trimToNFC($params['linksite']);
         return $this->siteLinkChangeOpFactory->newRemoveSiteLinkOp($linksite);
     } else {
         $linksite = $this->stringNormalizer->trimToNFC($params['linksite']);
         $sites = $this->siteLinkTargetProvider->getSiteList($this->siteLinkGroups);
         $site = $sites->getSite($linksite);
         if ($site === false) {
             $this->errorReporter->dieError('The supplied site identifier was not recognized', 'not-recognized-siteid');
         }
         if (isset($params['linktitle'])) {
             $page = $site->normalizePageName($this->stringNormalizer->trimWhitespace($params['linktitle']));
             if ($page === false) {
                 $this->errorReporter->dieMessage('no-external-page', $linksite, $params['linktitle']);
             }
         } else {
             $page = null;
         }
         $badges = isset($params['badges']) ? $this->parseSiteLinkBadges($params['badges']) : null;
         return $this->siteLinkChangeOpFactory->newSetSiteLinkOp($linksite, $page, $badges);
     }
 }
 /**
  * @dataProvider messageProvider
  */
 public function testDieMessage($code, $param, $infoPattern, array $expectedDataFields)
 {
     $api = new ApiMain();
     $localizer = $this->getExceptionLocalizer();
     $reporter = new ApiErrorReporter($api, $localizer, Language::factory('de'));
     try {
         $reporter->dieMessage($code, $param);
         $this->fail('UsageException was not thrown!');
     } catch (UsageException $ex) {
         $this->assertUsageException($infoPattern, $code, null, $expectedDataFields, $ex);
     }
 }