icingaweb2-module-businessp.../library/Businessprocess/Modification/ProcessChanges.php

285 lines
6 KiB
PHP
Raw Normal View History

2015-03-16 04:08:00 -04:00
<?php
namespace Icinga\Module\Businessprocess\Modification;
2015-03-16 04:08:00 -04:00
2017-01-11 08:04:45 -05:00
use Icinga\Module\Businessprocess\BpConfig;
use Icinga\Module\Businessprocess\Node;
2015-03-16 04:08:00 -04:00
use Icinga\Web\Session\SessionNamespace as Session;
class ProcessChanges
{
/** @var NodeAction[] */
2015-03-16 04:08:00 -04:00
protected $changes = array();
/** @var Session */
2015-03-16 04:08:00 -04:00
protected $session;
/** @var bool */
2015-03-16 04:08:00 -04:00
protected $hasBeenModified = false;
/** @var string Session storage key for this processes changes */
2015-03-16 04:08:00 -04:00
protected $sessionKey;
/**
* ProcessChanges constructor.
*
* Direct access is not allowed
*/
2015-03-16 04:08:00 -04:00
private function __construct()
{
}
/**
2017-01-11 08:04:45 -05:00
* @param BpConfig $bp
* @param Session $session
*
* @return ProcessChanges
*/
2017-01-11 08:04:45 -05:00
public static function construct(BpConfig $bp, Session $session)
2015-03-16 04:08:00 -04:00
{
$key = 'changes.' . $bp->getName();
$changes = new ProcessChanges();
$changes->sessionKey = $key;
if ($actions = $session->get($key)) {
foreach ($actions as $string) {
$changes->push(NodeAction::unSerialize($string));
2015-03-16 04:08:00 -04:00
}
}
$changes->session = $session;
return $changes;
}
/**
* @param Node $node
* @param $properties
*
* @return $this
*/
2015-03-16 04:08:00 -04:00
public function modifyNode(Node $node, $properties)
{
$action = new NodeModifyAction($node);
$action->setNodeProperties($node, $properties);
return $this->push($action);
}
2016-11-29 09:32:56 -05:00
/**
* @param Node $node
* @param $properties
*
* @return $this
*/
public function addChildrenToNode($children, Node $node = null)
2016-11-29 09:32:56 -05:00
{
$action = new NodeAddChildrenAction($node);
$action->setChildren($children);
2016-11-29 09:32:56 -05:00
return $this->push($action);
}
/**
* @param Node|string $nodeName
* @param array $properties
* @param Node $parent
*
* @return $this
*/
2015-03-16 04:08:00 -04:00
public function createNode($nodeName, $properties, Node $parent = null)
{
$action = new NodeCreateAction($nodeName);
$action->setProperties($properties);
if ($parent !== null) {
$action->setParent($parent);
}
return $this->push($action);
}
/**
* @param $nodeName
* @param Node|null $parent
* @return $this
*/
public function copyNode($nodeName)
{
$action = new NodeCopyAction($nodeName);
return $this->push($action, true);
}
/**
* @param Node $node
* @param string $parentName
* @return $this
*/
public function deleteNode(Node $node, $parentName = null)
2015-03-16 04:08:00 -04:00
{
$action = new NodeRemoveAction($node);
if ($parentName !== null) {
$action->setParentName($parentName);
}
return $this->push($action);
2015-03-16 04:08:00 -04:00
}
/**
* Move the given node
*
* @param Node $node
* @param int $from
* @param int $to
* @param string $parentName
*
* @return $this
*/
public function moveNode(Node $node, $from, $to, $parentName = null)
{
$action = new NodeMoveAction($node);
$action->setParentName($parentName);
$action->setFrom($from);
$action->setTo($to);
return $this->push($action);
}
/**
* Apply manual order on the entire bp configuration file
*
* @return $this
*/
public function applyManualOrder()
{
return $this->push(new NodeApplyManualOrderAction());
}
/**
* Add a new action to the stack
*
* @param NodeAction $change
*
* @return $this
*/
2015-03-16 04:08:00 -04:00
public function push(NodeAction $change)
{
$this->changes[] = $change;
$this->hasBeenModified = true;
return $this;
}
/**
* Get all stacked actions
*
* @return NodeAction[]
*/
2015-03-16 04:08:00 -04:00
public function getChanges()
{
return $this->changes;
}
/**
* Forget all changes and remove them from the Session
*
* @return $this
*/
2015-03-16 04:08:00 -04:00
public function clear()
{
$this->hasBeenModified = true;
$this->changes = array();
$this->session->set($this->getSessionKey(), null);
return $this;
}
/**
* Whether there are no stacked changes
*
* @return bool
*/
2015-03-16 04:08:00 -04:00
public function isEmpty()
{
return $this->count() === 0;
}
/**
* Number of stacked changes
*
* @return bool
*/
2015-03-16 04:08:00 -04:00
public function count()
{
return count($this->changes);
}
/**
* Get the first change on the stack, false if empty
*
* @return NodeAction|boolean
*/
2015-03-16 04:08:00 -04:00
public function shift()
{
if ($this->isEmpty()) {
return false;
}
$this->hasBeenModified = true;
return array_shift($this->changes);
}
/**
* Get the last change on the stack, false if empty
*
* @return NodeAction|boolean
*/
2015-03-16 04:08:00 -04:00
public function pop()
{
if ($this->isEmpty()) {
return false;
}
$this->hasBeenModified = true;
return array_pop($this->changes);
}
/**
* The identifier used for this processes changes in our Session storage
*
* @return string
*/
2015-03-16 04:08:00 -04:00
protected function getSessionKey()
{
return $this->sessionKey;
}
protected function hasBeenModified()
{
return $this->hasBeenModified;
}
/**
* @return array
*/
2015-03-16 04:08:00 -04:00
public function serialize()
{
$serialized = array();
foreach ($this->getChanges() as $change) {
$serialized[] = $change->serialize();
}
return $serialized;
}
/**
* Persist to session on destruction
*/
2015-03-16 04:08:00 -04:00
public function __destruct()
{
if (! $this->hasBeenModified()) {
unset($this->session);
return;
}
$session = $this->session;
$key = $this->getSessionKey();
if (! $this->isEmpty()) {
$session->set($key, $this->serialize());
}
unset($this->session);
}
}