Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2889571
ArcanistHardpointTask.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Advanced/Developer...
View Handle
View Hovercard
Size
6 KB
Referenced Files
None
Subscribers
None
ArcanistHardpointTask.php
View Options
<?php
final
class
ArcanistHardpointTask
extends
Phobject
{
private
$request
;
private
$query
;
private
$objects
;
private
$isComplete
;
private
$generator
;
private
$hasRewound
;
private
$sendFuture
;
private
$blockingRequests
=
array
(
)
;
private
$blockingFutures
=
array
(
)
;
public
function
setRequest
(
ArcanistHardpointRequest
$request
)
{
$this
->
request
=
$request
;
return
$this
;
}
public
function
getRequest
(
)
{
return
$this
->
request
;
}
public
function
setQuery
(
ArcanistHardpointQuery
$query
)
{
$this
->
query
=
$query
;
return
$this
;
}
public
function
getQuery
(
)
{
return
$this
->
query
;
}
public
function
setObjects
(
array
$objects
)
{
$this
->
objects
=
$objects
;
return
$this
;
}
public
function
getObjects
(
)
{
return
$this
->
objects
;
}
public
function
isComplete
(
)
{
return
$this
->
isComplete
;
}
public
function
updateTask
(
)
{
if
(
$this
->
isComplete
(
)
)
{
return
false
;
}
// If we're blocked by other requests, we have to wait for them to
// resolve.
if
(
$this
->
getBlockingRequests
(
)
)
{
return
false
;
}
// If we're blocked by futures, we have to wait for them to resolve.
if
(
$this
->
getBlockingFutures
(
)
)
{
return
false
;
}
$query
=
$this
->
getQuery
(
)
;
// If we've previously produced a generator, iterate it.
if
(
$this
->
generator
)
{
$generator
=
$this
->
generator
;
$has_send
=
false
;
$send_value
=
null
;
// If our last iteration generated a single future and it was marked to
// be sent back to the generator, resolve the future (it should already
// be ready to resolve) and send the result.
if
(
$this
->
sendFuture
)
{
$has_send
=
true
;
$future
=
$this
->
sendFuture
;
$this
->
sendFuture
=
null
;
$send_value
=
$future
->
resolve
(
)
;
}
if
(
$has_send
&&
!
$this
->
hasRewound
)
{
throw
new
Exception
(
pht
(
'Generator has never rewound, but has a value to send. This '
.
'is invalid.'
)
)
;
}
if
(
!
$this
->
hasRewound
)
{
$this
->
hasRewound
=
true
;
$generator
->
rewind
(
)
;
}
else
if
(
$has_send
)
{
$generator
->
send
(
$send_value
)
;
}
else
{
$generator
->
next
(
)
;
}
$generator_result
=
null
;
if
(
$generator
->
valid
(
)
)
{
$result
=
$generator
->
current
(
)
;
if
(
$result
instanceof
Future
)
{
$result
=
ArcanistHardpointFutureList
::
newFromFutures
(
array
(
$result
)
)
;
}
if
(
$result
instanceof
ArcanistHardpointFutureList
)
{
$futures
=
$result
->
getFutures
(
)
;
$is_send
=
$result
->
getSendResult
(
)
;
$this
->
getRequest
(
)
->
getEngine
(
)
->
addFutures
(
$futures
)
;
foreach
(
$futures
as
$future
)
{
$this
->
blockingFutures
[
]
=
$future
;
}
if
(
$is_send
)
{
if
(
count
(
$futures
)
===
1
)
{
$this
->
sendFuture
=
head
(
$futures
)
;
}
else
{
throw
new
Exception
(
pht
(
'Hardpoint future list is marked to send results to the '
.
'generator, but the list does not have exactly one future '
.
'(it has %s).'
,
phutil_count
(
$futures
)
)
)
;
}
}
return
true
;
}
$is_request
=
(
$result
instanceof
ArcanistHardpointRequest
)
;
$is_request_list
=
(
$result
instanceof
ArcanistHardpointRequestList
)
;
if
(
$is_request
||
$is_request_list
)
{
if
(
$is_request
)
{
$request_list
=
array
(
$result
)
;
}
else
{
$request_list
=
$result
->
getRequests
(
)
;
}
// TODO: Make sure these requests have already been added to the
// engine.
foreach
(
$request_list
as
$blocking_request
)
{
$this
->
blockingRequests
[
]
=
$blocking_request
;
}
return
true
;
}
if
(
$result
instanceof
ArcanistHardpointTaskResult
)
{
$generator_result
=
$result
;
}
else
{
throw
new
Exception
(
pht
(
'Hardpoint generator (for query "%s") yielded an unexpected '
.
'value (of type "%s").'
,
get_class
(
$query
)
,
phutil_describe_type
(
$result
)
)
)
;
}
}
$this
->
generator
=
null
;
if
(
$generator_result
!==
null
)
{
$result
=
$generator_result
->
getValue
(
)
;
}
else
{
$result
=
$generator
->
getReturn
(
)
;
if
(
$result
instanceof
ArcanistHardpointTaskResult
)
{
throw
new
Exception
(
pht
(
'Generator (for query "%s") returned an '
.
'"ArcanistHardpointTaskResult" object, which is not a valid '
.
'thing to return from a generator.'
.
"\n\n"
.
'This almost always means the generator implementation has a '
.
'"return $this->yield..." statement which should be '
.
'a "yield $this->yield..." instead.'
,
get_class
(
$query
)
)
)
;
}
}
$this
->
attachResult
(
$result
)
;
return
true
;
}
$objects
=
$this
->
getObjects
(
)
;
$hardpoint
=
$this
->
getRequest
(
)
->
getHardpoint
(
)
;
$result
=
$query
->
loadHardpoint
(
$objects
,
$hardpoint
)
;
if
(
$result
instanceof
Generator
)
{
$this
->
generator
=
$result
;
$this
->
hasRewound
=
false
;
// If we produced a generator, we can attempt to iterate it immediately.
return
$this
->
updateTask
(
)
;
}
$this
->
attachResult
(
$result
)
;
return
true
;
}
public
function
getBlockingRequests
(
)
{
$blocking
=
array
(
)
;
foreach
(
$this
->
blockingRequests
as
$key
=>
$request
)
{
if
(
!
$request
->
isComplete
(
)
)
{
$blocking
[
$key
]
=
$request
;
}
}
$this
->
blockingRequests
=
$blocking
;
return
$blocking
;
}
public
function
getBlockingFutures
(
)
{
$blocking
=
array
(
)
;
foreach
(
$this
->
blockingFutures
as
$key
=>
$future
)
{
if
(
!
$future
->
hasResult
(
)
&&
!
$future
->
hasException
(
)
)
{
$blocking
[
$key
]
=
$future
;
}
}
$this
->
blockingFutures
=
$blocking
;
return
$blocking
;
}
private
function
attachResult
(
$result
)
{
$objects
=
$this
->
getObjects
(
)
;
$hardpoint
=
$this
->
getRequest
(
)
->
getHardpoint
(
)
;
$definition
=
$this
->
getRequest
(
)
->
getHardpointDefinition
(
)
;
$is_vector
=
$definition
->
isVectorHardpoint
(
)
;
foreach
(
$result
as
$object_key
=>
$value
)
{
if
(
!
isset
(
$objects
[
$object_key
]
)
)
{
throw
new
Exception
(
pht
(
'Bad object key ("%s").'
,
$object_key
)
)
;
}
$object
=
$objects
[
$object_key
]
;
if
(
$is_vector
)
{
$object
->
mergeHardpoint
(
$hardpoint
,
$value
)
;
}
else
{
if
(
!
$object
->
hasAttachedHardpoint
(
$hardpoint
)
)
{
$object
->
attachHardpoint
(
$hardpoint
,
$value
)
;
}
}
}
$this
->
isComplete
=
true
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sun, Jan 19, 12:21 (3 w, 4 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1124505
Default Alt Text
ArcanistHardpointTask.php (6 KB)
Attached To
Mode
rARC Arcanist
Attached
Detach File
Event Timeline
Log In to Comment