summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/includes/QueryPrinterFactory.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/includes/QueryPrinterFactory.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/includes/QueryPrinterFactory.php196
1 files changed, 196 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/includes/QueryPrinterFactory.php b/www/wiki/extensions/SemanticMediaWiki/includes/QueryPrinterFactory.php
new file mode 100644
index 00000000..3481405e
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/includes/QueryPrinterFactory.php
@@ -0,0 +1,196 @@
+<?php
+
+namespace SMW;
+
+use InvalidArgumentException;
+use SMW\Query\Exception\ResultFormatNotFoundException;
+
+/**
+ * Factory for "result formats", ie classes implementing QueryResultPrinter.
+ *
+ * @license GNU GPL v2+
+ * @since 2.5 (since 1.9, renamed in 2.5)
+ *
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+final class QueryPrinterFactory {
+
+ /**
+ * Returns the global instance of the factory.
+ *
+ * @since 2.5
+ *
+ * @return QueryPrinterFactory
+ */
+ public static function singleton() {
+ static $instance = null;
+
+ if ( $instance === null ) {
+ $instance = self::newFromGlobalState();
+ }
+
+ return $instance;
+ }
+
+ private static function newFromGlobalState() {
+ $instance = new self();
+
+ foreach ( $GLOBALS['smwgResultFormats'] as $formatName => $printerClass ) {
+ $instance->registerFormat( $formatName, $printerClass );
+ }
+
+ foreach ( $GLOBALS['smwgResultAliases'] as $formatName => $aliases ) {
+ $instance->registerAliases( $formatName, $aliases );
+ }
+
+ return $instance;
+ }
+
+ /**
+ * Format registry. Format names pointing to their associated QueryResultPrinter implementing classes.
+ *
+ * @var string[]
+ */
+ private $formats = [];
+
+ /**
+ * Form alias registry. Aliases pointing to their canonical format name.
+ *
+ * @var string[]
+ */
+ private $aliases = [];
+
+ /**
+ * Registers a format.
+ * If there is a format already with the provided name,
+ * it will be overridden with the newly provided data.
+ *
+ * @since 2.5
+ *
+ * @param string $formatName
+ * @param string $class
+ *
+ * @throws InvalidArgumentException
+ */
+ public function registerFormat( $formatName, $class ) {
+
+ if ( !is_string( $formatName ) ) {
+ throw new InvalidArgumentException( 'Format names can only be of type string' );
+ }
+
+ if ( !is_string( $class ) ) {
+ throw new InvalidArgumentException( 'Format class names can only be of type string' );
+ }
+
+ $this->formats[$formatName] = $class;
+ }
+
+ /**
+ * Registers the provided format aliases.
+ * If an aliases is already registered, it will
+ * be overridden with the newly provided data.
+ *
+ * @since 2.5
+ *
+ * @param string $formatName
+ * @param array $aliases
+ *
+ * @throws InvalidArgumentException
+ */
+ public function registerAliases( $formatName, array $aliases ) {
+
+ if ( !is_string( $formatName ) ) {
+ throw new InvalidArgumentException( 'Format names can only be of type string' );
+ }
+
+ foreach ( $aliases as $alias ) {
+ if ( !is_string( $alias ) ) {
+ throw new InvalidArgumentException( 'Format aliases can only be of type string' );
+ }
+
+ $this->aliases[$alias] = $formatName;
+ }
+ }
+
+ /**
+ * Returns the canonical format names.
+ *
+ * @since 2.5
+ *
+ * @return string[]
+ */
+ public function getFormats() {
+ return array_keys( $this->formats );
+ }
+
+ /**
+ * Returns if there is a format or format alias with the provided name.
+ *
+ * @since 2.5
+ *
+ * @param string $formatName Format name or alias
+ *
+ * @return boolean
+ */
+ public function hasFormat( $formatName ) {
+ $formatName = $this->getCanonicalName( $formatName );
+ return array_key_exists( $formatName, $this->formats );
+ }
+
+ /**
+ * Returns a new instance of the handling result printer for the provided format.
+ *
+ * @since 2.5
+ *
+ * @param string $formatName
+ *
+ * @return QueryResultPrinter
+ * @throws ResultFormatNotFoundException
+ */
+ public function getPrinter( $formatName ) {
+ $class = $this->getPrinterClass( $formatName );
+ return new $class( $formatName );
+ }
+
+ /**
+ * Returns the QueryResultPrinter implementing class that is the printer for the provided format.
+ *
+ * @param string $formatName Format name or alias
+ *
+ * @return string
+ * @throws ResultFormatNotFoundException
+ */
+ private function getPrinterClass( $formatName ) {
+ $formatName = $this->getCanonicalName( $formatName );
+
+ if ( !array_key_exists( $formatName, $this->formats ) ) {
+ throw new ResultFormatNotFoundException( 'Unknown format name "' . $formatName . '" has no associated printer class' );
+ }
+
+ return $this->formats[$formatName];
+ }
+
+ /**
+ * Resolves format aliases into their associated canonical format name.
+ *
+ * @since 2.5
+ *
+ * @param string $formatName Format name or alias
+ *
+ * @return string
+ * @throws InvalidArgumentException
+ */
+ public function getCanonicalName( $formatName ) {
+
+ if ( !is_string( $formatName ) ) {
+ throw new InvalidArgumentException( 'Format names can only be of type string' );
+ }
+
+ if ( array_key_exists( $formatName, $this->aliases ) ) {
+ $formatName = $this->aliases[$formatName];
+ }
+
+ return $formatName;
+ }
+
+}