Skip to content

Commit 4e2bcbe

Browse files
committed
Introduced additional properties for ClientRequest to allow manage request queue
1 parent 471b977 commit 4e2bcbe

File tree

8 files changed

+115
-49
lines changed

8 files changed

+115
-49
lines changed

src/Runtime/CSOM/CSOMRequest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,16 @@ protected function setRequestHeaders(RequestOptions $request)
5757
* @param $response
5858
* @param $resultObject
5959
*/
60-
public function processResponse($response, $resultObject)
60+
public function processResponse($response)
6161
{
6262
// TODO: Implement processResponse() method.
6363
}
6464

6565
/**
6666
* Build Client Request
67-
* @param ClientAction $query
6867
* @return RequestOptions
6968
*/
70-
protected function buildRequest(ClientAction $query)
69+
protected function buildRequest()
7170
{
7271
// TODO: Implement buildRequest() method.
7372
}

src/Runtime/ClientRequest.php

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66

77
use Office365\PHP\Client\Runtime\OData\ODataQueryOptions;
8+
use Office365\PHP\Client\Runtime\Utilities\Guid;
89
use Office365\PHP\Client\Runtime\Utilities\RequestOptions;
910
use Office365\PHP\Client\Runtime\Utilities\Requests;
1011

@@ -37,6 +38,14 @@ abstract class ClientRequest
3738
protected $resultObjects = array();
3839

3940

