[-TASK] Extbase (Persistence): Removed unnecessary classes, code and empty interfaces.
[Packages/TYPO3.CMS.git] / typo3 / sysext / extbase / Classes / MVC / Controller / Argument.php
index 118f8ba..6fb2709 100644 (file)
@@ -32,6 +32,7 @@
  * @subpackage MVC\Controller
  * @version $ID:$
  * @scope prototype
+ * @api
  */
 class Tx_Extbase_MVC_Controller_Argument {
 
@@ -66,7 +67,7 @@ class Tx_Extbase_MVC_Controller_Argument {
         * Data type of this argument's value
         * @var string
         */
-       protected $dataType = 'Text';
+       protected $dataType = NULL;
 
        /**
         * If the data type is an object, the class schema of the data type class is resolved
@@ -99,17 +100,24 @@ class Tx_Extbase_MVC_Controller_Argument {
        protected $validator = NULL;
 
        /**
-        * If validation for this argument is temporarily disabled
-        * @var boolean
-        */
-       protected $validationDisabled = FALSE;
-
-       /**
         * Uid for the argument, if it has one
         * @var string
         */
        protected $uid = NULL;
 
+       const ORIGIN_CLIENT = 0;
+       const ORIGIN_PERSISTENCE = 1;
+       const ORIGIN_PERSISTENCE_AND_MODIFIED = 2;
+       const ORIGIN_NEWLY_CREATED = 3;
+
+       /**
+        * The origin of the argument value. This is only meaningful after argument mapping.
+        *
+        * One of the ORIGIN_* constants above
+        * @var integer
+        */
+       protected $origin = 0;
+
        /**
         * Constructs this controller argument
         *
@@ -118,17 +126,23 @@ class Tx_Extbase_MVC_Controller_Argument {
         * @throws InvalidArgumentException if $name is not a string or empty
         * @api
         */
-       public function __construct($name, $dataType = 'Text') {
+       public function __construct($name, $dataType) {
+               if (!is_string($name)) throw new InvalidArgumentException('$name must be of type string, ' . gettype($name) . ' given.', 1187951688);
+               if (strlen($name) === 0) throw new InvalidArgumentException('$name must be a non-empty string, ' . strlen($name) . ' characters given.', 1232551853);
+               $this->name = $name;
+               $this->dataType = $dataType;
+       }
+
+       /**
+        * Initializes this object
+        *
+        * @return void
+        */
+       public function initializeObject() {
                $this->reflectionService = t3lib_div::makeInstance('Tx_Extbase_Reflection_Service');
                $this->propertyMapper = t3lib_div::makeInstance('Tx_Extbase_Property_Mapper');
-               $this->propertyMapper->injectReflectionService(t3lib_div::makeInstance('Tx_Extbase_Reflection_Service'));
-               if (!is_string($name) || strlen($name) < 1) throw new InvalidArgumentException('$name must be of type string, ' . gettype($name) . ' given.', 1187951688);
-               $this->name = $name;
-               if (is_array($dataType)) {
-                       $this->setNewValidatorConjunction($dataType); // TODO: Does this really make sense? Should be "disjunction" (if we really really want to support this feature)
-               } else {
-                       $this->setDataType($dataType);
-               }
+               $this->propertyMapper->injectReflectionService($this->reflectionService);
+               $this->dataTypeClassSchema = (strstr($this->dataType, '_') !== FALSE) ? $this->reflectionService->getClassSchema($this->dataType) : NULL;
        }
 
        /**
@@ -194,7 +208,7 @@ class Tx_Extbase_MVC_Controller_Argument {
         */
        public function setDataType($dataType) {
                $this->dataType = $dataType;
-               $this->dataTypeClassSchema = $this->reflectionService->getClassSchema($this->dataType);
+               $this->dataTypeClassSchema = $this->reflectionService->getClassSchema($dataType);
                return $this;
        }
 
@@ -292,61 +306,67 @@ class Tx_Extbase_MVC_Controller_Argument {
        }
 
        /**
-        * Returns TRUE if validation is temporarily disabled for this argument and
-        * FALSE if it's enabled.
-        *
-        * Note that this is flag is only informational and does not have any real impact
-        * on other validation methods of this argument.
+        * Get the origin of the argument value. This is only meaningful after argument mapping.
         *
-        * @return boolean If validation is disabled
-        * @api
+        * @return integer one of the ORIGIN_* constants
+        * @author Sebastian Kurf├╝rst <sebastian@typo3.org>
         */
-       public function isValidationDisabled() {
-               return $this->validationDisabled;
+       public function getOrigin() {
+               return $this->origin;
        }
 
        /**
-        * Enables validation for this argument.
+        * Sets the value of this argument.
         *
-        * @return void
-        * @api
+        * @param mixed $value: The value of this argument
+        * @return Tx_Extbase_MVC_Controller_Argument $this
+        * @throws Tx_Extbase_MVC_Exception_InvalidArgumentValue if the argument is not a valid object of type $dataType
         */
-       public function enableValidation() {
-               $this->validationDisabled = FALSE;
-       }
+       public function setValue($value) {
+               $this->value = $this->transformValue($value);
 
-       /**
-        * Disables validation for this argument.
-        *
-        * @return void
-        * @api
-        */
-       public function disableValidation() {
-               $this->validationDisabled = TRUE;
+               return $this;
        }
 
        /**
-        * Sets the value of this argument.
+        * Checks if the value is a UUID or an array but should be an object, i.e.
+        * the argument's data type class schema is set. If that is the case, this
+        * method tries to look up the corresponding object instead.
         *
-        * @param mixed $value: The value of this argument
-        * @return Tx_Extbase_MVC_Controller_Argument $this
-        * @throws Tx_Extbase_MVC_Exception_InvalidArgumentValue if the argument is not a valid object of type $dataType
+        * Additionally, it maps arrays to objects in case it is a normal object.
+        *
+        * @param mixed $value The value of an argument
+        * @return mixed
         */
-       public function setValue($value) {
-               if ($value !== NULL && $this->dataTypeClassSchema !== NULL) {
+       protected function transformValue($value) {
+               if ($value === NULL) {
+                       return NULL;
+               }
+               if (!class_exists($this->dataType)) {
+                       return $value;
+               }
+               $transformedValue = NULL;
+               if ($this->dataTypeClassSchema !== NULL) {
+                       // The target object is an Entity or ValueObject.
                        if (is_numeric($value)) {
-                               $value = $this->findObjectByUid($value);
+                               $this->origin = self::ORIGIN_PERSISTENCE;
+                               $transformedValue = $this->findObjectByUid($value);
                        } elseif (is_array($value)) {
-                               $value = $this->propertyMapper->map(array_keys($value), $value, $this->dataType);
+                               $this->origin = self::ORIGIN_PERSISTENCE_AND_MODIFIED;
+                               $transformedValue = $this->propertyMapper->map(array_keys($value), $value, $this->dataType);
                        }
-
-                       if (!($value instanceof $this->dataType)) {
-                               throw new Tx_Extbase_MVC_Exception_InvalidArgumentValue('The value must be of type "' . $this->dataType . '".', 1251730701);
+               } else {
+                       if (!is_array($value)) {
+                               throw new Tx_Extbase_MVC_Exception_InvalidArgumentValue('The value was a simple type, so we could not map it to an object. Maybe the @entity or @valueobject annotations are missing?', 1251730701);
                        }
+                       $this->origin = self::ORIGIN_NEWLY_CREATED;
+                       $transformedValue = $this->propertyMapper->map(array_keys($value), $value, $this->dataType);
                }
-               $this->value = $value;
 
-               return $this;
+               if (!($transformedValue instanceof $this->dataType)) {
+                       throw new Tx_Extbase_MVC_Exception_InvalidArgumentValue('The value must be of type "' . $this->dataType . '", but was of type "' . (is_object($transformedValue) ? get_class($transformedValue) : gettype($transformedValue)) . '".', 1251730701);
+               }
+               return $transformedValue;
        }
 
        /**
@@ -357,6 +377,7 @@ class Tx_Extbase_MVC_Controller_Argument {
         */
        protected function findObjectByUid($uid) {
                $query = $this->queryFactory->create($this->dataType);
+               $query->getQuerySettings()->setRespectSysLanguage(FALSE);
                $result = $query->matching($query->withUid($uid))->execute();
                $object = NULL;
                if (count($result) > 0) {