Changeset View
Changeset View
Standalone View
Standalone View
src/hardpoint/ArcanistHardpointRequest.php
- This file was added.
<?php | |||||
final class ArcanistHardpointRequest | |||||
extends Phobject { | |||||
private $engine; | |||||
private $objects; | |||||
private $hardpoint; | |||||
private $hardpointDefinition; | |||||
private $tasks = array(); | |||||
private $isComplete; | |||||
public static function newFromSpecification($spec) { | |||||
if ($spec instanceof ArcanistHardpointRequest) { | |||||
return $spec; | |||||
} | |||||
if (is_string($spec)) { | |||||
return id(new self())->setHardpoint($spec); | |||||
} | |||||
throw new Exception( | |||||
pht( | |||||
'Unknown Hardpoint request specification (of type "%s").', | |||||
phutil_describe_type($spec))); | |||||
} | |||||
public function setEngine(ArcanistHardpointEngine $engine) { | |||||
$this->engine = $engine; | |||||
return $this; | |||||
} | |||||
public function getEngine() { | |||||
return $this->engine; | |||||
} | |||||
public function setHardpoint($hardpoint) { | |||||
$this->hardpoint = $hardpoint; | |||||
return $this; | |||||
} | |||||
public function getHardpoint() { | |||||
return $this->hardpoint; | |||||
} | |||||
public function setObjects(array $objects) { | |||||
$this->objects = $objects; | |||||
return $this; | |||||
} | |||||
public function getObjects() { | |||||
return $this->objects; | |||||
} | |||||
public function newTask() { | |||||
$task = id(new ArcanistHardpointTask()) | |||||
->setRequest($this); | |||||
$this->tasks[] = $task; | |||||
$this->isComplete = false; | |||||
return $task; | |||||
} | |||||
public function isComplete() { | |||||
return $this->isComplete; | |||||
} | |||||
public function getTasks() { | |||||
return $this->tasks; | |||||
} | |||||
public function updateTasks() { | |||||
$any_progress = false; | |||||
foreach ($this->tasks as $task) { | |||||
$did_update = $task->updateTask(); | |||||
if ($did_update) { | |||||
$any_progress = true; | |||||
} | |||||
} | |||||
foreach ($this->tasks as $task_key => $task) { | |||||
if ($task->isComplete()) { | |||||
unset($this->tasks[$task_key]); | |||||
} | |||||
} | |||||
if (!$this->tasks) { | |||||
// TODO: We can skip or modify this check if the hardpoint is a vector | |||||
// hardpoint. | |||||
$objects = $this->getObjects(); | |||||
$hardpoint = $this->getHardpoint(); | |||||
foreach ($objects as $object) { | |||||
if (!$object->hasAttachedHardpoint($hardpoint)) { | |||||
throw new Exception( | |||||
pht( | |||||
'Unable to load hardpoint "%s" for object (of type "%s"). '. | |||||
'All hardpoint query tasks resolved but none attached '. | |||||
'a value to the hardpoint.', | |||||
$hardpoint, | |||||
phutil_describe_type($object))); | |||||
} | |||||
} | |||||
// We may arrive here if a request is queued that can be satisfied | |||||
// immediately, most often because it requests hardpoints which are | |||||
// already attached. We don't have to do any work, so we have no tasks | |||||
// to update or complete and can complete the request immediately. | |||||
if (!$this->isComplete) { | |||||
$any_progress = true; | |||||
} | |||||
$this->isComplete = true; | |||||
} | |||||
return $any_progress; | |||||
} | |||||
public function setHardpointDefinition($hardpoint_definition) { | |||||
$this->hardpointDefinition = $hardpoint_definition; | |||||
return $this; | |||||
} | |||||
public function getHardpointDefinition() { | |||||
return $this->hardpointDefinition; | |||||
} | |||||
} |