diff core/lib/Drupal/Component/Plugin/Context/Context.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Component/Plugin/Context/Context.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,94 @@
+<?php
+
+namespace Drupal\Component\Plugin\Context;
+
+use Drupal\Component\Plugin\Exception\ContextException;
+use Symfony\Component\Validator\Constraints\Type;
+use Symfony\Component\Validator\Validation;
+
+/**
+ * A generic context class for wrapping data a plugin needs to operate.
+ */
+class Context implements ContextInterface {
+
+  /**
+   * The value of the context.
+   *
+   * @var mixed
+   */
+  protected $contextValue;
+
+  /**
+   * The definition to which a context must conform.
+   *
+   * @var \Drupal\Component\Plugin\Context\ContextDefinitionInterface
+   */
+  protected $contextDefinition;
+
+  /**
+   * Create a context object.
+   *
+   * @param \Drupal\Component\Plugin\Context\ContextDefinitionInterface $context_definition
+   *   The context definition.
+   * @param mixed|null $context_value
+   *   The value of the context.
+   */
+  public function __construct(ContextDefinitionInterface $context_definition, $context_value = NULL) {
+    $this->contextDefinition = $context_definition;
+    $this->contextValue = $context_value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContextValue() {
+    // Support optional contexts.
+    if (!isset($this->contextValue)) {
+      $definition = $this->getContextDefinition();
+      $default_value = $definition->getDefaultValue();
+
+      if (!isset($default_value) && $definition->isRequired()) {
+        $type = $definition->getDataType();
+        throw new ContextException(sprintf("The %s context is required and not present.", $type));
+      }
+      // Keep the default value here so that subsequent calls don't have to look
+      // it up again.
+      $this->contextValue = $default_value;
+    }
+    return $this->contextValue;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function hasContextValue() {
+    return (bool) $this->contextValue || (bool) $this->getContextDefinition()->getDefaultValue();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContextDefinition() {
+    return $this->contextDefinition;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getConstraints() {
+    if (empty($this->contextDefinition['class'])) {
+      throw new ContextException("An error was encountered while trying to validate the context.");
+    }
+    return [new Type($this->contextDefinition['class'])];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate() {
+    $validator = Validation::createValidatorBuilder()
+      ->getValidator();
+    return $validator->validateValue($this->getContextValue(), $this->getConstraints());
+  }
+
+}