Skip to content

Commit

Permalink
Merge cbf33b0 into ce12d84
Browse files Browse the repository at this point in the history
  • Loading branch information
mwjames committed Apr 2, 2017
2 parents ce12d84 + cbf33b0 commit 6162ba1
Show file tree
Hide file tree
Showing 30 changed files with 1,491 additions and 169 deletions.
31 changes: 31 additions & 0 deletions src/Importer/ContentCreator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace SMW\Importer;

use Onoi\MessageReporter\MessageReporterAware;

/**
* @license GNU GPL v2+
* @since 3.0
*
* @author mwjames
*/
interface ContentCreator extends MessageReporterAware {

/**
* @since 3.0
*
* @param ImportContents $importContents
*
* @return boolean
*/
public function canCreateContentsFor( ImportContents $importContents );

/**
* @since 3.0
*
* @param ImportContents $importContents
*/
public function doCreateFrom( ImportContents $importContents );

}
82 changes: 82 additions & 0 deletions src/Importer/ContentCreators/DispatchingContentCreator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<?php

namespace SMW\Importer\ContentCreators;

use Onoi\MessageReporter\MessageReporter;
use SMW\Importer\ImportContents;
use SMW\Importer\ContentCreator;
use RuntimeException;

/**
* @license GNU GPL v2+
* @since 3.0
*
* @author mwjames
*/
class DispatchingContentCreator implements ContentCreator {

/**
* @var MessageReporter
*/
private $messageReporter;

/**
* @var ContentCreator[]
*/
private $contentCreators = array();

/**
* @since 3.0
*
* @param ContentCreator[]
*/
public function __construct( array $contentCreators ) {
$this->contentCreators = $contentCreators;
}

/**
* @see MessageReporterAware::setMessageReporter
*
* @since 3.0
*
* @param MessageReporter $messageReporter
*/
public function setMessageReporter( MessageReporter $messageReporter ) {
$this->messageReporter = $messageReporter;
}

/**
* @since 3.0
*
* @param ImportContents $importContents
*/
public function canCreateContentsFor( ImportContents $importContents ) {

foreach ( $this->contentCreators as $contentCreator ) {
if ( $contentCreator->canCreateContentsFor( $importContents ) ) {
return true;
}
}

return false;
}

/**
* @since 3.0
*
* @param ImportContents $importContents
* @throws RuntimeException
*/
public function doCreateFrom( ImportContents $importContents ) {

foreach ( $this->contentCreators as $contentCreator ) {
if ( $contentCreator->canCreateContentsFor( $importContents ) ) {
$contentCreator->setMessageReporter( $this->messageReporter );
return $contentCreator->doCreateFrom( $importContents );
}
}

throw new RuntimeException( "No dispatchable ContentsCreator is assigned to type " . $importContents->getContentType() );
}

}
Original file line number Diff line number Diff line change
@@ -1,50 +1,47 @@
<?php

namespace SMW\Importer;
namespace SMW\Importer\ContentCreators;

use Title;
use Onoi\MessageReporter\MessageReporter;
use Onoi\MessageReporter\MessageReporterAware;
use SMW\MediaWiki\PageCreator;
use RuntimeException;
use SMW\Importer\ImportContents;
use SMW\Importer\ContentCreator;
use SMW\MediaWiki\Database;
use ContentHandler;
use Title;

