Move to new namespace convention and add new result sub-classing

This commit is contained in:
Andrew Brown 2013-08-22 23:04:06 -04:00 committed by Jörn Friedrich Dreyer
parent 70e0ae0637
commit ac72828eae
6 changed files with 323 additions and 100 deletions

View File

@ -20,33 +20,20 @@
*
*/
namespace OC;
/**
* provides an interface to all search providers
* Provide an interface to all search providers
*/
class OC_Search{
class Search{
static private $providers=array();
static private $registeredProviders=array();
/**
* remove all registered search providers
*/
public static function clearProviders() {
self::$providers=array();
self::$registeredProviders=array();
}
/**
* register a new search provider to be used
*/
public static function registerProvider($class, $options=array()) {
self::$registeredProviders[]=array('class'=>$class, 'options'=>$options);
}
/**
* search all provider for $query
* @param string $query
* @return array An array of OC_Search_Result's
* Search all providers for $query
* @param string query
* @return array An array of OC\Search\Result's
*/
public static function search($query) {
self::initProviders();
@ -58,8 +45,16 @@ class OC_Search{
}
/**
* remove an existing search provider
* @param string $provider class name of a OC_Search_Provider
* Remove all registered search providers
*/
public static function clearProviders() {
self::$providers=array();
self::$registeredProviders=array();
}
/**
* Remove one existing search provider
* @param string $provider class name of a OC\Search\Provider
*/
public static function removeProvider($provider) {
self::$registeredProviders = array_filter(
@ -72,9 +67,16 @@ class OC_Search{
self::$providers=array();
}
/**
* Register a new search provider to search with
* @param string $provider class name of a OC\Search\Provider
*/
public static function registerProvider($class, $options=array()) {
self::$registeredProviders[]=array('class'=>$class, 'options'=>$options);
}
/**
* create instances of all the registered search providers
* Create instances of all the registered search providers
*/
private static function initProviders() {
if(count(self::$providers)>0) {

View File

@ -1,18 +1,47 @@
<?php
/**
* provides search functionalty
* ownCloud
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
abstract class OC_Search_Provider {
private $options;
public function __construct($options) {
$this->options=$options;
}
namespace OC\Search;
/**
* search for $query
* @param string $query
* @return array An array of OC_Search_Result's
*/
abstract public function search($query);
}
/**
* Provides a template for search functionality throughout ownCloud;
*/
abstract class Provider {
/**
* List of options (currently unused)
* @var array
*/
private $options;
/**
* Constructor
* @param array $options
*/
public function __construct($options) {
$this->options = $options;
}
/**
* Search for $query
* @param string $query
* @return array An array of OC\Search\Result's
*/
abstract public function search($query);
}

View File

@ -1,46 +1,59 @@
<?php
/**
* ownCloud
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
class OC_Search_Provider_File extends OC_Search_Provider{
function search($query) {
$files=\OC\Files\Filesystem::search($query, true);
$results=array();
$l=OC_L10N::get('lib');
foreach($files as $fileData) {
$path = $fileData['path'];
$mime = $fileData['mimetype'];
namespace OC\Search\Provider;
$name = basename($path);
$container = dirname($path);
$text = '';
$skip = false;
if($mime=='httpd/unix-directory') {
$link = OC_Helper::linkTo( 'files', 'index.php', array('dir' => $path));
$type = (string)$l->t('Files');
}else{
$link = OC_Helper::linkToRoute( 'download', array('file' => $path));
$mimeBase = $fileData['mimepart'];
switch($mimeBase) {
case 'audio':
$skip = true;
break;
case 'text':
$type = (string)$l->t('Text');
break;
case 'image':
$type = (string)$l->t('Images');
break;
default:
if($mime=='application/xml') {
$type = (string)$l->t('Text');
}else{
$type = (string)$l->t('Files');
}
}
}
if(!$skip) {
$results[] = new OC_Search_Result($name, $text, $link, $type, $container);
}
}
return $results;
}
/**
* Provide search results from the 'files' app
*/
class File extends \OC\Search\Provider{
/**
* Search for files and folders matching the given query
* @param string $query
* @return \OC\Search\Result
*/
function search($query) {
$files = \OC\Files\Filesystem::search($query);
$results = array();
// edit results
foreach ($files as $fileData) {
// skip versions
if (strpos($fileData['path'], '_versions') === 0) {
continue;
}
// skip top-level folder
if ($fileData['name'] == 'files' && $fileData['parent'] == -1) {
continue;
}
// create folder result
if($fileData['mimetype'] == 'httpd/unix-directory'){
$result = new \OC\Search\Result\Folder($fileData);
}
// or create file result
else{
$result = new \OC\Search\Result\File($fileData);
}
// add to results
$results[] = $result;
}
// return
return $results;
}
}

View File

@ -1,27 +1,65 @@
<?php
/**
* a result of a search
* ownCloud
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
class OC_Search_Result{
public $name;
public $text;
public $link;
public $type;
public $container;
/**
* create a new search result
* @param string $name short name for the result
* @param string $text some more information about the result
* @param string $link link for the result
* @param string $type the type of result as human readable string ('File', 'Music', etc)
* @param string $container
*/
public function __construct($name, $text, $link, $type, $container) {
$this->name=$name;
$this->text=$text;
$this->link=$link;
$this->type=$type;
$this->container=$container;
}
namespace OC\Search;
/**
* The generic result of a search
*/
abstract class Result {
/**
* A unique identifier for the result, usually given as the item ID in its
* corresponding application.
* @var string
*/
public $id;
/**
* The name of the item returned; this will be displayed in the search
* results.
* @var string
*/
public $name;
/**
* URL to the application item.
* @var string
*/
public $link;
/**
* The type of search result returned; for consistency, name this the same
* as the class name (e.g. \OC\Search\File -> 'file') in lowercase.
* @var string
*/
public $type = 'generic';
/**
* Create a new search result
* @param string $id unique identifier from application: '[app_name]/[item_identifier_in_app]'
* @param string $name displayed text of result
* @param string $link URL to the result within its app
*/
public function __construct($id = null, $name = null, $link = null) {
$this->id = $id;
$this->name = $name;
$this->link = $link;
}
}

109
lib/search/result/file.php Normal file
View File

@ -0,0 +1,109 @@
<?php
/**
* ownCloud
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Search\Result;
/**
* A found file
*/
class File extends \OC\Search\Result {
/**
* Type name; translated in templates
* @var string
*/
public $type = 'file';
/**
* Path to file
* @var string
*/
public $path;
/**
* Size, in bytes
* @var int
*/
public $size;
/**
* Date modified, in human readable form
* @var string
*/
public $modified;
/**
* File mime type
* @var string
*/
public $mime_type;
/**
* File permissions:
*
* @var string
*/
public $permissions;
/**
* Create a new file search result
* @param string $id unique identifier from application: '[app_name]/[item_identifier_in_app]'
* @param string $name displayed text of result
* @param string $link URL to the result within its app
* @param array $data file data given by provider
*/
public function __construct(array $data = null) {
$info = pathinfo($data['path']);
$this->id = $data['fileid'];
$this->name = $info['basename'];
$this->link = \OCP\Util::linkTo('files', 'index.php', array('dir' => $info['dirname'], 'file' => $info['basename']));
$this->permissions = self::get_permissions($data['path']);
$this->path = (strpos($data['path'], 'files') === 0) ? substr($data['path'], 5) : $data['path'];
$this->size = $data['size'];
$this->modified = $data['mtime'];
$this->mime_type = $data['mimetype'];
}
/**
* Determine permissions for a given file path
* @param string $path
* @return int
*/
function get_permissions($path) {
// add read permissions
$permissions = \OCP\PERMISSION_READ;
// get directory
$fileinfo = pathinfo($path);
$dir = $fileinfo['dirname'] . '/';
// add update permissions
if (\OC_Filesystem::isUpdatable($dir)) {
$permissions |= \OCP\PERMISSION_UPDATE;
}
// add delete permissions
if (\OC_Filesystem::isDeletable($dir)) {
$permissions |= \OCP\PERMISSION_DELETE;
}
// add share permissions
if (\OC_Filesystem::isSharable($dir)) {
$permissions |= \OCP\PERMISSION_SHARE;
}
// return
return $permissions;
}
}

View File

@ -0,0 +1,32 @@
<?php
/**
* ownCloud
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Search\Result;
/**
* A found folder
*/
class Folder extends \OC\Search\Result\File {
/**
* Type name; translated in templates
* @var string
*/
public $type = 'folder';
}