summaryrefslogtreecommitdiffstats
path: root/library/Director/Objects/IcingaCommandArgument.php
diff options
context:
space:
mode:
Diffstat (limited to 'library/Director/Objects/IcingaCommandArgument.php')
-rw-r--r--library/Director/Objects/IcingaCommandArgument.php263
1 files changed, 263 insertions, 0 deletions
diff --git a/library/Director/Objects/IcingaCommandArgument.php b/library/Director/Objects/IcingaCommandArgument.php
new file mode 100644
index 0000000..96101ce
--- /dev/null
+++ b/library/Director/Objects/IcingaCommandArgument.php
@@ -0,0 +1,263 @@
+<?php
+
+namespace Icinga\Module\Director\Objects;
+
+use Icinga\Module\Director\IcingaConfig\IcingaConfigHelper as c;
+use RuntimeException;
+
+class IcingaCommandArgument extends IcingaObject
+{
+ protected $keyName = ['command_id', 'argument_name'];
+
+ protected $autoincKeyName = 'id';
+
+ protected $table = 'icinga_command_argument';
+
+ protected $supportsImports = false;
+
+ protected $booleans = array(
+ 'skip_key' => 'skip_key',
+ 'repeat_key' => 'repeat_key',
+ 'required' => 'required'
+ );
+
+ protected $defaultProperties = array(
+ 'id' => null,
+ 'command_id' => null,
+ 'argument_name' => null,
+ 'argument_value' => null,
+ 'argument_format' => null,
+ 'key_string' => null,
+ 'description' => null,
+ 'skip_key' => null,
+ 'set_if' => null,
+ 'sort_order' => null,
+ 'repeat_key' => null,
+ 'set_if_format' => null,
+ 'required' => null,
+ );
+
+ public function onInsert()
+ {
+ // No log right now, we have to handle "sub-objects"
+ }
+
+ public function onUpdate()
+ {
+ // No log right now, we have to handle "sub-objects"
+ }
+
+ public function onDelete()
+ {
+ // No log right now, we have to handle "sub-objects"
+ }
+
+ public function isSkippingKey()
+ {
+ return $this->get('skip_key') === 'y' || $this->get('argument_name') === null;
+ }
+
+ // Preserve is not supported
+ public function replaceWith(IcingaObject $object, $preserve = null)
+ {
+ $this->setProperties((array) $object->toPlainObject(
+ false,
+ false,
+ null,
+ false
+ ));
+ return $this;
+ }
+
+ protected function makePlainArgumentValue($value, $format)
+ {
+ if ($format === 'expression') {
+ return (object) [
+ 'type' => 'Function',
+ // TODO: Not for dummy comment
+ 'body' => $value
+ ];
+ } else {
+ // json or string
+ return $value;
+ }
+ }
+
+ protected function extractValueFromPlain($plain)
+ {
+ if ($plain->argument_value) {
+ return $this->makePlainArgumentValue(
+ $plain->argument_value,
+ $plain->argument_format
+ );
+ } else {
+ return null;
+ }
+ }
+
+ protected function transformPlainArgumentValue($plain)
+ {
+ if (property_exists($plain, 'argument_value')) {
+ if (property_exists($plain, 'argument_format')) {
+ $format = $plain->argument_format;
+ } else {
+ $format = 'string';
+ }
+ $plain->value = $this->makePlainArgumentValue(
+ $plain->argument_value,
+ $format
+ );
+ unset($plain->argument_value);
+ unset($plain->argument_format);
+ }
+ }
+
+ public function toCompatPlainObject()
+ {
+ $plain = parent::toPlainObject(
+ false,
+ true,
+ null,
+ false
+ );
+
+ unset($plain->id);
+ unset($plain->argument_name);
+ if (! isset($plain->argument_value)) {
+ unset($plain->argument_format);
+ }
+ if (! isset($plain->set_if)) {
+ unset($plain->set_if_format);
+ }
+
+ $this->transformPlainArgumentValue($plain);
+ unset($plain->command_id);
+
+ // Will happen only combined with $skipDefaults
+ if (array_keys((array) $plain) === ['value']) {
+ return $plain->value;
+ } else {
+ if (property_exists($plain, 'sort_order') && $plain->sort_order !== null) {
+ $plain->order = $plain->sort_order;
+ unset($plain->sort_order);
+ }
+
+ return $plain;
+ }
+ }
+
+ public function toFullPlainObject($skipDefaults = false)
+ {
+ $plain = parent::toPlainObject(
+ false,
+ $skipDefaults,
+ null,
+ false
+ );
+
+ unset($plain->id);
+
+ return $plain;
+ }
+
+ public function toPlainObject(
+ $resolved = false,
+ $skipDefaults = false,
+ array $chosenProperties = null,
+ $resolveIds = true,
+ $keepId = false
+ ) {
+ if ($resolved) {
+ throw new RuntimeException(
+ 'A single CommandArgument cannot be resolved'
+ );
+ }
+
+ if ($chosenProperties) {
+ throw new RuntimeException(
+ 'IcingaCommandArgument does not support chosenProperties[]'
+ );
+ }
+
+ if ($keepId) {
+ throw new RuntimeException(
+ 'IcingaCommandArgument does not support $keepId'
+ );
+ }
+
+ // $resolveIds is misused here
+ if ($resolveIds) {
+ return $this->toCompatPlainObject();
+ } else {
+ return $this->toFullPlainObject($skipDefaults);
+ }
+ }
+
+ public function toConfigString()
+ {
+ $data = array();
+ $value = $this->get('argument_value');
+ if ($value) {
+ switch ($this->get('argument_format')) {
+ case 'string':
+ $data['value'] = c::renderString($value);
+ break;
+ case 'json':
+ if (is_object($value)) {
+ $data['value'] = c::renderDictionary($value);
+ } elseif (is_array($value)) {
+ $data['value'] = c::renderArray($value);
+ } elseif (is_null($value)) {
+ // TODO: recheck all this. I bet we never reach this:
+ $data['value'] = 'null';
+ } elseif (is_bool($value)) {
+ $data['value'] = c::renderBoolean($value);
+ } else {
+ $data['value'] = $value;
+ }
+ break;
+ case 'expression':
+ $data['value'] = c::renderExpression($value);
+ break;
+ }
+ }
+
+ if ($this->get('sort_order') !== null) {
+ $data['order'] = $this->get('sort_order');
+ }
+
+ if (null !== $this->get('set_if')) {
+ switch ($this->get('set_if_format')) {
+ case 'expression':
+ $data['set_if'] = c::renderExpression($this->get('set_if'));
+ break;
+ case 'string':
+ default:
+ $data['set_if'] = c::renderString($this->get('set_if'));
+ break;
+ }
+ }
+
+ if (null !== $this->get('required')) {
+ $data['required'] = c::renderBoolean($this->get('required'));
+ }
+
+ if ($this->isSkippingKey()) {
+ $data['skip_key'] = c::renderBoolean('y');
+ }
+
+ if (null !== $this->get('repeat_key')) {
+ $data['repeat_key'] = c::renderBoolean($this->get('repeat_key'));
+ }
+
+ if (null !== $this->get('description')) {
+ $data['description'] = c::renderString($this->get('description'));
+ }
+
+ if (array_keys($data) === ['value']) {
+ return $data['value'];
+ } else {
+ return c::renderDictionary($data);
+ }
+ }
+}