| 
<?phprequire_once (__DIR__ . '/../../ANYEM_SHARED/' . 'anyem.bsrv.api/IResourceHolder.php');
 require_once (__DIR__ . '/../../ANYEM_SHARED/' . 'anyem.resource.impl/ResourceWrapper.php');
 require_once (__DIR__ . '/../../ANYEM_SHARED/' . 'anyem.resource.impl/ResourceImpl.php');
 require_once (__DIR__ . '/../../ANYEM_SHARED/' . 'anyem.resource.impl/ResponseWrapperImpl.php') ;
 require_once (__DIR__ . '/../../ANYEM_SHARED/' . 'anyem.logger/apache-log4php-2.3.0/src/main/php/Logger.php');
 
 require_once (__DIR__ . '/../anyem.client.api/IClient.php');
 require_once (__DIR__ . '/../anyem.client.impl/ClientConnectionImpl.php');
 
 /**
 *
 * @author Anis.Halayem
 */
 class ClientImpl implements IClient{
 
 /**
 *
 * @var ClientConnectionImpl
 */
 private $_clientConnection;
 
 /**
 *
 * @var ResourceIdentifierImpl
 */
 private $_resourceIdentifier;
 
 /**
 * @var ResourceImpl
 */
 private $_resource;
 
 private static $_log;
 
 private static $_initialized = FALSE;
 public static function init() {
 if (self::$_initialized === TRUE) {
 return ;
 }
 Logger::configure (__DIR__ . '/../config/log4php/config.xml') ;
 self::$_log         = Logger::getLogger(__CLASS__);
 self::$_initialized = TRUE;
 }
 
 /**
 *
 * @param ClientConnectionImpl      $clientConnection
 * @param ResourceIdentifierImpl    $resourceIdentifier
 */
 public function __construct ($clientConnection, $resourceIdentifier) {
 $this->_clientConnection    =   $clientConnection;
 $this->_resourceIdentifier  =   $resourceIdentifier;
 }
 
 /**
 *
 * @param string $action
 * @return ResponseWrapperImpl
 * @throws Exception
 */
 private function execute ($action) {
 /**
 * @var ResourceWrapper
 */
 $resourceWrapper    = new ResourceWrapper ($this->_resource, $action);
 $socket             = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);
 if ($socket === FALSE) {
 $fatalMsg           = "socket_create, reason : " .  socket_strerror (socket_last_error()) ;
 self::$_log->fatal  ($fatalMsg);
 throw new Exception ($fatalMsg);
 }
 if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
 $fatalMsg           = "socket_set_option, reason : " .  socket_strerror (socket_last_error()) ;
 self::$_log->fatal  ($fatalMsg);
 throw new Exception ($fatalMsg);
 }
 
 self::$_log->info("socket created successfully...");
 
 $result             = socket_connect ($socket,
 $this->_clientConnection->getServerAddr(),
 $this->_clientConnection->getServerPort());
 if ($result === FALSE) {
 $fatalMsg           = "socket_connect, reason : " .  socket_strerror (socket_last_error()) ;
 self::$_log->fatal  ($fatalMsg);
 throw new Exception ($fatalMsg);
 }
 self::$_log->info("socket connected successfully...");
 
 $clientRequest      = self::CLIENT_HEADER . serialize($resourceWrapper);
 $result2            = socket_write ($socket,
 $clientRequest,
 strlen ($clientRequest));
 if ($result2 === FALSE) {
 $fatalMsg           = "socket_write, reason : " .  socket_strerror (socket_last_error()) ;
 self::$_log->fatal  ($fatalMsg);
 throw new Exception ($fatalMsg);
 }
 self::$_log->info   ("socket wrote successfully...");
 self::$_log->debug  ("client wrote this <ResourceWrapper> : " . print_r ($resourceWrapper, TRUE));
 
 $serverResponse = socket_read($socket,
 $this->_clientConnection->getMaxResourceSerializedLength());
 if ($serverResponse === FALSE) {
 $fataMsg = "socket_read,reason : " .  socket_strerror (socket_last_error ($socket));
 self::$_log->error  ($fataMsg);
 throw new Exception ($fataMsg);
 }
 /**
 * var ResponseWrapperImpl
 */
 $responseResourceWrapper = unserialize ($serverResponse);
 self::$_log->debug ("response received from server : " . print_r ($responseResourceWrapper, TRUE))  ;
 
 // @param2 - 0 => block reading in socket ...
 socket_shutdown ($socket, 0);
 socket_close    ($socket)   ;
 unset           ($socket)   ;
 
 self::$_log->info ("connection terminated with server ...");
 
 return $responseResourceWrapper;
 }
 
 /**
 *
 * @param ResourceIdentifierImpl $resourceIdentifier
 * @param mixed $data_m
 * @return ResponseWrapperImpl Description
 */
 public function get ($data_m) {
 $this->_resource = new ResourceImpl ($this->_resourceIdentifier, $data_m);
 return $this->execute(IResourceHolder::_GET);
 }
 
 /**
 *
 * @param mixed $data_m
 * @return ResponseWrapperImpl Description
 */
 public function put($data_m) {
 $this->_resource->setData($data_m);
 return $this->execute(IResourceHolder::_PUT);
 }
 
 public function release() {
 return $this->execute(IResourceHolder::_RELEASE);
 }
 
 /**
 *
 * @return ResponseWrapperImpl
 * @throws Exception
 */
 public function read() {
 $this->_resource = new ResourceImpl ($this->_resourceIdentifier, NULL);
 return $this->execute(IResourceHolder::_READ);
 }
 
 public function delete() {
 $this->_resource = new ResourceImpl ($this->_resourceIdentifier, NULL);
 return $this->execute(IResourceHolder::_DELETE);
 }
 }
 ClientImpl::init();
 |