From 5ca37ababd27754b9c9af8050743951ce7522ae1 Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 20 May 2014 19:09:51 +0200 Subject: [PATCH] Introduce ContentHandler::importTransform. ContentHandler::importTransform allows ContentHandler implementations to apply transformations on page content upon import. Such transformatiosn may by useful to update from legacy formats, apply ID rewriting, etc. Note that the transformation is done on the serialized content. This allows for a "raw" import implementation that writes improted blobs directly into a blob store without unserializing them into an intermediary representation. Implementations may choose to unserialize, transform, and then re-serialize. Bug: 65256 Change-Id: I290fdf5589af43def8b3eddb68b5e1c23f6124e8 --- includes/Import.php | 40 +++++++++++++++++++---------- includes/content/ContentHandler.php | 15 +++++++++++ 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/includes/Import.php b/includes/Import.php index 743037cd79..aa55290e89 100644 --- a/includes/Import.php +++ b/includes/Import.php @@ -263,7 +263,7 @@ class WikiImporter { * @return bool */ public function importRevision( $revision ) { - if ( !$revision->getContent()->getContentHandler()->canBeUsedOn( $revision->getTitle() ) ) { + if ( !$revision->getContentHandler()->canBeUsedOn( $revision->getTitle() ) ) { $this->notice( 'import-error-bad-location', $revision->getTitle()->getPrefixedText(), $revision->getID(), @@ -694,9 +694,6 @@ class WikiImporter { if ( isset( $revisionInfo['id'] ) ) { $revision->setID( $revisionInfo['id'] ); } - if ( isset( $revisionInfo['text'] ) ) { - $revision->setText( $revisionInfo['text'] ); - } if ( isset( $revisionInfo['model'] ) ) { $revision->setModel( $revisionInfo['model'] ); } @@ -705,6 +702,14 @@ class WikiImporter { } $revision->setTitle( $pageInfo['_title'] ); + if ( isset( $revisionInfo['text'] ) ) { + $handler = $revision->getContentHandler(); + $text = $handler->importTransform( + $revisionInfo['text'], + $revision->getFormat() ); + + $revision->setText( $text ); + } if ( isset( $revisionInfo['timestamp'] ) ) { $revision->setTimestamp( $revisionInfo['timestamp'] ); } else { @@ -1087,6 +1092,9 @@ class WikiRevision { /** @var Content */ protected $content = null; + /** @var ContentHandler */ + protected $contentHandler = null; + /** @var string */ public $comment = ""; @@ -1318,18 +1326,24 @@ class WikiRevision { return $this->text; } + /** + * @return ContentHandler + */ + function getContentHandler() { + if ( is_null( $this->contentHandler ) ) { + $this->contentHandler = ContentHandler::getForModelID( $this->getModel() ); + } + + return $this->contentHandler; + } + /** * @return Content */ function getContent() { if ( is_null( $this->content ) ) { - $this->content = - ContentHandler::makeContent( - $this->text, - $this->getTitle(), - $this->getModel(), - $this->getFormat() - ); + $handler = $this->getContentHandler(); + $this->content = $handler->unserializeContent( $this->text, $this->getFormat() ); } return $this->content; @@ -1350,8 +1364,8 @@ class WikiRevision { * @return string */ function getFormat() { - if ( is_null( $this->model ) ) { - $this->format = ContentHandler::getForTitle( $this->getTitle() )->getDefaultFormat(); + if ( is_null( $this->format ) ) { + $this->format = $this->getContentHandler()->getDefaultFormat(); } return $this->format; diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php index dd7e27dcb9..212dfd1f0c 100644 --- a/includes/content/ContentHandler.php +++ b/includes/content/ContentHandler.php @@ -442,6 +442,21 @@ abstract class ContentHandler { */ abstract public function unserializeContent( $blob, $format = null ); + /** + * Apply import transformation (per default, returns $blob unchanged). + * This gives subclasses an opportunity to transform data blobs on import. + * + * @singe 1.24 + * + * @param string $blob + * @param string|null $format + * + * @return string + */ + public function importTransform( $blob, $format = null ) { + return $blob; + } + /** * Creates an empty Content object of the type supported by this * ContentHandler. -- 2.20.1