Ben Woodhead
13 years ago
8 changed files with 708 additions and 0 deletions
@ -0,0 +1,76 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Hashtable cache ( nothing special ) |
||||
* Should be replaced with something like |
||||
*/ |
||||
class Cache |
||||
{ |
||||
private $objectList = array(); |
||||
|
||||
/** |
||||
* Add an object to the cache |
||||
* @param ObjectModel $object |
||||
*/ |
||||
public function addObject(ObjectModel &$object) |
||||
{ |
||||
if ( !isset($this->objectList[$object->getId()])) |
||||
{ |
||||
$this->objectList[$object->getId()] = array(); |
||||
} |
||||
|
||||
$this->objectList[$object->getId()]['checksum'] = sha1(serialize($object)); |
||||
$this->objectList[$object->getId()]['object'] = $object; |
||||
} |
||||
|
||||
/** |
||||
* Check to see if the object has been updated |
||||
* @param ObjectModel $object |
||||
*/ |
||||
public function hasChanged(ObjectModel &$object) |
||||
{ |
||||
// Is the object even cached |
||||
if ( !isset($this->objectList[$object->getId()])) |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
// Does it have the same checksum |
||||
if ($this->objectList[$object->getId()]['checksum'] == sha1(serialize($object)) ) |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
// If they were the same then it would have already exited |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* Get object from the cache. Returns null if not found. |
||||
* @param type $id |
||||
*/ |
||||
public function getObject($id) |
||||
{ |
||||
// Is the object cached |
||||
if ( isset($this->objectList[$id]['object'] ) ) { |
||||
|
||||
// Return the object from the cache |
||||
return $this->objectList[$id]['object']; |
||||
} |
||||
|
||||
// Object wasn't found so return null |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* Remove the object from the cache |
||||
* @param type $id |
||||
*/ |
||||
public function deleteObject($id) |
||||
{ |
||||
// Unset it from the array |
||||
unset( $this->objectList[$id]); |
||||
} |
||||
} |
||||
|
||||
?> |
@ -0,0 +1,58 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Basic config should be replaced with a specific implementation |
||||
*/ |
||||
class Configuration |
||||
{ |
||||
private $baseUrl; |
||||
private $port; |
||||
|
||||
/** |
||||
* Default constructor |
||||
* @param type $base_url |
||||
* @param type $port |
||||
*/ |
||||
public function __construct($base_url, $port) { |
||||
$this->$baseUrl = $base_url; |
||||
$this->$port = $port; |
||||
} |
||||
|
||||
/** |
||||
* Get the base url |
||||
* @return type |
||||
*/ |
||||
public function getBaseURL() |
||||
{ |
||||
return $this->$baseUrl; |
||||
} |
||||
|
||||
/** |
||||
* Set the base url |
||||
* @param type $url |
||||
*/ |
||||
public function setBaseURL($url) |
||||
{ |
||||
$this->$baseUrl = $url; |
||||
} |
||||
|
||||
/** |
||||
* Get the port |
||||
* @return type |
||||
*/ |
||||
public function getPort() |
||||
{ |
||||
return $this->$port; |
||||
} |
||||
|
||||
/** |
||||
* Set the port |
||||
* @param type $port |
||||
*/ |
||||
public function setPort($port) |
||||
{ |
||||
$this->$port = $port; |
||||
} |
||||
} |
||||
|
||||
?> |
@ -0,0 +1,37 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Islandora wrapper class to make everything easy to access |
||||
*/ |
||||
class IslandoraModule |
||||
{ |
||||
private static $instance; |
||||
private $repository; |
||||
|
||||
/** |
||||
* Block people from creating the class |
||||
*/ |
||||
private function __construct() |
||||
{ |
||||
$this->repository = new Repository(new Configuration("127.0.0.1", 8080), new Search, new Cache()); |
||||
} |
||||
|
||||
/** |
||||
* Get the repository singleton |
||||
* @return type |
||||
*/ |
||||
public static function instance() |
||||
{ |
||||
if ( self::instance == null ) |
||||
{ |
||||
$className = __CLASS__; |
||||
self::$instance = new $className; |
||||
// get_called_class only works in 5.3 |
||||
} |
||||
|
||||
// Return the link to the repository |
||||
return self::$instance->repository; |
||||
} |
||||
} |
||||
|
||||
?> |
@ -0,0 +1,264 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Fedora repository |
||||
*/ |
||||
class Repository |
||||
{ |
||||
private $config; |
||||
private $search; |
||||
private $cache; |
||||
|
||||
public function __construct(Configuration &$config, Search &$search, Cache &$cache) |
||||
{ |
||||
// Store all the dependencies |
||||
$this->setConfig($config); |
||||
$this->setSearch($search); |
||||
$this->setCache($cache); |
||||
} |
||||
|
||||
/** |
||||
* Get the configuration implementation |
||||
* @return type |
||||
*/ |
||||
public function getConfig() |
||||
{ |
||||
return $this->config; |
||||
} |
||||
|
||||
/** |
||||
* Get the search implementation |
||||
* @return type |
||||
*/ |
||||
public function getSearch() |
||||
{ |
||||
return $this->search; |
||||
} |
||||
|
||||
/** |
||||
* Get the cache implementation |
||||
* @return type |
||||
*/ |
||||
public function getCache() |
||||
{ |
||||
return $this->cache; |
||||
} |
||||
|
||||
/** |
||||
* Set the configuration implementation |
||||
* @param Configuration $config |
||||
*/ |
||||
public function setConfig(Configuration &$config) |
||||
{ |
||||
if ( $config == null ) |
||||
{ |
||||
throw new Exception("Config implementation can't be null"); |
||||
} |
||||
$this->config = $config; |
||||
} |
||||
|
||||
/** |
||||
* Set the search implementation |
||||
* @param Search $search |
||||
*/ |
||||
public function setSearch(Search &$search) |
||||
{ |
||||
if ( $search == null ) |
||||
{ |
||||
throw new Exception("Search implementation can't be null"); |
||||
} |
||||
$this->search = $search; |
||||
} |
||||
|
||||
/** |
||||
* Set the cache implementation |
||||
* @param Cache $cache |
||||
*/ |
||||
public function setCache(Cache &$cache) |
||||
{ |
||||
if ( $cache == null ) |
||||
{ |
||||
throw new Exception("Cache implementation can't be null"); |
||||
} |
||||
$this->cache = $cache; |
||||
} |
||||
|
||||
/** |
||||
* Get the object from the repo |
||||
* @param type $id |
||||
*/ |
||||
public function loadObject($id, $cache=true) |
||||
{ |
||||
// Check to see if its already cached |
||||
if ( $this->getCache()->getObject( $id ) && $cache = true) |
||||
{ |
||||
// Return the cached object |
||||
return $this->getCache()->getObject( $id ); |
||||
} |
||||
|
||||
// Create the request |
||||
$results = $this->makeRequest( '/objects/' .$id ); |
||||
|
||||
// Return the object model |
||||
return unserialize($results); |
||||
} |
||||
|
||||
/** |
||||
* Save an object to the repository |
||||
* @param ObjectModel $model |
||||
* @param type $force |
||||
*/ |
||||
public function saveObject(ObjectModel $model, $force=false) |
||||
{ |
||||
// Has the object been created at all |
||||
if ( $model->getId() == null ) { |
||||
|
||||
// Get the next free persistent id |
||||
$id = $this->makeRequest( '/objects/nextPID' ); |
||||
|
||||
// Set the id on the model |
||||
$model->setId($id); |
||||
|
||||
} |
||||
|
||||
// If it hasn't changed then done't save unless it's forced |
||||
if ( ! $force && ! $this->getCache()->hasChanged($model) ) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
// Add the object to the cache so everybody has the new copy |
||||
$this->getCache()->addObject($model); |
||||
|
||||
// Post the serialized model to the object endpoint |
||||
$this->makeRequest('/objects', $this->serialize($model)); |
||||
} |
||||
|
||||
/** |
||||
* Find an object using a search term |
||||
* @param type $term |
||||
* @return type |
||||
*/ |
||||
public function findObjectByTerm($term) |
||||
{ |
||||
// Create results |
||||
$results = $this->makeRequest('/objects?terms=' . $term); |
||||
|
||||
// Do something with results |
||||
return $results; |
||||
} |
||||
|
||||
/** |
||||
* Find an object with a query |
||||
* @param type $query |
||||
* @return type |
||||
*/ |
||||
public function findObjectWithQuery($query) |
||||
{ |
||||
// Create results |
||||
$results = $this->makeRequest('/objects?query=' . $term); |
||||
|
||||
// Do something with results |
||||
return $results; |
||||
} |
||||
|
||||
/** |
||||
* Search the repository using either a SPO or an array of SPOs |
||||
* @param type $query |
||||
*/ |
||||
public function SearchSPO($SPO) |
||||
{ |
||||
// Search |
||||
$results = $this->getSearch()->SearchSPO($SPO); |
||||
|
||||
// Do something with the results |
||||
return $results; |
||||
} |
||||
|
||||
/** |
||||
* Unserialize the object from foxml |
||||
* @param type $xml |
||||
* @return \ObjectModel |
||||
*/ |
||||
protected function unserialize($xml) |
||||
{ |
||||
// Create the object model |
||||
$model = new ObjectModel(); |
||||
|
||||
// Do something with the xml |
||||
$xml = $xml; |
||||
|
||||
// Return the model; |
||||
return $model; |
||||
} |
||||
|
||||
/** |
||||
* Serialize the object to foxml |
||||
* @param ObjectModel $model |
||||
* @return string |
||||
*/ |
||||
protected function serialize(ObjectModel $model) |
||||
{ |
||||
// Do something with the model |
||||
serialize($model); |
||||
|
||||
// return a string |
||||
return ""; |
||||
} |
||||
|
||||
/** |
||||
* Make a request |
||||
* @param type $request |
||||
* @return type |
||||
*/ |
||||
private function makeRequest($request, array $postData = null, $responseCode=200, $format="xml") |
||||
{ |
||||
// Check to see if we already have parameters |
||||
$pos = strpos($request, "?"); |
||||
if ($pos === false) { |
||||
$request.="?format=".$format; |
||||
} else { |
||||
$request.="&format=".$format; |
||||
} |
||||
|
||||
// Initialize Curl |
||||
$curl = curl_init(); |
||||
|
||||
// Set all the options |
||||
curl_setopt($curl, CURLOPT_URL, $this->getConfig()->getBaseURL() . $request); |
||||
curl_setopt($curl, CURLOPT_PORT , $this->getConfig()->getPort() ); |
||||
curl_setopt($curl, CURLOPT_VERBOSE, 1); |
||||
// If we have post data then append that |
||||
if ( $postData ) { |
||||
curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); |
||||
} |
||||
|
||||
// Execute the curl call |
||||
$results = curl_exec($curl); |
||||
|
||||
// Check for an error |
||||
if( ! curl_errno($curl) ) { |
||||
|
||||
// Get information regarding the curl connection |
||||
$info = curl_getinfo($curl); |
||||
|
||||
// Check the response code |
||||
if ( $info['http_code'] != $responseCode ) |
||||
{ |
||||
var_dump($results); |
||||
var_dump($info); |
||||
throw new Exception("Curl request failed"); |
||||
} else { |
||||
return $results; |
||||
} |
||||
} |
||||
|
||||
// Close connection |
||||
curl_close($curl); |
||||
|
||||
} // Close makeRequest |
||||
|
||||
} |
||||
|
||||
|
||||
?> |
@ -0,0 +1,37 @@
|
||||
<?php |
||||
|
||||
|
||||
/** |
||||
* Basic search that uses RI but could be replaced with solr |
||||
*/ |
||||
class Search |
||||
{ |
||||
/** |
||||
* Search the repository using either a SPO or an array of SPOs |
||||
* @param type $query |
||||
*/ |
||||
public function SearchSPO($SPO) |
||||
{ |
||||
$queryString = ""; |
||||
if (is_array($SPO)) |
||||
{ |
||||
foreach($SPO as $spo) |
||||
{ |
||||
$queryString .= $spo->getSubject() . " " . $spo->getPredicate() . " " . $spo->getObject() . ", "; |
||||
} |
||||
// Strip off the extra comma |
||||
$queryString = substr($queryString, '', -2); |
||||
} |
||||
else { |
||||
$queryString .= $SPO->getSubject() . " " . $SPO->getPredicate() . " " . $SPO->getObject(); |
||||
} |
||||
|
||||
// Do a search |
||||
$results = ""; |
||||
|
||||
// Return results; |
||||
return $results; |
||||
} |
||||
} |
||||
|
||||
?> |
@ -0,0 +1,42 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Repository Object Data |
||||
*/ |
||||
class DataObject |
||||
{ |
||||
private $id; |
||||
|
||||
/** |
||||
* Get the object id |
||||
* @return type |
||||
*/ |
||||
public function getId() |
||||
{ |
||||
return $this->id; |
||||
} |
||||
|
||||
/** |
||||
* Set the idea if not already set |
||||
* @param type $id |
||||
* @throws Exception |
||||
*/ |
||||
public function setId($id) |
||||
{ |
||||
if ( $pid != null ) |
||||
{ |
||||
throw new Exception("PID can't be changed"); |
||||
} |
||||
$this->id = $pid; |
||||
} |
||||
|
||||
/** |
||||
* Add the data from a file ( example ) |
||||
*/ |
||||
public function addDataFromFile() |
||||
{ |
||||
|
||||
} |
||||
} |
||||
|
||||
?> |
@ -0,0 +1,119 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Repository Object |
||||
* |
||||
* @todo Create an iterator for the datas |
||||
*/ |
||||
class ObjectModel |
||||
{ |
||||
private $id; |
||||
private $label; |
||||
private $status; |
||||
private $dataObjects = array(); |
||||
|
||||
/** |
||||
* Get the object id |
||||
* @return type |
||||
*/ |
||||
public function getId() |
||||
{ |
||||
return $this->id; |
||||
} |
||||
|
||||
/** |
||||
* Set the idea if not already set |
||||
* @param type $id |
||||
* @throws Exception |
||||
*/ |
||||
public function setId($id) |
||||
{ |
||||
if ( $id != null ) |
||||
{ |
||||
throw new Exception("ID can't be changed"); |
||||
} |
||||
$this->id = $id; |
||||
} |
||||
|
||||
/** |
||||
* Get the object label |
||||
* @return type |
||||
*/ |
||||
public function getLabel() |
||||
{ |
||||
return $this->label; |
||||
} |
||||
|
||||
/** |
||||
* Set the label |
||||
* @param type $label |
||||
*/ |
||||
public function setLabel($label) |
||||
{ |
||||
$this->label = $label; |
||||
} |
||||
|
||||
/** |
||||
* Get the object status |
||||
* @return type |
||||
*/ |
||||
public function getStatus() |
||||
{ |
||||
return $this->status; |
||||
} |
||||
|
||||
/** |
||||
* Set the status |
||||
* @param type $status |
||||
*/ |
||||
public function setStatus($status) |
||||
{ |
||||
$this->label = $status; |
||||
} |
||||
|
||||
/** |
||||
* Get a data using the id |
||||
* @param type $id |
||||
* @return null |
||||
*/ |
||||
public function getData($id) |
||||
{ |
||||
foreach($this->getAllDataObjects() as $data) |
||||
{ |
||||
if ($data->getId() == $id) |
||||
{ |
||||
return $data; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* Get all the data object |
||||
* @return type |
||||
*/ |
||||
public function getAllDataObjects() |
||||
{ |
||||
return $this->dataObjects; |
||||
} |
||||
|
||||
/** |
||||
* Add a data object |
||||
* @param type $data |
||||
*/ |
||||
public function addData(DataObject &$data) |
||||
{ |
||||
$this->dataObjects[$data->getId()] = $data; |
||||
} |
||||
|
||||
/** |
||||
* Delete a data object |
||||
* @param type $data |
||||
*/ |
||||
public function deleteData(DataObject &$data) |
||||
{ |
||||
unset( $this->datas[$data->getId()] ); |
||||
} |
||||
} |
||||
|
||||
?> |
@ -0,0 +1,75 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Subject Predicate Object |
||||
* I.E. This, has, that |
||||
*/ |
||||
class SPO |
||||
{ |
||||
private $subject; |
||||
private $predicate; |
||||
private $object; |
||||
|
||||
public function __construct($subject, $predicate, $object) |
||||
{ |
||||
$this->subject = $subject; |
||||
$this->predicate = $predicate; |
||||
$this->object = $object; |
||||
} |
||||
|
||||
/** |
||||
* Get the subject |
||||
* @return type |
||||
*/ |
||||
public function getSubject() |
||||
{ |
||||
return $this->subject; |
||||
} |
||||
|
||||
/** |
||||
* Get the predicate |
||||
* @return type |
||||
*/ |
||||
public function getPredicate() |
||||
{ |
||||
return $this->predicate; |
||||
} |
||||
|
||||
/** |
||||
* Get the object |
||||
* @return type |
||||
*/ |
||||
public function getObject() |
||||
{ |
||||
return $this->object; |
||||
} |
||||
|
||||
/** |
||||
* Set the subject |
||||
* @param type $value |
||||
*/ |
||||
public function setSubject($value) |
||||
{ |
||||
$this->subject = $value; |
||||
} |
||||
|
||||
/** |
||||
* Set the predicate |
||||
* @param type $value |
||||
*/ |
||||
public function setPredicate($value) |
||||
{ |
||||
$this->predicate = $value; |
||||
} |
||||
|
||||
/** |
||||
* Set the object |
||||
* @param type $value |
||||
*/ |
||||
public function setObject($value) |
||||
{ |
||||
$this->object = $value; |
||||
} |
||||
} |
||||
|
||||
?> |
Loading…
Reference in new issue