blob: e866a79e72a43577c155c671d889f4176da039ee [file] [log] [blame]
<?php
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
require_once("XML/RPC.php");
/**
* XML-RPC PHP version of the file manager client.
*
* Not all of the core functionality/methods are ported yet
* but this is a good start.
*
* @author ahart
* @author resneck
*
*/
class CAS_Filemgr_XmlRpcFilemgrClient {
private $client; // The XML/RPC client
public $serverURL; // The base URL of the server (default is localhost:9000)
public $serverPath; // The path to the XMLRPC handler (/path/to/xmlrpc)
function __construct($serverURL = 'localhost:9000',$serverPath = '/'){
$this->serverURL = $serverURL;
$this->serverPath = $serverPath;
try {
$this->client = new XML_RPC_Client($this->serverPath,$this->serverURL);
} catch (Exception $e) {
echo "<h4>Error creating XMLRPC client: " . $e.getMessage() . "</h4>";
exit();
}
}
function __destruct(){}
/**
* @param methodStr
* The string for the method to be invoked on ther server.
*
* @param params
* An array of XML-RPC encoded parameters to the method that will be invoked on the server.
*
* @param falseOnFail
* If set to true, sendMessage will return false on a failure, rather than exiting.
*
* @return The un-decoded data from the method invoked on the server.
*/
private function sendMessage($methodStr, $params){
$message = new XML_RPC_Message($methodStr, $params);
$response = $this->client->send($message);
if (!$response){
throw new XmlRpcFilemgrException("No response was received from Xml-Rpc Client\nError msg: " . $this->client->errstr);
}
if (!$response->faultCode()) {
$value = $response->value();
$data = XML_RPC_decode($value);
if(isset($data->faultString)){
throw new XmlRpcFilemgrException("Fault String in Xml-Rpc response: " . $data["faultString"]);
}
return $data;
} else {
throw new XmlRpcFilemgrException("Fault Code in Xml-Rpc response: " . $response->faultCode);
}
}
/**
* Throws an XmlRpcFilemgrException that gives more information than the one given.
*
* @param e
* The exception that needs more info included.
*
* @param funcName
* The name of the function in which this the original erroe/exception occurred.
*/
private function reportError($e, $funcName){
throw new XmlRpcFilemgrException("An error occurred while performing function " . $funcName . "\n" . $e->getMessage());
}
/**
* @return A boolean indicating whether the FileManager is still running.
*/
public function isAlive( $returnObject = true ) {
$params = array();
try{
$data = $this->sendMessage("filemgr.isAlive", $params, $returnObject);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "isAlive");
}
return $data;
}
/**
* @param productID
* The id of the desired Product.
*
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return The Product corresponding to the given id.
*/
function getProductById($productID, $returnObject = true){
$params = array(new XML_RPC_Value($productID,'string'));
try{
$data = $this->sendMessage("filemgr.getProductById", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getProductById");
}
if($returnObject){
$product = new CAS_Filemgr_Product($data);
return $product;
}else{
return $data;
}
}
/**
* @param product
* The product containing the desired references.
*
* @return An associative array specifying the references contained in the given Product.
*/
function getProductReferences($product){
$params = array($product->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getProductReferences", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getProductReferences");
}
return $data;
}
/**
* @param product
* The product specified by the desired metadata.
*
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return The metadata specifiying the given Product.
*/
function getMetadata($product, $returnObject = true){
$params = array($product->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getMetadata", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getMetadata");
}
if($returnObject){
$metadata = new CAS_Filemgr_Metadata($data);
return $metadata;
}else{
return $data;
}
}
/**
* @param typeID
* The ID of the desired ProductType defined for this instance of the File Manager.
*
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return The ProductType coresponding to the given ID.
*/
function getProductTypeById($typeID, $returnObject = true){
$params = array(new XML_RPC_Value($typeID,'string'));
try{
$data = $this->sendMessage("filemgr.getProductTypeById", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getProductTypeById");
}
if($returnObject){
$pt = new CAS_Filemgr_ProductType($data);
return $pt;
}else{
return $data;
}
}
/**
* @param typeName
* The name of the desired ProductType defined for this instance of the File Manager.
*
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return The ProductType coresponding to the given name.
*/
function getProductTypeByName($typeName, $returnObject = true){
$params = array(new XML_RPC_Value($typeName,'string'));
try{
$data = $this->sendMessage("filemgr.getProductTypeByName", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getProductTypeByName");
}
if($returnObject){
$pt = new CAS_Filemgr_ProductType($data);
return $pt;
}else{
return $data;
}
}
/**
* @param type
* The desired ProductType defined for this instance of the File Manager.
*
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return An array of all Products in the repository of the given ProductType.
*/
function getProductsByProductType($type, $returnObject = true){
$params = array($type->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getProductsByProductType", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getProductsByProductType");
}
if($returnObject){
$products = array();
foreach($data as $d){
$p = new CAS_Filemgr_Product($d);
array_push($products, $p);
}
return $products;
}else{
return $data;
}
}
/**
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return An array of all ProductTypes defined for this instance of the File Manager.
*/
function getProductTypes($returnObject = true){
$params = array();
try{
$data = $this->sendMessage("filemgr.getProductTypes", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getProductTypes");
}
if($returnObject){
$types = array();
foreach($data as $d){
$pt = new CAS_Filemgr_ProductType($d);
array_push($types, $pt);
}
return $types;
}else{
return $data;
}
}
/**
* @param type
* The desired ProductType defined for this instance of the File Manager.
*
* @return The number of products of the given ProductType in the repository.
*/
function getNumProducts($type){
$params = array($type->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getNumProducts", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getNumProducts");
}
return $data;
}
/**
* @param query
* A Query object containing QueryCrteria objects defining the search.
*
* @param type
* A ProductType object defining what types to search.
*
* @param pageNum
* The desired number of the page in the set of query results.
*
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return A ProductPage object containing query results
*/
function pagedQuery($query, $type, $pageNum, $returnObject = true){
$params = array(
$query->toXmlRpcStruct(),
$type->toXmlRpcStruct(),
new XML_RPC_Value($pageNum,'int'));
try{
$data = $this->sendMessage("filemgr.pagedQuery", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "pagedQuery");
}
if($returnObject){
$productPage = new CAS_Filemgr_ProductPage();
$productPage->__initXmlRpc($data);
return $productPage;
}else{
return $data;
}
}
/**
* @param query
* A Query object containing QueryCrteria objects defining the search.
*
* @param type
* A ProductType object defining what types to search.
*
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return An array of Product objects as query results.
*/
function query($query, $type, $returnObject = true){
$params = array(
$query->toXmlRpcStruct(),
$type->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.query", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "query");
}
if($returnObject){
$products = array();
foreach($data as $d){
$p = new CAS_Filemgr_Product($d);
array_push($products, $p);
}
return $products;
}else{
return $data;
}
}
/**
* @param type
* The desired ProductType defined for this instance of the File Manager.
*
* @param returnObject
* Whether data should be returned as an object as opposed to an associative array.
*
* @return An array of Element objects that are mapped to the given ProductType.
*/
function getElementsByProductType($type, $returnObject = true){
$params = array($type->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getElementsByProductType", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getElementsByProductType");
}
if($returnObject){
$elements = array();
foreach($data as $d){
$e = new CAS_Filemgr_Element();
$e->__initXmlRpc($d);
array_push($elements, $e);
}
return $elements;
}else{
return $data;
}
}
/* Pagination API */
function getFirstPage($type, $returnObject = true){
$params = array($type->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getFirstPage", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getFirstPage");
}
if($returnObject){
$page = new CAS_Filemgr_ProductPage();
$page->__initXmlRpc($data);
return $page;
}else{
return $data;
}
}
function getNextPage($type, $page, $returnObject = true){
$params = array($type->toXmlRpcStruct(), $page->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getNextPage", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getNextPage");
}
if($returnObject){
$page = new CAS_Filemgr_ProductPage();
$page->__initXmlRpc($data);
return $page;
}else{
return $data;
}
}
function getPrevPage($type, $page, $returnObject = true){
$params = array($type->toXmlRpcStruct(), $page->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getPrevPage", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getPrevPage");
}
if($returnObject){
$page = new CAS_Filemgr_ProductPage();
$page->__initXmlRpc($data);
return $page;
}else{
return $data;
}
}
function getLastPage($type, $returnObject = true){
$params = array($type->toXmlRpcStruct());
try{
$data = $this->sendMessage("filemgr.getLastPage", $params);
}catch(XmlRpcFilemgrException $e){
$this->reportError($e, "getLastPage");
}
if($returnObject){
$page = new CAS_Filemgr_ProductPage();
$page->__initXmlRpc($data);
return $page;
}else{
return $data;
}
}
}
class XmlRpcFilemgrException extends Exception{}
?>