/**
  * Constructs an EntityChange from the given old and new Entity.
  *
  * @since 0.5
  *
  * @param string      $action The action name
  * @param EntityDocument|null $oldEntity
  * @param EntityDocument|null $newEntity
  * @param array $fields additional fields to set
  *
  * @return EntityChange
  * @throws MWException
  */
 public function newFromUpdate($action, EntityDocument $oldEntity = null, EntityDocument $newEntity = null, array $fields = array())
 {
     if ($oldEntity === null && $newEntity === null) {
         throw new MWException('Either $oldEntity or $newEntity must be given');
     }
     if ($oldEntity === null) {
         $oldEntity = $this->entityFactory->newEmpty($newEntity->getType());
         $id = $newEntity->getId();
     } elseif ($newEntity === null) {
         $newEntity = $this->entityFactory->newEmpty($oldEntity->getType());
         $id = $oldEntity->getId();
     } elseif ($oldEntity->getType() !== $newEntity->getType()) {
         throw new MWException('Entity type mismatch');
     } else {
         $id = $newEntity->getId();
     }
     // HACK: don't include statements diff, since those are unused and not helpful
     // performance-wise to the dispatcher and change handling.
     // For a better solution, see T113468.
     if ($oldEntity instanceof StatementListHolder) {
         $oldEntity->setStatements(new StatementList());
         $newEntity->setStatements(new StatementList());
     }
     $diff = $this->entityDiffer->diffEntities($oldEntity, $newEntity);
     /** @var EntityChange $instance */
     $instance = self::newForEntity($action, $id, $fields);
     $instance->setDiff($diff);
     return $instance;
 }
 /**
  * Build the HTML form
  */
 private function setForm()
 {
     $options = array($this->msg('wikibase-entitieswithoutlabel-label-alltypes')->text() => '');
     foreach ($this->entityFactory->getEntityTypes() as $type) {
         // Messages: wikibase-entity-item, wikibase-entity-property, wikibase-entity-query
         $options[$this->msg('wikibase-entity-' . $type)->text()] = $type;
     }
     $this->getOutput()->addModules('wikibase.special.languageSuggester');
     $formDescriptor = array('language' => array('name' => 'language', 'default' => $this->language, 'type' => 'text', 'cssclass' => 'wb-language-suggester', 'id' => 'wb-entitieswithoutpage-language', 'label-message' => 'wikibase-entitieswithoutlabel-label-language'), 'type' => array('name' => 'type', 'options' => $options, 'default' => $this->type, 'type' => 'select', 'id' => 'wb-entitieswithoutpage-type', 'label-message' => 'wikibase-entitieswithoutlabel-label-type'), 'submit' => array('name' => '', 'default' => $this->msg('wikibase-entitieswithoutlabel-submit')->text(), 'type' => 'submit', 'id' => 'wikibase-entitieswithoutpage-submit'));
     HTMLForm::factory('inline', $formDescriptor, $this->getContext())->setId('wb-entitieswithoutpage-form')->setMethod('get')->setWrapperLegendMsg($this->legendMsg)->suppressDefaultSubmit()->setSubmitCallback(function () {
         // no-op
     })->show();
 }
 /**
  * @see ModifyEntity::getAllowedParams
  */
 protected function getAllowedParams()
 {
     return array_merge(parent::getAllowedParams(), array('data' => array(self::PARAM_TYPE => 'text', self::PARAM_REQUIRED => true), 'clear' => array(self::PARAM_TYPE => 'boolean', self::PARAM_DFLT => false), 'new' => array(self::PARAM_TYPE => $this->entityFactory->getEntityTypes())));
 }
 private function makeDiff($objectId, $revA, $revB)
 {
     $entityClasses = array(Item::ENTITY_TYPE => 'Wikibase\\DataModel\\Entity\\Item');
     $lookup = $this->getEntityRevisionLookup();
     $entityFactory = new EntityFactory($entityClasses);
     $itemId = new ItemId($objectId);
     if ($revA === 0) {
         $oldEntity = $entityFactory->newEmpty(Item::ENTITY_TYPE);
     } else {
         $oldEntity = $lookup->getEntityRevision($itemId, $revA)->getEntity();
     }
     if ($revB === 0) {
         $newEntity = $entityFactory->newEmpty(Item::ENTITY_TYPE);
     } else {
         $newEntity = $lookup->getEntityRevision($itemId, $revB)->getEntity();
     }
     $differ = new ItemDiffer();
     return $differ->diffEntities($oldEntity, $newEntity);
 }