oodt-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ah...@apache.org
Subject svn commit: r1332770 - in /oodt/trunk: CHANGES.txt balance/modules/cas-browser/classes/Utils.class.php
Date Tue, 01 May 2012 18:36:25 GMT
Author: ahart
Date: Tue May  1 18:36:24 2012
New Revision: 1332770

URL: http://svn.apache.org/viewvc?rev=1332770&view=rev
Log:
resolve OODT-444

Modified:
    oodt/trunk/CHANGES.txt
    oodt/trunk/balance/modules/cas-browser/classes/Utils.class.php

Modified: oodt/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/oodt/trunk/CHANGES.txt?rev=1332770&r1=1332769&r2=1332770&view=diff
==============================================================================
--- oodt/trunk/CHANGES.txt (original)
+++ oodt/trunk/CHANGES.txt Tue May  1 18:36:24 2012
@@ -4,6 +4,8 @@ Apache OODT Change Log
 Release 0.4: Current Development
 --------------------------------------------
 
+* OODT-444 Utils class missing from Balance cas-browser module (ahart)
+
 * OODT-448 added missing character (skhudiky)
 
 * OODT-447 changed reference to CAS-SSO directory in the profile management module README.txt
(skhudiky)

Modified: oodt/trunk/balance/modules/cas-browser/classes/Utils.class.php
URL: http://svn.apache.org/viewvc/oodt/trunk/balance/modules/cas-browser/classes/Utils.class.php?rev=1332770&r1=1332769&r2=1332770&view=diff
==============================================================================
--- oodt/trunk/balance/modules/cas-browser/classes/Utils.class.php (original)
+++ oodt/trunk/balance/modules/cas-browser/classes/Utils.class.php Tue May  1 18:36:24 2012
@@ -15,345 +15,89 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/**
- * 
- * $Id$
- * 
- * CAS-Browser Module
- * 
- * This module provides applications a means for browsing a CAS File 
- * Manager catalog and obtaining products from a CAS File Manager repository.
- * 
- * For complete functionality, the following configuration variables
- * are expected to be present in the module's config.ini file:
- * 
- * browser_filemgr_url    - filemanager host (e.g.: http://somehost:9000)
- * browser_filemgr_path   - filemanager url on server (e.g.: /)  
- * browser_datadeliv_url  - the base url to use when downloading products
- *   
- * NOTE: This module has a dependency upon the CAS-Filemgr PHP classes
- * (https://svn.apache.org/repos/asf/oodt/trunk/filemgr/src/main/php)
- *      
- *      To build this dependency, check out the above project and then:
- *      1) cd into the checked out project (you should see a package.xml file)
- *      2) pear package
- *      3) (sudo) pear install --force CAS_Filemgr...tar.gz
- *   
- * @author ahart
- * @author resneck
- *
- */
-// Require CAS Filemgr Classes
-require_once("CAS/Filemgr/BooleanQueryCriteria.class.php");
-require_once("CAS/Filemgr/Element.class.php");
-require_once("CAS/Filemgr/Metadata.class.php");
-require_once("CAS/Filemgr/Product.class.php");
-require_once("CAS/Filemgr/ProductType.class.php");
-require_once("CAS/Filemgr/ProductPage.class.php");
-require_once("CAS/Filemgr/Query.class.php");
-require_once("CAS/Filemgr/RangeQueryCriteria.class.php");
-require_once("CAS/Filemgr/TermQueryCriteria.class.php");
-require_once("CAS/Filemgr/XmlRpcFilemgrClient.class.php");
-require_once(dirname(__FILE__) . "/Utils.class.php");
 
+require_once("CasBrowser.class.php");
 
