aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Alexander <admin@m-a-styles.de>2013-11-11 21:18:23 +0100
committerMarc Alexander <admin@m-a-styles.de>2013-11-11 21:18:23 +0100
commitbef6a5a6401314da7e5688907f4ebfc06ef83f2b (patch)
tree70605732b1549dea255cf4b2f95ca5b3d2fc2f7c
parentb1719db47df4f3089f90bbfac2ca0bec24dcf027 (diff)
downloadforums-bef6a5a6401314da7e5688907f4ebfc06ef83f2b.tar
forums-bef6a5a6401314da7e5688907f4ebfc06ef83f2b.tar.gz
forums-bef6a5a6401314da7e5688907f4ebfc06ef83f2b.tar.bz2
forums-bef6a5a6401314da7e5688907f4ebfc06ef83f2b.tar.xz
forums-bef6a5a6401314da7e5688907f4ebfc06ef83f2b.zip
[ticket/11912] Introduce guesser priority to mimetype guessers
The mimetype guesser priority can now be set through the service definition. Mimetypes will be guessed from the guesser with the highest priority to the one with the lowest priority. Standard priority types have been added to the service definition file. Any integer value can be used though. Standard mimetype guessers that do not have the methods get_priority and set_priority implemented, like the standard MimeTypeGuessers of symfony, will have the default priority with the value of 0. Lower priority guessers have values lower than 0 while high priority ones can be added with values higher than 0. PHPBB3-11912
-rw-r--r--phpBB/config/mimetype_guessers.yml11
-rw-r--r--phpBB/phpbb/mimetype/content_guesser.php2
-rw-r--r--phpBB/phpbb/mimetype/extension_guesser.php2
-rw-r--r--phpBB/phpbb/mimetype/guesser.php35
-rw-r--r--phpBB/phpbb/mimetype/guesser_base.php46
-rw-r--r--phpBB/phpbb/mimetype/guesser_interface.php16
-rw-r--r--tests/mimetype/guesser_test.php15
7 files changed, 124 insertions, 3 deletions
diff --git a/phpBB/config/mimetype_guessers.yml b/phpBB/config/mimetype_guessers.yml
index be5064a525..0115146deb 100644
--- a/phpBB/config/mimetype_guessers.yml
+++ b/phpBB/config/mimetype_guessers.yml
@@ -1,3 +1,10 @@
+parameters:
+ mimetype.guesser.priority.lowest: -2
+ mimetype.guesser.priority.low: -1
+ mimetype.guesser.priority.default: 0
+ mimetype.guesser.priority.high: 1
+ mimetype.guesser.priority.highest: 2
+
services:
mimetype.fileinfo_mimetype_guesser:
class: Symfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser
@@ -11,11 +18,15 @@ services:
mimetype.content_guesser:
class: phpbb\mimetype\content_guesser
+ calls:
+ - [set_priority, [%mimetype.guesser.priority.low%]]
tags:
- { name: mimetype.guessers }
mimetype.extension_guesser:
class: phpbb\mimetype\extension_guesser
+ calls:
+ - [set_priority, [%mimetype.guesser.priority.lowest%]]
tags:
- { name: mimetype.guessers }
diff --git a/phpBB/phpbb/mimetype/content_guesser.php b/phpBB/phpbb/mimetype/content_guesser.php
index 21631ae6d3..ffaed9136a 100644
--- a/phpBB/phpbb/mimetype/content_guesser.php
+++ b/phpBB/phpbb/mimetype/content_guesser.php
@@ -21,7 +21,7 @@ if (!defined('IN_PHPBB'))
* @package mimetype
*/
-class content_guesser implements guesser_interface
+class content_guesser extends guesser_base
{
/**
* @inheritdoc
diff --git a/phpBB/phpbb/mimetype/extension_guesser.php b/phpBB/phpbb/mimetype/extension_guesser.php
index 8cca974efc..f9459c84ec 100644
--- a/phpBB/phpbb/mimetype/extension_guesser.php
+++ b/phpBB/phpbb/mimetype/extension_guesser.php
@@ -21,7 +21,7 @@ if (!defined('IN_PHPBB'))
* @package mimetype
*/
-class extension_guesser implements guesser_interface
+class extension_guesser extends guesser_base
{
/**
* @var file extension map
diff --git a/phpBB/phpbb/mimetype/guesser.php b/phpBB/phpbb/mimetype/guesser.php
index 231b75f604..753fd65b0d 100644
--- a/phpBB/phpbb/mimetype/guesser.php
+++ b/phpBB/phpbb/mimetype/guesser.php
@@ -24,6 +24,11 @@ if (!defined('IN_PHPBB'))
class guesser
{
/**
+ * @const Default priority for mimetype guessers
+ */
+ const PRIORITY_DEFAULT = 0;
+
+ /**
* @var mimetype guessers
*/
protected $guessers;
@@ -39,7 +44,7 @@ class guesser
}
/**
- * Register MimeTypeGuessers
+ * Register MimeTypeGuessers and sort them by priority
*
* @param array $mimetype_guessers Mimetype guesser service collection
*
@@ -68,6 +73,34 @@ class guesser
{
throw new \LogicException('No mimetype guesser supplied.');
}
+
+ // Sort guessers by priority
+ usort($this->guessers, array($this, 'sort_priority'));
+ }
+
+ /**
+ * Sort the priority of supplied guessers
+ * This is a compare function for usort. A guesser with higher priority
+ * should be used first and vice versa. usort() orders the array values
+ * from low to high depending on what the comparison function returns
+ * to it. Return value should be smaller than 0 if value a is smaller
+ * than value b. This has been reversed in the comparision function in
+ * order to sort the guessers from high to low.
+ * Method has been set to public in order to allow proper testing.
+ *
+ * @param object $guesser_a Mimetype guesser a
+ * @param object $guesser_b Mimetype guesser b
+ *
+ * @return int If both guessers have the same priority 0, bigger
+ * than 0 if first guesser has lower priority, and lower
+ * than 0 if first guesser has higher priority
+ */
+ public function sort_priority($guesser_a, $guesser_b)
+ {
+ $priority_a = (int) (method_exists($guesser_a, 'get_priority')) ? $guesser_a->get_priority() : self::PRIORITY_DEFAULT;
+ $priority_b = (int) (method_exists($guesser_b, 'get_priority')) ? $guesser_b->get_priority() : self::PRIORITY_DEFAULT;
+
+ return $priority_b - $priority_a;
}
/**
diff --git a/phpBB/phpbb/mimetype/guesser_base.php b/phpBB/phpbb/mimetype/guesser_base.php
new file mode 100644
index 0000000000..b35badea54
--- /dev/null
+++ b/phpBB/phpbb/mimetype/guesser_base.php
@@ -0,0 +1,46 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+namespace phpbb\mimetype;
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* @package mimetype
+*/
+
+abstract class guesser_base implements guesser_interface
+{
+ /**
+ * @var int Guesser Priority
+ */
+ protected $priority;
+
+ /**
+ * @inheritdoc
+ */
+ public function get_priority()
+ {
+ return $this->priority;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function set_priority($priority)
+ {
+ $this->priority = $priority;
+ }
+}
diff --git a/phpBB/phpbb/mimetype/guesser_interface.php b/phpBB/phpbb/mimetype/guesser_interface.php
index a9b238d7aa..defff90654 100644
--- a/phpBB/phpbb/mimetype/guesser_interface.php
+++ b/phpBB/phpbb/mimetype/guesser_interface.php
@@ -38,4 +38,20 @@ interface guesser_interface
* @return string Guess for mimetype of file
*/
public function guess($file, $file_name = '');
+
+ /**
+ * Get the guesser priority
+ *
+ * @return int Guesser priority
+ */
+ public function get_priority();
+
+ /**
+ * Set the guesser priority
+ *
+ * @param int Guesser priority
+ *
+ * @return void
+ */
+ public function set_priority($priority);
}
diff --git a/tests/mimetype/guesser_test.php b/tests/mimetype/guesser_test.php
index 8d076abae5..a489e68b40 100644
--- a/tests/mimetype/guesser_test.php
+++ b/tests/mimetype/guesser_test.php
@@ -135,4 +135,19 @@ class guesser_test extends \phpbb_test_case
$this->assertEquals($expected[1], $guesser->guess($this->jpg_file . '.jpg'));
@unlink($this->jpg_file . '.jpg');
}
+
+ public function test_sort_priority()
+ {
+ $guessers = array(
+ 'FileinfoMimeTypeGuesser' => new \Symfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser,
+ 'extension_guesser' => new \phpbb\mimetype\extension_guesser,
+ 'FileBinaryMimeTypeGuesser' => new \Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser,
+ 'content_guesser' => new \phpbb\mimetype\content_guesser,
+ );
+ $guessers['content_guesser']->set_priority(5);
+ $guessers['extension_guesser']->set_priority(-5);
+ usort($guessers, array($this->guesser, 'sort_priority'));
+ $this->assertInstanceOf('\phpbb\mimetype\content_guesser', $guessers[0]);
+ $this->assertInstanceOf('\phpbb\mimetype\extension_guesser', $guessers[3]);
+ }
}