<?php
require_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();
|