-class CasBrowser {
-	
-	const VIS_INTERPRET_HIDE     = 'hide';
-	const VIS_INTERPRET_SHOW     = 'show';
-	const VIS_AUTH_ANONYMOUS     = false;
-	const VIS_AUTH_AUTHENTICATED = true;
-	const VIS_ALL                = 'all';
-	const VIS_LIMIT              = 'limit';
-	const VIS_NONE               = 'deny';
-	const VIS_DENY               = 'deny';
-	
-	public $client;
-	
-	public function __construct() {
-		try {
-			$this->client = new CAS_Filemgr_XmlRpcFilemgrClient(
-				App::Get()->settings['browser_filemgr_url'],
-				App::Get()->settings['browser_filemgr_path']);
-		} catch (Exception $e) {
-			App::Get()->fatal("Unable to instantiate a connection to "
-				. App::Get()->settings['browser_filemgr_url']
-				. App::Get()->settings['browser_filemgr_path']);
-		}
-	}
+class Utils{
 	
-	public function getClient() {
-		return $this->client;
-	}
-	
-	/**
-	 * Use the rules in element-ordering.ini to determine the display order
-	 * for product type metadata elements. See element-ordering.ini for more
-	 * information on how to specify element order rules.
-	 * 
-	 * @param integer $productTypeId  The id of the product type to get met for
-	 * @param array   $metadataTouse  An optional array of metadata key/vals to sort. If
-	 *                this is not provided, the product type metadata will be used.
-	 */
-	public function getSortedMetadata($productTypeId,$metadataToUse = null, $orderingAttribute)
{
-		
-		if (!is_array($metadataToUse)) {
-			$pt = $this->client
-				->getProductTypeById($productTypeId)
-				->toAssocArray();
-			$metadataAsArray = $pt['typeMetadata'];
-		} else {
-			$metadataAsArray = $metadataToUse;
-		}
-		
-		$orderingPolicyFilePath = dirname(dirname(__FILE__)) . '/element-ordering.ini';
-		if (file_exists($orderingPolicyFilePath)) {
-			$orderPolicy = parse_ini_file($orderingPolicyFilePath,true);
+	public static $acceptedReturnTypes = array('html', 'json');
 
-			$first    = isset($orderPolicy[$productTypeId][$orderingAttribute . '.element.ordering.first'])

-				? $orderPolicy[$productTypeId][$orderingAttribute . '.element.ordering.first']
-				: $orderPolicy['*'][$orderingAttribute . '.element.ordering.first'];
-			$last     = isset($orderPolicy[$productTypeId][$orderingAttribute . '.element.ordering.last'])

-				? $orderPolicy[$productTypeId][$orderingAttribute . '.element.ordering.last']
-				: $orderPolicy['*'][$orderingAttribute . '.element.ordering.last'];
-								
-			// Using the odering policy, determine the order in which the metadata will be listed
-			return $this->sortMetadata($metadataAsArray,$first,$last);	
-		} else {
-			return $metadataAsArray;
-		}
-	}
-	
 	/**
-	 * Retreives the set of metadata for the provided productTypeId that should be visible
-	 * to the current user. This function also applies the sorting policy (if it is defined)
-	 * specified in element.ordering.ini.
-	 * 
-	 * @param string $productTypeId - the unique productType identifier
+	 * @param types
+	 *		An array of PoductTypes.
+	 *
+	 * @return 
+	 *		An array of unique names of Metadata and Elements associated with the given 
+	 *		ProductTypes.
 	 */
-	public function getVisibleMetadataForProductType($productTypeId) {
-		// Get the metadata for the product type
-		$pt = $this->client
-			->getProductTypeById($productTypeId)
-			->toAssocArray();
-			
-		// Determine which metadata should be visible to the current user
-		$visibleMetadata = $this->getVisibleMetadata($pt['typeMetadata'], $productTypeId);
-		
-		// Sort the visible metadata according to the ordering policy
-		$result  = $this->getSortedMetadata($productTypeId,$visibleMetadata, 'pt');
-		
-		return $result;
-	}
-	
-	
-	/**
-	 * Retrieves the set of metadata for the provided productId that should be visible to 
-	 * the current user
-	 * 
-	 * @param string  $productId - the unique product identifier
-	 * @param boolean $authState - whether or not the current user is authenticated
-	 */
-	public function getVisibleMetadataForProduct($productId) {
-		$p  = $this->client->getProductById($productId);
-		$productTypeInfo = $p->getType()->toAssocArray();
-		$productTypeId   = $productTypeInfo[App::Get()->settings['browser_pt_id_key']];
-		$productMetadata = $this->client->getMetadata($p);
-		
-		// Determine which metadata should be visible to the current user
-		$visibleMetadata = $this->getVisibleMetadata($productMetadata->toAssocArray(), $productTypeId);
-				
-		// Sort the visible metadata according to the ordering policy
-		$result  = $this->getSortedMetadata($productTypeId,$visibleMetadata, 'p');
-		
-		return $result;		
+	public static function getMetadataElements($types){
+		$cb = new CasBrowser();
+		$client = $cb->getClient();
+		$metadataNames = array();
+		foreach($types as $type){
+			foreach(array_keys($type->getTypeMetadata()->toAssocArray()) as $metadata){
+				if(!in_array($metadata, $metadataNames)){
+					array_push($metadataNames, $metadata);
+				}
+			}
+			foreach($client->getElementsByProductType($type) as $element){
+				$elementName = $element->getElementName();
+				if(!in_array($elementName, $metadataNames)){
+					array_push($metadataNames, $elementName);
+				}
+			}
+		}
+		return $metadataNames;
 	}
 	
-	
 	/**
-	 * Determine the visibility level for the current product type and current user.
-	 * The level returned is one of VIS_ALL,VIS_LIMIT,VIS_NONE
-	 * 
-	 * @param string $productTypeId - the unique product type identifier
+	 * @param productType
+	 *		The productType of the ProductPage desired.
+	 *
+	 * @param pageNum
+	 *		The number of the page desired in the set of ProductPages of that ProductType.
+	 *
+	 * @return
+	 *		The requested ProductPage object.
 	 */
-	public function getProductTypeVisibilityLevel( $productTypeId ) {
-		// If the configuration explicitly states that this dataset is to be ignored,
-		// ignore it:
-		if (in_array($productTypeId,App::Get()->settings['browser_dataset_ignores'])) {
-			return CasBrowser::VIS_NONE;
-		}
-		
-		// Get the metadata for the product type
-		$typeInfo = $this->client
-			->getProductTypeById($productTypeId)
-			->toAssocArray();
-		
-		if ( App::Get()->getAuthenticationProvider() ) {
-			
-			// Does the product type define a metadata element matching
-			// the `browser_data_access_key` config setting?
-			$accessKeyExists = isset($typeInfo['typeMetadata'][App::Get()->settings['browser_data_access_key']]);
+	public static function getPage($productType, $pageNum){
+		$cb = new CasBrowser();
+		$client = $cb->getClient();
+		
+		// Iterate until the proper page is reached
+		for($page = $client->getFirstPage($productType);
+			$page->getPageNum() < $pageNum && $page->getPageNum() < $page->getTotalPages();
+			$page = $client->getNextPage($productType, $page)){}
 			
-			// Obtain the groups for the current resource
-			$resourceGroups = ($accessKeyExists)
-				? $typeInfo['typeMetadata'][App::Get()->settings['browser_data_access_key']]
-				: array();
-			
-			return $this->getResourceVisibility($resourceGroups,
-				App::Get()->settings['browser_pt_auth_policy']);
-		} else {
-			// No authentication provider, everything is public
-			return CasBrowser::VIS_ALL;
-		}
+		return $page;
 	}
 	
-	public function getProductVisibilityLevel( $productId ) {
-		
-		$product = $this->client->getProductById( $productId );
-		$productMetadata = $this->client->getMetadata($product);
-
-		// Get metadata for product and productType as associative arrays
-		$productTypeInfo = $product->getType()->toAssocArray();
-		$productInfo     = $productMetadata->toAssocArray();
-		
-		if ( App::Get()->getAuthenticationProvider() ) {
-			
-			// Does the product type define a metadata element matching
-			// the `browser_data_access_key` config setting?
-			$accessKeyExists = isset($productInfo[App::Get()->settings['browser_data_access_key']]);
-			 
-			// Obtain the groups for the current resource
-			$resourceGroups = ($accessKeyExists)
-				? $productInfo[App::Get()->settings['browser_data_access_key']]
-				: array();
-			
-			return $this->getResourceVisibility($resourceGroups, 
-				App::Get()->settings['browser_p_auth_policy']);
-		} else {
-			// No authentication provider, everything is public
-			return CasBrowser::VIS_ALL;
+	public static function getRequestedReturnType($requestedType){
+		$lowerRequestedType = strtolower($requestedType);
+		if(!in_array($lowerRequestedType, self::$acceptedReturnTypes)){
+			throw new CasBrowserException('Error: The requested return type of '. $requestedType .
'is not accepted.');
 		}
+		return $lowerRequestedType;
 	}
 	
-	
-	/**
-	 * Internal helper function for sorting(ordering) a metadata array according to policy.

-	 * 
-	 * @param array $unsortedMetadata An associative array of unsorted metadta key/(multi)values
-	 * @param array $sortFirst        A scalar array of metadata keys that must be ordered first
-	 * @param array $sortLast         A scalar array of metadata keys that must be ordered last
-	 * @returns array An associative array of sorted(ordered) metadata key/(multi)values
-	 */
-	protected function sortMetadata($unsortedMetadata,$sortFirst,$sortLast) {
-		$orderedMetadata = array();
-		foreach ($sortFirst as $key) {
-			if (isset($unsortedMetadata[$key])) {
-				$orderedMetadata[$key] = $unsortedMetadata[$key];
-				unset($unsortedMetadata[$key]);
-			}
+	public static function getProductListMetadata($products){
+		$payload = array();
+		foreach($products as $p){
+			$cb = new CasBrowser();
+			$client = $cb->getClient();
+			$met = $client->getMetadata($p);
+			$payload[$p->getId()] = $met;
 		}
-		$lastMetadata = array();
-		foreach ($sortLast as $key) {
-			if (isset($unsortedMetadata[$key])) {
-				$lastMetadata[$key] = $unsortedMetadata[$key];
-				unset($unsortedMetadata[$key]);
-			}
-		}
-		$orderedMetadata += $unsortedMetadata;
-		$orderedMetadata += $lastMetadata;
-		
-		return $orderedMetadata;
+		return $payload;
 	}
 	
-	/**
-	 * Internal helper function for, given an array of metadata, a productTypeID, and an indication
of whether or not the 
-	 * current user is authenticated, returning the subset of metadata that should be visible
to
-	 * the user. 
-	 * 
-	 * @param array   $metadataAsArray
-	 * @param string  $productTypeId
-	 * @param boolean $longinState - one of VIS_AUTH_AUTHENTICATED|VIS_AUTH_ANONYMOUS
-	 */
-	protected function getVisibleMetadata($metadataAsArray, $productTypeId) {
-		
-		// Determine whether the user is authenticated
-		$authState = (($ap = App::Get()->getAuthenticationProvider()) && $ap->isLoggedIn());
-		
-		$visibilityPolicyFilePath = dirname(dirname(__FILE__)) . '/element-visibility.ini';
-		if (file_exists($visibilityPolicyFilePath)) {
-			$visibilityPolicy = parse_ini_file($visibilityPolicyFilePath,true);
-			
-			$interpretation = $visibilityPolicy['interpretation.policy'];
-			$globalVisibilityPolicy = $visibilityPolicy['*'];
-			$productTypeVisibilityPolicy = isset($visibilityPolicy[$productTypeId])
-				? $visibilityPolicy[$productTypeId]
-				: array("visibility.always" => array(),
-						"visibility.anonymous" => array(),
-						"visibility.authenticated" => array());
-
-			// The visibility of a given metadata element is dependent upon
-			//   (1) the authentication status of the user (VIS_AUTH_AUTHENTICATED|VIS_AUTH_ANONYMOUS)
-			//   (2) the interpretation of the visibility policy (VIS_INTERPRET_SHOW|VIS_INTERPRET_HIDE)
-			//   
-			//   Using these values, determine which metadata to display:
-			switch ($interpretation) {
-				// If the policy defines only those metadata which should be hidden:
-				case self::VIS_INTERPRET_HIDE:
-					$displayMet = $metadataAsArray;                                     // everything is
shown unless explicitly hidden via the policy
-					foreach ($globalVisibilityPolicy['visibility.always'] as $elm)      // iterate through
the global 'always hide' array...
-						unset($displayMet[$elm]);                                       // and remove all listed
elements
-					foreach ($productTypeVisibilityPolicy['visibility.always'] as $elm) // now iterate through
the product-type 'always hide' array...
-						unset($displayMet[$elm]);                                       // and remove all listed
elements
-							
-					// Determine what to hide given the user's login state 
-					switch ($authState) {                                                             //
check the login status of the user
-						case self::VIS_AUTH_ANONYMOUS:                                                 // if
the user is anonymous...
-							foreach($globalVisibilityPolicy['visibility.anonymous'] as $elm)           // iterate
through the global 'anonymous hide' array...
-								unset($displayMet[$elm]);                                              // and remove
all listed elements
-							foreach ($productTypeVisibilityPolicy['visibility.anonymous'] as $elm)     // now
iterate through the product-type 'anonymous hide' array...
-								unset($displayMet[$elm]);                                              // and remove
all listed elements
-							break;                                                                     // done.
-						case self::VIS_AUTH_AUTHENTICATED:                                             // if
the user is authenticated...
-							foreach($globalVisibilityPolicy['visibility.authenticated'] as $elm)       // iterate
through the global 'authenticated hide' array...
-								unset($displayMet[$elm]);                                              // and remove
all listed elements
-							foreach ($productTypeVisibilityPolicy['visibility.authenticated'] as $elm) // now
iterate through the product-type 'authenticated hide' array...
-								unset($displayMet[$elm]);                                              // and remove
all listed elements
-							break;                                                                     // done.
-					}
-
-					break;
-				
-				// If the policy defines only those metadata which should be shown:
-				case self::VIS_INTERPRET_SHOW:
-					$displayMet = $globalVisibilityPolicy['visibility.always']                         //
merge the global 'always show' array
-						+ $productTypeVisibilityPolicy['visibility.always'];                           // with
the product-type specific 'always show' array
-					switch ($authState) {                                                              //
check the login status of the user
-						case self::VIS_AUTH_ANONYMOUS:                                                 // if
the user is anonymous...
-							$displayMet += $globalVisibilityPolicy['visibility.anonymous'];            // merge
the global 'anonymous show' array
-							$displayMet += $productTypeVisibilityPolicy['visibility.anonymous'];       // and
the product-type specific 'anonymous show' array
-							break;                                                                     // done.
-						case self::VIS_AUTH_AUTHENTICATED:                                             // if
the user is authenticated...
-							$displayMet += $globalVisibilityPolicy['visibility.authenticated'];        // merge
the global 'authenticated show' array 
-							$displayMet += $productTypeVisibilityPolicy['visibility.authenticated'];   // and
the product-type specific 'authenticated show' array
-							break;                                                                     // done.
-					}
-			}
-			
-			return $displayMet;	
-				
-		} else {
-			return $metadataAsArray;
-		}
-	}
-		
-	/**
-	 * Internal helper function to determine the visibility level of a given resource given
-	 * its array of security groups. The value returned is one of VIS_ALL,VIS_LIMIT,VIS_NONE.
-	 * 
-	 * @param array $resourceGroups - an array of security groups for the resource
-	 * @param string $policy        - one of VIS_LIMIT or VIS_DENY
-	 */	
-	protected function getResourceVisibility( $resourceGroups, $policy = CasBrowser::VIS_DENY
) {
+	// What kind of access should the currently authenticated user have, given the 
+	// provided groups (aka roles, permissions) associated with the resource?
+	//
+	// Possible values are: CasBrowser::{VIS_ALL, VIS_LIMIT, VIS_NONE}. It is up to the 
+	// caller to determine what to do based on the return value
+	//
+	public static function ResourceVisibility( $resourceGroups ) {
 		
 		// Is the resource considered "public"?
  		if (in_array(App::Get()->settings['browser_data_public_access'],$resourceGroups)) {

@@ -378,42 +122,34 @@ class CasBrowser {
 				
 			 	// Is the user currently logged in?
 			 	if ( $username ) {
-	 				
-			 		if ( $authorization = App::Get()->getAuthorizationProvider() ) {
-				 		// Obtain the groups for the current user
-				 		$userGroups = $authorization->retrieveGroupsForUser($username);
-				 		
-				 		// Perform a comparison via array intersection to determine overlap
-				 		$x = array_intersect($userGroups,$resourceGroups);
-				 		
-				 		if (empty($x)) { // No intersection found between user and resource groups
-				
-				 			// Examine the policy to determine how to handle the failure
-				 			switch ($policy) {
-				 				case CasBrowser::VIS_LIMIT:
-				 					// Allow the user to proceed, the metadata visibility policy
-				 					// will be used to determine what is visible to non-authorized
-				 					// users.
-				 					return CasBrowser::VIS_LIMIT;
-				 				default:
-				 					// Kick the user out at this point, deny all access. 
-					 				return CasBrowser::VIS_NONE;
-				 			}
-				 		} else {
-				 			// We have an authorized user
-				 			$authorizedUser = true;
-				 		}
+	 		
+			 		// Obtain the groups for the current user
+			 		$userGroups = App::Get()->getAuthorizationProvider()->retrieveGroupsForUser($username);
+			 			 		
+			 		// Perform a comparison via array intersection to determine overlap
+			 		$x = array_intersect($userGroups,$resourceGroups);
+			 		
+			 		if (empty($x)) { // No intersection found between user and resource groups
+			
+			 			// Examine `browser_pt_auth_policy` to determine how to handle the failure
+			 			switch (strtoupper(App::Get()->settings['browser_pt_auth_policy'])) {
+			 				case "LIMIT":
+			 					// Allow the user to proceed, the metadata visibility policy
+			 					// will be used to determine what is visible to non-authorized
+			 					// users.
+			 					return CasBrowser::VIS_LIMIT;				
+			 				case "DENY":
+			 				default:
+			 					// Kick the user out at this point, deny all access. 
+				 				return CasBrowser::VIS_NONE;
+			 			}
 			 		} else {
-			 			
-						// If no authorization provider information exists in the application
-					 	// configuration file, it is assumed that every user is authorized once
-					 	// logged in.
-					 	return CasBrowser::VIS_ALL;				 			
+			 			// We have an authorized user
+			 			$authorizedUser = true;
 			 		}
 			 	} else {
-			 		
 			 		// If no logged in user, and policy says DENY, kick the user
-			 		if ($policy == CasBrowser::VIS_DENY) {
+			 		if (strtoupper(App::Get()->settings[$metType]) == "DENY") {
 			 			return CasBrowser::VIS_NONE;
  			 		} else {
 			 			return CasBrowser::VIS_LIMIT;
@@ -437,11 +173,10 @@ class CasBrowser {
 			 		return CasBrowser::VIS_ALL; // We have an authorized user
 			 	} else {
 			 		// If no logged in user, and policy says DENY, kick the user
-			 		if ($policy == CasBrowser::VIS_DENY) {
+			 		if (strtoupper(App::Get()->settings[$metType]) == "DENY") {
 			 			return CasBrowser::VIS_NONE;
-			 		} else {
-			 			return CasBrowser::VIS_LIMIT;
 			 		}
+			 		return CasBrowser::VIS_LIMIT;
 			 	}
 		 	} else {
 			 	// If no authentication provider information exists in the application
@@ -452,4 +187,202 @@ class CasBrowser {
 			}
  		}
 	}
+	
+	// Create a criteria subtree that will search for the value at the given criteriaIndex across
all 
+	// metadata elements associated with the given productTypes.
+	public static function createBasicSearchSubtree($criteriaIndex, $queryTypes){
+		$criterion = new CAS_Filemgr_BooleanQueryCriteria();
+		$criterion->setOperator(CAS_Filemgr_BooleanQueryCriteria::$OR_OP);
+		$metadataNames = getMetadataElements($queryTypes);
+		foreach($metadataNames as $name){
+			$term = new CAS_Filemgr_TermQueryCriteria();
+			$term->setElementName($name);
+			$term->setValue($_POST['Criteria'][$criteriaIndex]['Value']);
+			$criterion->addTerm($term);
+		}
+		return $criterion;
+	}
+	
+	public static function createTermCriteria($criteriaIndex, $queryTypes){
+		if(!isset($_POST['Criteria'][$criteriaIndex]['ElementName'])){
+			throw new CasBrowserException("Query Term criterion " . $criteriaIndex . " does not contain
'ElementName' specification");
+		}
+		if(!isset($_POST['Criteria'][$criteriaIndex]['Value'])){
+			throw new CasBrowserException("Query Term criterion " . $criteriaIndex . " does not contain
'Value' specification");
+		}
+		if($_POST['Criteria'][$criteriaIndex]['ElementName'] == '*'){
+			$criterion = self::createBasicSearchSubtree($criteriaIndex, $queryTypes);
+		}else{
+			$criterion = new CAS_Filemgr_TermQueryCriteria();
+			$criterion->setElementName($_POST['Criteria'][$criteriaIndex]['ElementName']);
+			$criterion->setValue($_POST['Criteria'][$criteriaIndex]['Value']);
+		}
+		return $criterion;
+	}
+	
+	public static function createRangeCriteria($criteriaIndex){
+		if(!isset($_POST['Criteria'][$criteriaIndex]['ElementName'])){
+			throw new CasBrowserException("Query Term criterion " . $criteriaIndex . " does not contain
'ElementName' specification");
+		}
+		if(!isset($_POST['Criteria'][$criteriaIndex]['Min'])){
+			throw new CasBrowserException("Query Range criterion " . $criteriaIndex . " does not contain
'Min' specification");
+		}
+		if(!isset($_POST['Criteria'][$criteriaIndex]['Max'])){
+			throw new CasBrowserException("Query Range criterion " . $criteriaIndex . " does not contain
'Max' specification");
+		}
+		$criterion = new CAS_Filemgr_RangeQueryCriteria();
+		$criterion->setElementName($_POST['Criteria'][$criteriaIndex]['ElementName']);
+		$criterion->setStartValue($_POST['Criteria'][$criteriaIndex]['Min']);
+		$criterion->setEndValue($_POST['Criteria'][$criteriaIndex]['Max']);
+		if(isset($_POST['Criteria'][$criteriaIndex]['Inclusive'])){
+			$criterion->setInclusive($_POST['Criteria'][$criteriaIndex]['Inclusive']);
+		}
+		return $criterion;
+	}
+	
+	public static function createBooleanCriteria($criteriaIndex, $queryTypes, $createdIndices){
+		if(!isset($_POST['Criteria'][$criteriaIndex]['Operator'])){
+			throw new CasBrowserException("Query Boolean criterion " . $criteriaIndex . " does not
contain 'Operator' specification");
+		}
+		if(!isset($_POST['Criteria'][$criteriaIndex]['CriteriaTerms'])){
+			throw new CasBrowserException("Query Boolean criterion " . $criteriaIndex . " does not
contain 'CriteriaTerms' specification");
+		}
+		if(!count($_POST['Criteria'][$criteriaIndex]['CriteriaTerms'])){
+			throw new CasBrowserException("Query Boolean criterion " . $criteriaIndex . " does not
contain any terms");
+		}
+		$criterion = new CAS_Filemgr_BooleanQueryCriteria();
+		$operator = trim(strtoupper($_POST['Criteria'][$criteriaIndex]['Operator']));
+		if($operator == 'AND'){
+			$criterion->setOperator(CAS_Filemgr_BooleanQueryCriteria::$AND_OP);
+		}elseif($operator == 'OR'){
+			$criterion->setOperator(CAS_Filemgr_BooleanQueryCriteria::$OR_OP);
+		}elseif($operator == 'NOT'){
+			if(count($_POST['Criteria'][$criteriaIndex]['CriteriaTerms']) != 1){
+				throw new CasBrowserException("Query Boolean criterion " . $criteriaIndex . " cannot
negate more than one term");
+			}
+			$criterion->setOperator(CAS_Filemgr_BooleanQueryCriteria::$NOT_OP);
+		}else{
+			throw new CasBrowserException("Error: Query Boolean criterion " . $criteriaIndex . " tries
to use undefined operator '" . $operator . "'");
+		}
+		foreach(array_map("intval", $_POST['Criteria'][$criteriaIndex]['CriteriaTerms']) as $childIndex){
+			if(in_array($childIndex, $createdIndices)){		// Check for loops in criteria tree
+				throw new CasBrowserException("Criterion " . $criteriaIndex . " lists " . $childIndex
. "as a child, making a loop.");
+			}
+			array_push($createdIndices, $childIndex);
+			$child = self::createCriteriaTree($childIndex, $queryTypes);
+			$criterion->addTerm($child);
+		}
+		return $criterion;
+	}
+	
+	public static function createCriteriaTree($criteriaIndex, $queryTypes, $createdIndices=null){
+		if(!isset($createdIndices)){
+			$createdIndices = array();
+		}
+		if(!isset($_POST['Criteria'][$criteriaIndex])){
+			throw new CasBrowserException("Query Boolean criterion " . $criteriaIndex . " does not
exist.");
+		}
+		$type = strtolower($_POST['Criteria'][$criteriaIndex]['CriteriaType']);
+		if($type == 'term'){
+			$criterion = self::createTermCriteria($criteriaIndex, $queryTypes);
+		}elseif($type == 'range'){
+			$criterion = self::createRangeCriteria($criteriaIndex);
+		}elseif($type == 'boolean'){
+			$criterion = self::createBooleanCriteria($criteriaIndex, $queryTypes, $createdIndices);
+		}else{
+			throw new CasBrowserException("Query criterion " . $criteriaIndex . " contains an unknown
type " . $type . ".  Please use one of 'term', 'range' or 'boolean'");
+		}
+		return $criterion;
+	}
+	
+	public static function getMetadataNamesForTypeProducts($type){
+		$cb = new CasBrowser();
+		$client = $cb->getClient();
+		$elementNames = array();
+		foreach($client->getElementsByProductType($type) as $e){
+			array_push($elementNames, $e->getElementName());
+		}
+		foreach(array_keys($type->getTypeMetadata()->toAssocArray()) as $typeElementName){
+			if(!in_array($typeElementName, $elementNames)){
+				array_push($elementNames, $typeElementName);
+			}
+		}
+		return $elementNames;
+	}
+	
+	public static function getFacets(){
+		$cb = new CasBrowser();
+		$client = $cb->getClient();
+		$types = $client->getProductTypes();
+		$facets = self::getMetadataNamesForTypeProducts(array_pop($types));
+		if(count($types) == 0){
+			return $facets;	// In case there is only one product type
+		}
+		foreach($types as $type){
+			$elementNames = self::getMetadataNamesForTypeProducts($type);
+			$facets = array_intersect($facets, $elementNames);
+		}
+		return $facets;
+	}
+	
+	public static function paginate($allProducts, $pageNum, $pageSize){
+		if(count($allProducts) == 0){
+			return array();
+		}
+		if($pageSize <= 0){
+			throw new CasBrowserException("The given PageSize (" . $pageSize . ") was zero or less.");
+		}
+		$startIndex = ($pageNum - 1) * $pageSize;
+		if($startIndex >= count($allProducts)){
+			throw new CasBrowserException("The starting index of the requested page (" .
+					$startIndex . ") is greater than the last index of all products (" .
+					count($allProducts) . ").");
+		}
+		$endIndex = $startIndex + $pageSize - 1;
+		$endIndex = min($endIndex, count($allProducts) - 1);
+		$requestedProducts = array();
+		for($i = $startIndex; $i <= $endIndex; $i++){
+			array_push($requestedProducts, $allProducts[$i]);
+		}
+		return $requestedProducts;
+	}
+	
+	public static function formatResults($products){
+		$cb = new CasBrowser();
+		$client = $cb->getClient();
+		$results = array();
+		foreach($products as $product){
+			try{
+				$p = array('id'=>$product['product']->getId(),
+						'name'=>urlDecode($product['product']->getName()),
+						'metadata'=>$client->getMetadata($product['product'])->toAssocArray());
+				if(isset($product['typeName'])){
+					$p['type'] = $product['typeName'];
+				}
+				array_push($results, $p);
+			}catch(Exception $e){
+				throw new CasBrowserException("An error occured while formatting product [" .
+						$product['product']->getId() . "] metadata: " . $e->getMessage());
+			}
+		}
+		return $results;
+	}
+	
+	public static function reportError($message, $outputFormat){
+		if($outputFormat == 'html'){
+			echo '<div class="error">' . $message . '</div>';
+		}elseif($outputFormat == 'json'){
+			$payload = array();
+			$payload['Error'] = 1;
+			$payload['ErrorMsg'] = $message;
+			$payload = json_encode($payload);
+			echo $payload;
+		}
+		exit();
+	}
+	
 }
+
+class CasBrowserException extends Exception{}
+
+?>



Mime
View raw message