blob: 08ddca847ad77d3d94eb1a26d5ad94703ade4d8e [file] [log] [blame]
<?php
namespace Adldap\Models;
use InvalidArgumentException;
/**
* Class BatchModification.
*
* A utility class to assist in the creation of LDAP
* batch modifications and ensure their validity.
*/
class BatchModification
{
/**
* The array keys to be used in batch modifications.
*/
const KEY_ATTRIB = 'attrib';
const KEY_MODTYPE = 'modtype';
const KEY_VALUES = 'values';
/**
* The original value of the attribute before modification.
*
* @var null
*/
protected $original = null;
/**
* The attribute of the modification.
*
* @var int|string
*/
protected $attribute;
/**
* The values of the modification.
*
* @var array
*/
protected $values = [];
/**
* The modtype integer of the batch modification.
*
* @var int
*/
protected $type;
/**
* Constructor.
*
* @param string|null $attribute
* @param string|int|null $type
* @param array $values
*/
public function __construct($attribute = null, $type = null, $values = [])
{
$this->setAttribute($attribute)
->setType($type)
->setValues($values);
}
/**
* Sets the original value of the attribute before modification.
*
* @param mixed $original
*
* @return $this
*/
public function setOriginal($original = null)
{
$this->original = $original;
return $this;
}
/**
* Returns the original value of the attribute before modification.
*
* @return mixed
*/
public function getOriginal()
{
return $this->original;
}
/**
* Sets the attribute of the modification.
*
* @param string $attribute
*
* @return $this
*/
public function setAttribute($attribute)
{
$this->attribute = $attribute;
return $this;
}
/**
* Returns the attribute of the modification.
*
* @return string
*/
public function getAttribute()
{
return $this->attribute;
}
/**
* Sets the values of the modification.
*
* @param array $values
*
* @return $this
*/
public function setValues(array $values = [])
{
$this->values = array_map(function ($value) {
// We need to make sure all values given to a batch modification are
// strings, otherwise we'll receive an LDAP exception when
// we try to process the modification.
return (string) $value;
}, $values);
return $this;
}
/**
* Returns the values of the modification.
*
* @return array
*/
public function getValues()
{
return $this->values;
}
/**
* Sets the type of the modification.
*
* @param int|null $type
*
* @return $this
*/
public function setType($type = null)
{
if (!is_null($type) && !$this->isValidType($type)) {
throw new InvalidArgumentException('Given batch modification type is invalid.');
}
$this->type = $type;
return $this;
}
/**
* Returns the type of the modification.
*
* @return int
*/
public function getType()
{
return $this->type;
}
/**
* Determines if the batch modification
* is valid in its current state.
*
* @return bool
*/
public function isValid()
{
return !is_null($this->get());
}
/**
* Builds the type of modification automatically
* based on the current and original values.
*
* @return $this
*/
public function build()
{
$filtered = array_diff(
array_map('trim', $this->values),
['']
);
if (is_null($this->original)) {
// If the original value is null, we'll assume
// that the attribute doesn't exist yet.
if (!empty($filtered)) {
// If the filtered array is not empty, we can
// assume we're looking to add values
// to the current attribute.
$this->setType(LDAP_MODIFY_BATCH_ADD);
}
// If the filtered array is empty and there is no original
// value, then we can ignore this attribute since
// we can't push null values to the server.
} else {
if (empty($filtered)) {
// If there's an original value and the array is
// empty then we can assume we are looking
// to completely remove all values
// of the current attribute.
$this->setType(LDAP_MODIFY_BATCH_REMOVE_ALL);
} else {
// If the array isn't empty then we can assume
// we're looking to replace all attributes.
$this->setType(LDAP_MODIFY_BATCH_REPLACE);
}
}
return $this;
}
/**
* Returns the built batch modification array.
*
* @return array|null
*/
public function get()
{
switch ($this->type) {
case LDAP_MODIFY_BATCH_REMOVE_ALL:
// A values key cannot be provided when
// a remove all type is selected.
return [
static::KEY_ATTRIB => $this->attribute,
static::KEY_MODTYPE => $this->type,
];
case LDAP_MODIFY_BATCH_REMOVE:
// Fallthrough.
case LDAP_MODIFY_BATCH_ADD:
// Fallthrough.
case LDAP_MODIFY_BATCH_REPLACE:
return [
static::KEY_ATTRIB => $this->attribute,
static::KEY_MODTYPE => $this->type,
static::KEY_VALUES => $this->values,
];
default:
// If the modtype isn't recognized, we'll return null.
return;
}
}
/**
* Determines if the given modtype is valid.
*
* @param int $type
*
* @return bool
*/
protected function isValidType($type)
{
return in_array($type, [
LDAP_MODIFY_BATCH_REMOVE_ALL,
LDAP_MODIFY_BATCH_REMOVE,
LDAP_MODIFY_BATCH_REPLACE,
LDAP_MODIFY_BATCH_ADD,
]);
}
}