PHP Classes

File: ANYEM_SERVER/anyem.bsrv.impl/ResourceHolderImpl.php

Recommend this page to a friend!
  Classes of Anis Halayem   Anyem   ANYEM_SERVER/anyem.bsrv.impl/ResourceHolderImpl.php   Download  
File: ANYEM_SERVER/anyem.bsrv.impl/ResourceHolderImpl.php
Role: Class source
Content type: text/plain
Description: Class source
Class: Anyem
Exchange variable values between PHP servers
Author: By
Last change:
Date: 9 years ago
Size: 7,219 bytes
 

Contents

Class file image Download
<?php
require_once (__DIR__ . '/../../ANYEM_SHARED/' . 'anyem.bsrv.api/IResourceHolder.php');
require_once (
__DIR__ . '/../../ANYEM_SHARED/' . 'anyem.logger/apache-log4php-2.3.0/src/main/php/Logger.php');

/**
 *
 * @author Anis.Halayem
 */
class ResourceHolderImpl implements IResourceHolder {
   
/**
     *
     * @var array
     */
   
private static $_RESOURCE_POOL;
   
   
/**
     *
     * @var ResourceImpl
     */
   
private $_givenResource;

   
/**
     *
     * @var ResourceImpl
     */
   
private $_foundResource;
   
    private
$_resource_exist_b;
   
   
/**
     *
     * @var string
     */
   
private $_resource_identifer_merged_s;
   
/**
     *
     * @var string
     */
   
private $_action;
   
    private static
$_log;
   
    private static
$_initialized = FALSE;
    public static function
init() {
        if (!
self::$_initialized) {
           
self::$_RESOURCE_POOL = new Judy(Judy::STRING_TO_MIXED);
           
           
self::$_log = Logger::getLogger(__CLASS__);
           
self::$_initialized = TRUE;
        }
    }


    public function
__construct($action, $givenResource) {
       
$this->_action = $action;
       
$this->_givenResource = $givenResource;
       
/**
         * @var ResourceIdentifierImpl
         */
       
$resourceIdentifier = $this->_givenResource->getResourceIdenitifier();
       
$this->_resource_identifer_merged_s = $resourceIdentifier->getUrl() .
                                               
self::_RESOURCE_IDENTIFIER_SEPERATOR .
                                               
$resourceIdentifier->getNamespace() .
                                               
self::_RESOURCE_IDENTIFIER_SEPERATOR .
                                               
$resourceIdentifier->getName() ;
       
$this->resourceLookup();
    }
   
    private function
resourceLookup() {
       
$resource = &self::$_RESOURCE_POOL[$this->_resource_identifer_merged_s];
       
       
       
        if (isset(
$resource))
        {
           
$this->_foundResource = $resource;
           
$this->_resource_exist_b = TRUE;
           
self::$_log->info("Resource <" . $resource->toString() ."> was found in RESOURCE_POOL") ;
        }
        else {
           
$this->_foundResource = NULL;
           
$this->_resource_exist_b = FALSE;
           
self::$_log->info("Resource <" . $this->_givenResource->toString() ."> was not found in RESOURCE_POOL") ;
        }
    }
   
   public function
execute() {
        switch (
$this->_action) {
            case
self::_GET :
            {
                return
$this->execGet();
            }
            case
self::_PUT :
            {
                return
$this->execPut();
            }
            case
self::_RELEASE :
            {
               
$this->execRelease();
                break;
            }
            case
self::_READ : {
                return
$this->execRead();
            }
            case
self::_DELETE :
            {
                return
$this->execDelete();
            }
            default : {
               
self::$_log->error(sprintf("unknown action type: %s", $this->_action));
            }
        }
    }
   
   
/**
     *
     * @return string : ResourceImpl data
     */
   
private function execRead() {
        if (
$this->_resource_exist_b === FALSE) {
            throw new
Exception ("requested resource not found");
        }
        return(
$this->_foundResource) ;
    }
   
   
/**
     *
     * @throws Exception
     */
   
private function execPut() {
        if (
$this->_resource_exist_b === FALSE) {
           
$errorMessage = sprintf("can not execute <%s> on inexistant resource",
                                   
self::_PUT) ;
           
self::$_log->error ($errorMessage);
            throw new
Exception($errorMessage);
        }
       
$this->_foundResource->unreserve ($this->_givenResource->getTransactionId());
       
$this->_foundResource->setData ($this->_givenResource->getData());
       
       
self::$_log->info(sprintf("<%s> applied on this [%s] Object: <%s>",
                                 
self::_PUT,
                                 
get_class($this->_givenResource),
                                 
$this->_foundResource->toString()));
        return
NULL;
    }
   
    private function
execDelete() {
         if (
$this->_resource_exist_b === FALSE) {
           
$errorMessage = sprintf("can not execute <%s> on inexistant resource",
                                   
self::_DELETE) ;
           
self::$_log->error ($errorMessage);
            throw new
Exception($errorMessage);
        }
       
$this->deleteEntryResourcePool();
       
       
self::$_log->info(sprintf("<%s> applied on this [%s] Object: <%s>",
                                 
self::_DELETE,
                                 
get_class($this->_givenResource),
                                 
$this->_foundResource->toString()));
        return
NULL;
    }

   
/**
     * reserve and return the value if resource found
     * else, it will be added to the index and to the resource holder memory
     * @return ResourceImpl
     */
   
private function execGet() {
       
/**
         * var ResourceImpl
         */
       
$resource = NULL;
        if (
$this->_resource_exist_b === FALSE) {
           
$resource = $this->_givenResource;
        }
        else {
           
// WARNING : here i'am manipulating a resource passed by reference from _RESOURCE_POOL !!
           
$resource = $this->_foundResource ;
        }
       
$resource->reserve($this->_givenResource->getTransactionId());
       
$this->updateResourcePool($resource);
       
self::$_log->info(sprintf("<%s> applied on this <%s> Object: [%s]",
                                 
self::_GET,
                                 
get_class($resource),
                                 
$resource->toString()));
        return
$resource;
    }
   
/**
     *
     * @param ResourceImpl $resource
     */
   
private function updateResourcePool($resource) {
       
self::$_RESOURCE_POOL[$this->_resource_identifer_merged_s] = $resource;
    }
   
   
    private function
deleteEntryResourcePool () {
        unset (
self::$_RESOURCE_POOL[$this->_resource_identifer_merged_s]);
    }
   
   
   
    private function
execRelease() {
        if (
$this->_resource_exist_b === FALSE) {
           
$errorMessage = sprintf("can not execute <%s> on inexistant resource",
                                   
self::_RELEASE) ;
           
self::$_log->error ($errorMessage);
            throw new
Exception($errorMessage);
        }
       
$this->_foundResource->unreserve ($this->_givenResource->getTransactionId());
       
self::$_log->info(sprintf("<%s> applied on this [%s] Object: <%s>",
                                 
self::_RELEASE,
                                 
get_class($this->_givenResource),
                                 
$this->_foundResource->toString()));
        return
NULL;
    }
   
    public function
getResourcePool() {
        return
self::$_RESOURCE_POOL;
    }
}

ResourceHolderImpl::init();