/**
* @license GNU GPL v2+
* @since 2.5
*
* @author mwjames
*/
class ContentsImporter implements MessageReporterAware {
class TextContentCreator implements ContentCreator {

/**
* @var ImportContentsIterator
* @var MessageReporter
*/
private $importContentsIterator;
private $messageReporter;

/**
* @var PageCreator
*/
private $pageCreator;

/**
* @var MessageReporter
* @var Database
*/
private $messageReporter;

/**
* @var integer|boolean
*/
private $reqVersion = false;
private $connection;

/**
* @since 2.5
*
* @param ImportContentsIterator $importContentsIterator
* @param PageCreator $pageCreator
* @param Database $connection
*/
public function __construct( ImportContentsIterator $importContentsIterator, PageCreator $pageCreator ) {
$this->importContentsIterator = $importContentsIterator;
public function __construct( PageCreator $pageCreator, Database $connection ) {
$this->pageCreator = $pageCreator;
$this->connection = $connection;
}

/**
Expand All @@ -61,80 +58,63 @@ public function setMessageReporter( MessageReporter $messageReporter ) {
/**
* @since 2.5
*
* @param integer|boolean $reqVersion
* @param ImportContents $importContents
*/
public function setReqVersion( $reqVersion ) {
$this->reqVersion = $reqVersion;
public function canCreateContentsFor( ImportContents $importContents ) {
return $importContents->getContentType() === ImportContents::CONTENT_TEXT;
}

/**
* @since 2.5
*
* @param ImportContents $importContents
*/
public function doImport() {
public function doCreateFrom( ImportContents $importContents ) {

if ( !class_exists( 'ContentHandler' ) ) {
return $this->messageReporter->reportMessage( "\nContentHandler doesn't exist therefore importing is not possible.\n" );
}

if ( $this->reqVersion === false ) {
return $this->messageReporter->reportMessage( "\nImport support not enabled, processing completed.\n" );
}

foreach ( $this->importContentsIterator as $key => $importContents ) {
$this->messageReporter->reportMessage( "\nImport of $key ...\n" );

foreach ( $importContents as $impContents ) {

if ( $impContents->getVersion() !== $this->reqVersion ) {
$this->messageReporter->reportMessage( " ... version mismatch, abort import for $key\n" );
break;
}

$this->doImportContents( $impContents );
}
}

$this->messageReporter->reportMessage( "\nImport processing completed.\n" );
}

private function doImportContents( ImportContents $importContents ) {

$indent = ' ...';
$name = $importContents->getName();

if ( $importContents->getErrors() !== array() ) {
return $this->messageReporter->reportMessage( "$indent ... " . implode( ',', $importContents->getErrors() ) ." ...\n" );
if ( $name === '' ) {
return $this->messageReporter->reportMessage( "$indent no valid page name, abort import." );
}

$name = $importContents->getName();

$title = Title::newFromText(
$name,
$importContents->getNamespace()
);

if ( $title === null ) {
return $this->messageReporter->reportMessage( "$indent $name returned with a null instance, abort import." );
return $this->messageReporter->reportMessage( "$indent $name returned with a null title, abort import." );
}

$prefixedText = $title->getPrefixedText();

if ( $title->exists() && !$importContents->getOption( 'canReplace' ) ) {
if ( $title->exists() && !$importContents->getOption( 'canReplace' ) && !$importContents->getOption( 'replaceable' ) ) {
return $this->messageReporter->reportMessage( "$indent skipping $prefixedText, already exists ...\n" );
} elseif( $title->exists() ) {
$this->messageReporter->reportMessage( "$indent replacing $prefixedText contents ...\n" );
} else {
$this->messageReporter->reportMessage( "$indent creating $prefixedText contents ...\n" );
}

$this->doCreateContent( $title, $importContents );
// Avoid a possible "Notice: WikiPage::doEditContent: Transaction already
// in progress (from DatabaseUpdater::doUpdates), performing implicit
// commit ..."
$this->connection->onTransactionIdle( function() use ( $title, $importContents ) {
$this->doCreateContent( $title, $importContents );
} );
}

private function doCreateContent( $title, $importContents ) {

$page = $this->pageCreator->createPage( $title );

$content = \ContentHandler::makeContent(
$importContents->getContents(),
$content = ContentHandler::makeContent(
$this->fetchContents( $importContents ),
$title
);

Expand All @@ -147,4 +127,24 @@ private function doCreateContent( $title, $importContents ) {
$title->invalidateCache();
}

private function fetchContents( $importContents ) {

if ( $importContents->getContentsFile() === '' ) {
return $importContents->getContents();
}

$contents = file_get_contents( $importContents->getContentsFile() );

// http://php.net/manual/en/function.file-get-contents.php
return mb_convert_encoding(
$contents,
'UTF-8',
mb_detect_encoding(
$contents,
'UTF-8, ISO-8859-1, ISO-8859-2',
true
)
);
}

}

0 comments on commit 6162ba1

Please sign in to comment.