41+
/** @var Guid */
42+
protected $requestId;
43+
44+
45+
/** @var integer */
46+
protected $requestStatus;
47+
48+
4049
/**
4150
* ClientRequest constructor.
4251
* @param ClientRuntimeContext $context
@@ -48,6 +57,8 @@ public function __construct(ClientRuntimeContext $context)
4857
"BeforeExecuteQuery" => null,
4958
"AfterExecuteQuery" => null
5059
);
60+
$this->requestId = Guid::newGuid();
61+
$this->requestStatus = ClientRequestStatus::Active;
5162
}
5263

5364
/**
@@ -135,11 +146,14 @@ public function getActions(){
135146
}
136147

137148
/**
138-
* Clears all queries and resultObjects.
149+
* @return int
139150
*/
140-
public function clear()
141-
{
142-
$this->queries = [];
143-
$this->resultObjects = [];
151+
public function getRequestStatus(){
152+
return $this->requestStatus;
144153
}
154+
155+
/**
156+
* @return ClientRequest
157+
*/
158+
public abstract function getNextRequest();
145159
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
4+
namespace Office365\PHP\Client\Runtime;
5+
6+
abstract class ClientRequestStatus
7+
{
8+
const Active = 1;
9+
const InProgress = 2;
10+
const CompletedSuccess = 3;
11+
const CompletedException = 4;
12+
}
13+

src/Runtime/ClientRuntimeContext.php

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -134,23 +134,14 @@ public function loadQuery(ClientObject $clientObject,ODataQueryOptions $query =
134134
/**
135135
* Submit client request to SharePoint OData/SOAP service
136136
*
137-
* @return self
138137
*/
139138
public function executeQuery()
140139
{
141140
while ($this->hasPendingRequest()) {
142141
$this->getPendingRequest()->executeQuery();
143142
}
144-
return $this;
145143
}
146144

147-
/**
148-
* @return bool
149-
*/
150-
public function hasPendingRequest(){
151-
$queries = $this->pendingRequest->getActions();
152-
return !empty($queries);
153-
}
154145

155146

156147
/**
@@ -192,20 +183,24 @@ public function getPendingRequest()
192183
if (!isset($this->pendingRequest)) {
193184
$this->pendingRequest = new ODataRequest($this);
194185
}
186+
if($this->pendingRequest->getRequestStatus() != ClientRequestStatus::Active){
187+
$this->pendingRequest = $this->pendingRequest->getNextRequest();
188+
}
195189
return $this->pendingRequest;
196190
}
197191

192+
198193
/**
199-
* Removes the pending request.
194+
* @return bool
200195
*/
201-
public function removePendingRequest()
196+
public function hasPendingRequest()
202197
{
203-
if (!isset($this->pendingRequest)) {
204-
return;
205-
}
206-
unset($this->pendingRequest);
198+
$request = $this->getPendingRequest();
199+
return ($request->getRequestStatus() == ClientRequestStatus::Active &&
200+
count($request->getActions()) > 0);
207201
}
208202

203+
209204
/**
210205
* @return Version
211206
*/

src/Runtime/OData/ODataRequest.php

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Exception;
88
use Office365\PHP\Client\Runtime\ClientAction;
9+
use Office365\PHP\Client\Runtime\ClientRequestStatus;
910
use Office365\PHP\Client\Runtime\ClientResult;
1011
use Office365\PHP\Client\Runtime\IEntityType;
1112
use Office365\PHP\Client\Runtime\InvokeMethodQuery;
@@ -17,13 +18,13 @@
1718
use Office365\PHP\Client\SharePoint\ChangeLogItemQuery;
1819

1920

21+
2022
/**
2123
* Client Request for OData provider.
2224
*/
2325
class ODataRequest extends ClientRequest
2426
{
2527

26-
2728
public function __construct(ClientRuntimeContext $context)
2829
{
2930
parent::__construct($context);
@@ -35,19 +36,25 @@ public function __construct(ClientRuntimeContext $context)
3536
*/
3637
public function executeQuery()
3738
{
38-
$request = $this->buildRequest();
39-
if (is_callable($this->eventsList["BeforeExecuteQuery"])) {
40-
call_user_func_array($this->eventsList["BeforeExecuteQuery"], array(
41-
$request,
42-
$this->getCurrentAction()
43-
));
39+
try{
40+
$request = $this->buildRequest();
41+
if (is_callable($this->eventsList["BeforeExecuteQuery"])) {
42+
call_user_func_array($this->eventsList["BeforeExecuteQuery"], array(
43+
$request,
44+
$this->getCurrentAction()
45+
));
46+
}
47+
$responseInfo = array();
48+
$response = $this->executeQueryDirect($request, $responseInfo);
49+
if (!empty($response)) {
50+
$this->processResponse($response);
51+
}
52+
$this->requestStatus = ClientRequestStatus::CompletedSuccess;
4453
}
45-
$responseInfo = array();
46-
$response = $this->executeQueryDirect($request, $responseInfo);
47-
if (!empty($response)) {
48-
$this->processResponse($response);
54+
catch(Exception $e){
55+
$this->requestStatus = ClientRequestStatus::CompletedException;
56+
throw $e;
4957
}
50-
array_shift($this->queries);
5158
}
5259

5360

@@ -57,12 +64,11 @@ public function executeQuery()
5764
*/
5865
public function processResponse($response)
5966
{
60-
6167
if (!array_key_exists($this->getCurrentAction()->getId(), $this->resultObjects)) {
6268
return;
6369
}
64-
6570
$resultObject = $this->resultObjects[$this->getCurrentAction()->getId()];
71+
6672
if ($this->getCurrentAction() instanceof InvokePostMethodQuery && $this->getCurrentAction()->MethodBody instanceof ChangeLogItemQuery) {
6773
$payload = $this->parseXmlResponse($response);
6874
} else {
@@ -78,7 +84,6 @@ public function processResponse($response)
7884
$this->getSerializationContext()->map($payload,$resultObject);
7985
$this->getCurrentAction()->getResourcePath()->ServerObjectIsNull = false;
8086
}
81-
unset($this->resultObjects[$this->getCurrentAction()->getId()]);
8287
}
8388

8489

@@ -191,7 +196,19 @@ protected function getSerializationContext()
191196
* @return ClientAction|InvokePostMethodQuery
192197
*/
193198
protected function getCurrentAction(){
194-
return current($this->getActions());
199+
return current($this->queries);
195200
}
196201

202+
203+
public function getNextRequest()
204+
{
205+
$request = new ODataRequest($this->context);
206+
if(count($this->queries) > 1) {
207+
$request->queries = array_slice($this->queries, 1, count($this->queries)-1, true);
208+
$request->resultObjects = $this->resultObjects;
209+
}
210+
return $request;
211+
}
212+
213+
197214
}

tests/ClientContextTests.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
4+
class ClientContextTests extends SharePointTestCase
5+
{
6+
public function testIfSingleRequestProcessed()
7+
{
8+
try{
9+
$listTitle = "Orders_" . rand(1,100000);
10+
$list = self::$context->getWeb()->getLists()->getByTitle($listTitle);
11+
self::$context->load($list);
12+
self::$context->executeQuery();
13+
self::assertFalse(self::$context->hasPendingRequest());
14+
}
15+
catch(Exception $e){
16+
self::assertFalse(self::$context->hasPendingRequest());
17+
}
18+
}
19+
20+
21+
public function testIfMultipleRequestsProcessed()
22+
{
23+
$numOfQueries = 2;
24+
try {
25+
for ($i = 0;$i < $numOfQueries; $i++) {
26+
$listTitle = "Orders_" . rand(1, 100000);
27+
$list = self::$context->getWeb()->getLists()->getByTitle($listTitle);
28+
self::$context->load($list);
29+
}
30+
self::$context->executeQuery();
31+
self::assertFalse(self::$context->hasPendingRequest());
32+
} catch (Exception $e) {
33+
self::assertTrue(self::$context->hasPendingRequest());
34+
}
35+
}
36+
37+
}

tests/ListTest.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
<?php
22

33

4-
require_once('SharePointTestCase.php');
5-
require_once('ListItemExtensions.php');
6-
7-
8-
9-
104
class ListTest extends SharePointTestCase
115
{
6+
127
public function testIfListCreated()
138
{
149
$listTitle = "Orders_" . rand(1,100000);
@@ -69,6 +64,4 @@ public function testDeleteList(\Office365\PHP\Client\SharePoint\SPList $listToDe
6964
$this->assertEquals(0,$result->getCount());
7065
}
7166

72-
73-
7467
}

tests/SharePointTestCase.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ public static function setUpBeforeClass()
2020
$authCtx->acquireTokenForUser($Settings['UserName'],$Settings['Password']);
2121
//$authCtx->acquireTokenForApp($AppSettings['ClientId'],$AppSettings['ClientSecret'],$AppSettings['RedirectUrl']);
2222
self::$context = new ClientContext($Settings['Url'],$authCtx);
23-
24-
2523
}
2624

2725
public static function tearDownAfterClass()

0 commit comments

Comments
 (0)