Extbase:
authorJochen Rau <j.rau@web.de>
Tue, 5 May 2009 10:23:28 +0000 (10:23 +0000)
committerJochen Rau <j.rau@web.de>
Tue, 5 May 2009 10:23:28 +0000 (10:23 +0000)
* Fixed Bug #3221: When EXT:fluid is not loaded or unavailable, the ActionController looks for a non-existing view.
* Fixed Bug #3224: Call to undefined method Tx_Extbase_Reflection_ParameterReflection::getPosition().
* Fixed Bug #3215: Tx_Extbase_MVC_Controller_AbstractController::forward() does not work.
* Renamed DefaultController to StandardController
* Renamed ExtensionName to ControllerExtensionName in the Request class
* Tx_Extbase_MVC_Controller_AbstractController: URIHelper, ValidationResolver are now "injected"
* Tx_Extbase_MVC_Controller_AbstractController: added canProcessRequest()
* Tx_Extbase_MVC_Controller_ActionController: ReflectionService is now "injected"
* (Re-)backported the Validation framework according to the latest changes in FLOW3
* Backported parts of the Property Mapper
* Added several Unit Tests
* Added buildAccessibleProxy() method to the Base testcase
* First step to backport the Query object (only QueryRawSQL and QueryByExample)

123 files changed:
typo3/sysext/extbase/Classes/Controller/DefaultController.php [deleted file]
typo3/sysext/extbase/Classes/Controller/StandardController.php [new file with mode: 0755]
typo3/sysext/extbase/Classes/DomainObject/AbstractEntity.php
typo3/sysext/extbase/Classes/MVC/Controller/AbstractController.php
typo3/sysext/extbase/Classes/MVC/Controller/ActionController.php
typo3/sysext/extbase/Classes/MVC/Controller/Argument.php
typo3/sysext/extbase/Classes/MVC/Controller/Arguments.php
typo3/sysext/extbase/Classes/MVC/Controller/ArgumentsValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InfiniteLoop.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidActionName.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentName.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentType.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentValue.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidController.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidControllerName.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidExtensionName.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidMarker.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidRequestMethod.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidRequestType.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidTemplateResource.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidUriPattern.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/InvalidViewHelper.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/NoSuchAction.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/NoSuchArgument.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/NoSuchController.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/StopAction.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Exception/UnsupportedRequestType.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/Request.php
typo3/sysext/extbase/Classes/MVC/View/Helper/AbstractHelper.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/View/Helper/HelperInterface.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/View/Helper/URIHelperStep1.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/MVC/View/Helper/UriHelper.php [deleted file]
typo3/sysext/extbase/Classes/MVC/View/ViewInterface.php
typo3/sysext/extbase/Classes/MVC/Web/RequestBuilder.php
typo3/sysext/extbase/Classes/Persistence/DataMapperInterface.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Persistence/Mapper/DataMap.php
typo3/sysext/extbase/Classes/Persistence/Mapper/ObjectRelationalMapper.php
typo3/sysext/extbase/Classes/Persistence/Query.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Persistence/QueryFactory.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Persistence/QueryFactoryInterface.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Persistence/QueryInterface.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Persistence/Repository.php
typo3/sysext/extbase/Classes/Persistence/RepositoryInterface.php
typo3/sysext/extbase/Classes/Property/Exception.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Property/Exception/FormatNotSupported.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Property/Exception/InvalidDataType.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Property/Exception/InvalidFormat.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Property/Exception/InvalidProperty.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Property/Exception/InvalidSource.php [new file with mode: 0755]
typo3/sysext/extbase/Classes/Property/Exception/InvalidTarget.php [new file with mode: 0755]
typo3/sysext/extbase/Classes/Property/Mapper.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Property/MappingResults.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Reflection/ClassReflection.php
typo3/sysext/extbase/Classes/Reflection/DocCommentParser.php
typo3/sysext/extbase/Classes/Reflection/Exception.php
typo3/sysext/extbase/Classes/Reflection/MethodReflection.php
typo3/sysext/extbase/Classes/Reflection/ObjectAccess.php
typo3/sysext/extbase/Classes/Reflection/ParameterReflection.php
typo3/sysext/extbase/Classes/Reflection/PropertyReflection.php
typo3/sysext/extbase/Classes/Reflection/Service.php
typo3/sysext/extbase/Classes/Utility/Strings.php
typo3/sysext/extbase/Classes/Validation/Exception/InvalidSubject.php
typo3/sysext/extbase/Classes/Validation/Exception/InvalidValidationOptions.php [new file with mode: 0755]
typo3/sysext/extbase/Classes/Validation/Exception/NoSuchValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/AbstractObjectValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/AbstractValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/Alphanumeric.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/AlphanumericValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/ChainValidator.php
typo3/sysext/extbase/Classes/Validation/Validator/DateTimeValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/EmailAddress.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/EmailAddressValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/Float.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/FloatValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/GenericObjectValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/Integer.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/IntegerValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/NotEmpty.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/NotEmptyValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/Number.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/NumberRange.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/NumberRangeValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/NumberValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/ObjectValidatorInterface.php [new file with mode: 0755]
typo3/sysext/extbase/Classes/Validation/Validator/Raw.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/RawValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/RegularExpression.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/RegularExpressionValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/StringLengthValidator.php [new file with mode: 0755]
typo3/sysext/extbase/Classes/Validation/Validator/Text.php [deleted file]
typo3/sysext/extbase/Classes/Validation/Validator/TextValidator.php [new file with mode: 0644]
typo3/sysext/extbase/Classes/Validation/Validator/ValidatorInterface.php
typo3/sysext/extbase/Classes/Validation/ValidatorResolver.php [new file with mode: 0644]
typo3/sysext/extbase/Documentation/Manual/en/_old/AppendixCodingGuidelines.xml
typo3/sysext/extbase/Documentation/Manual/en/_old/PersistenceFramework.xml
typo3/sysext/extbase/Tests/Base_testcase.php
typo3/sysext/extbase/Tests/MVC/Controller/AbstractController_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/MVC/Controller/ActionController_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/MVC/Controller/Argument_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/MVC/Controller/Arguments_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/MVC/Web/RequestBuilder_testcase.php
typo3/sysext/extbase/Tests/Persistence/Mapper/DataMap_testcase.php
typo3/sysext/extbase/Tests/Persistence/Mapper/ObjectRelationalMapper_testcase.php
typo3/sysext/extbase/Tests/Persistence/QueryFactory_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/Persistence/Query_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/Validation/Validator/AlphanumericValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/Validator/ChainValidator_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/Validation/Validator/DateTimeValidator_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/Validation/Validator/EmailAddressValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/Validator/FloatValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/Validator/GenericObjectValidator_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/Validation/Validator/IntegerValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/Validator/NotEmptyValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/Validator/NumberRangeValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/Validator/NumberValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/Validator/RawValidator_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/Validation/Validator/RegularExpressionValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/Validator/StringLengthValidator_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/Tests/Validation/Validator/TextValidator_testcase.php [new file with mode: 0755]
typo3/sysext/extbase/Tests/Validation/ValidatorResolver_testcase.php [new file with mode: 0644]
typo3/sysext/extbase/class.tx_extbase_dispatcher.php
typo3/sysext/extbase/ext_emconf.php

diff --git a/typo3/sysext/extbase/Classes/Controller/DefaultController.php b/typo3/sysext/extbase/Classes/Controller/DefaultController.php
deleted file mode 100755 (executable)
index 0703068..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * A Special Case of a Controller: If no controller could be resolved or no
- * controller has been specified in the request, this controller is chosen.
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Controller_DefaultController extends Tx_Extbase_MVC_Controller_ActionController {
-
-       /**
-        * Processes a generic request and returns a response
-        *
-        * @param Tx_Extbase_MVC_Request $request: The request
-        * @param Tx_Extbase_MVC_Response $response: The response
-        */
-       public function processRequest(Tx_Extbase_MVC_Request $request, Tx_Extbase_MVC_Response $response) {
-               $response->setContent(
-                       "\nWelcome to TYPO3!\n\n" .
-                       "This is the default view of the TYPO3 MVC object. You see this message because no \n" .
-                       "other view is available. Please refer to the Developer's Guide for more information \n" .
-                       "how to create and configure one.\n\n" .
-                       "Have fun! The TYPO3 Development Team\n"
-               );
-       }
-
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Controller/StandardController.php b/typo3/sysext/extbase/Classes/Controller/StandardController.php
new file mode 100755 (executable)
index 0000000..d1d3e60
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A Special Case of a Controller: If no controller could be resolved or no
+ * controller has been specified in the request, this controller is chosen.
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $ID:$
+ */
+class Tx_Extbase_Controller_StandardController extends Tx_Extbase_MVC_Controller_ActionController {
+
+       /**
+        * Processes a generic request and returns a response
+        *
+        * @param Tx_Extbase_MVC_Request $request: The request
+        * @param Tx_Extbase_MVC_Response $response: The response
+        */
+       public function processRequest(Tx_Extbase_MVC_Request $request, Tx_Extbase_MVC_Response $response) {
+               $response->setContent(
+                       "\nWelcome to TYPO3!\n\n" .
+                       "This is the standard view of the TYPO3 MVC object. You see this message because no \n" .
+                       "other view is available. Please refer to the Developer's Guide for more information \n" .
+                       "how to create and configure one.\n\n" .
+                       "Have fun! The TYPO3 Development Team\n"
+               );
+       }
+
+}
+
+?>
\ No newline at end of file
index 66f7ea3..fdc22a8 100644 (file)
@@ -45,6 +45,7 @@ abstract class Tx_Extbase_DomainObject_AbstractEntity extends Tx_Extbase_DomainO
         * @internal
         */
        public function _memorizeCleanState() {
+               // TODO Remove dependency to $dataMapper
                $dataMapper = t3lib_div::makeInstance('Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper'); // singleton
                $this->_cleanProperties = array();
                $properties = get_object_vars($this);
index 57bdb80..e1fae14 100755 (executable)
 abstract class Tx_Extbase_MVC_Controller_AbstractController implements Tx_Extbase_MVC_Controller_ControllerInterface {
 
        /**
+        * @var Tx_Extbase_MVC_View_Helper_URIHelper
+        */
+       protected $URIHelper;
+
+       /**
         * @var string Key of the extension this controller belongs to
         */
        protected $extensionName;
@@ -52,27 +57,52 @@ abstract class Tx_Extbase_MVC_Controller_AbstractController implements Tx_Extbas
         * @var Tx_Extbase_MVC_Response The response which will be returned by this action controller
         */
        protected $response;
+       
+       /**
+        * @var Tx_Extbase_Property_Mapper
+        */
+       protected $propertyMapper;
+
+       /**
+        * @var Tx_Extbase_Validation_ValidatorResolver
+        */
+       protected $validatorResolver;
 
        /**
         * @var Tx_Extbase_MVC_Controller_Arguments Arguments passed to the controller
         */
        protected $arguments;
-
+       
        /**
-        * Actions that schould not be cached (changes the invocated dispatcher to a USER_INT cObject)
+        * The results of the mapping of request arguments to controller arguments
+        * @var Tx_Extbase_Property_MappingResults
+        */
+       protected $argumentsMappingResults;
+       
+       /**
+        * An array of supported request types. By default only web requests are supported.
+        * Modify or replace this array if your specific controller supports certain
+        * (additional) request types.
         * @var array
         */
-       protected $nonCachableActions = array();
+       protected $supportedRequestTypes = array('Tx_Extbase_MVC_Web_Request');
 
        /**
         * Constructs the controller.
-        *
-        * @param F3_FLOW3_Object_FactoryInterface $objectFactory A reference to the Object Factory
-        * @param F3_FLOW3_Package_ManagerInterface $packageManager A reference to the Package Manager
         */
        public function __construct() {
-               // SK: Set $this->extensionName, could be done the same way as it is done in Fluid
                $this->arguments = t3lib_div::makeInstance('Tx_Extbase_MVC_Controller_Arguments');
+               list(, $this->extensionName) = explode('_', get_class($this));
+       }
+
+       /**
+        * Injects the property mapper
+        *
+        * @param Tx_Extbase_Property_Mapper $propertyMapper The property mapper
+        * @return void
+        */
+       public function injectPropertyMapper(Tx_Extbase_Property_Mapper $propertyMapper) {
+               $this->propertyMapper = $propertyMapper;
        }
 
        /**
@@ -84,6 +114,43 @@ abstract class Tx_Extbase_MVC_Controller_AbstractController implements Tx_Extbas
        public function injectSettings(array $settings) {
                $this->settings = $settings;
        }
+       
+       /**
+        * Injects the URI helper
+        *
+        * @param Tx_Extbase_MVC_View_Helper_URIHelper $URIHelper The URI helper
+        * @return void
+        */
+       public function injectURIHelper(Tx_Extbase_MVC_View_Helper_URIHelper $URIHelper) {
+               $this->URIHelper = $URIHelper;
+       }
+       
+       /**
+        * Injects the validator resolver
+        *
+        * @param Tx_Extbase_Validation_ValidatorResolver $validatorResolver
+        * @return void
+        */
+       public function injectValidatorResolver(Tx_Extbase_Validation_ValidatorResolver $validatorResolver) {
+               $this->validatorResolver = $validatorResolver;
+       }
+       
+       /**
+        * Checks if the current request type is supported by the controller.
+        *
+        * If your controller only supports certain request types, either
+        * replace / modify the supporteRequestTypes property or override this
+        * method.
+        *
+        * @param Tx_Extbase_MVC_Request $request The current request
+        * @return boolean TRUE if this request type is supported, otherwise FALSE
+        */
+       public function canProcessRequest(Tx_Extbase_MVC_Request $request) {
+               foreach ($this->supportedRequestTypes as $supportedRequestType) {
+                       if ($request instanceof $supportedRequestType) return TRUE;
+               }
+               return FALSE;
+       }
 
        /**
         * Processes a general request. The result can be returned by altering the given response.
@@ -94,12 +161,14 @@ abstract class Tx_Extbase_MVC_Controller_AbstractController implements Tx_Extbas
         * @throws Tx_Extbase_Exception_UnsupportedRequestType if the controller doesn't support the current request type
         */
        public function processRequest(Tx_Extbase_MVC_Request $request, Tx_Extbase_MVC_Response $response) {
+               if (!$this->canProcessRequest($request)) throw new Tx_Extbase_MVC_Exception_UnsupportedRequestType(get_class($this) . ' does not support requests of type "' . get_class($request) . '". Supported types are: ' . implode(' ', $this->supportedRequestTypes) , 1187701131);
+               
                $this->request = $request;
                $this->request->setDispatched(TRUE);
                $this->response = $response;
 
                $this->initializeArguments();
-               $this->mapRequestArgumentsToLocalArguments();
+               $this->mapRequestArgumentsToControllerArguments();
        }
 
        /**
@@ -116,6 +185,10 @@ abstract class Tx_Extbase_MVC_Controller_AbstractController implements Tx_Extbas
        /**
         * Forwards the request to another controller.
         *
+        * @param string $actionName Name of the action to forward to
+        * @param string $controllerName Unqualified object name of the controller to forward to. If not specified, the current controller is used.
+        * @param string $extensionName Name of the extension containing the controller to forward to. If not specified, the current extension is assumed.
+        * @param Tx_Extbase_MVC_Controller_Arguments $arguments Arguments to pass to the target action
         * @return void
         * @throws Tx_Extbase_Exception_StopAction
         */
@@ -123,7 +196,7 @@ abstract class Tx_Extbase_MVC_Controller_AbstractController implements Tx_Extbas
                $this->request->setDispatched(FALSE);
                $this->request->setControllerActionName($actionName);
                if ($controllerName !== NULL) $this->request->setControllerName($controllerName);
-               if ($extensionName !== NULL) $this->request->setExtensionName($extensionName);
+               if ($extensionName !== NULL) $this->request->setControllerExtensionName($extensionName);
                if ($arguments !== NULL) $this->request->setArguments($arguments);
                throw new Tx_Extbase_Exception_StopAction();
        }
@@ -144,11 +217,10 @@ abstract class Tx_Extbase_MVC_Controller_AbstractController implements Tx_Extbas
         * @throws Tx_Extbase_Exception_UnsupportedRequestType If the request is not a web request
         * @throws Tx_Extbase_Exception_StopAction
         */
-       protected function redirect($actionName, $controllerName = '', $extensionKey = '', array $arguments = NULL, $delay = 0, $statusCode = 303) {
+       protected function redirect($actionName, $controllerName = NULL, $extensionName = NULL, array $arguments = NULL, $delay = 0, $statusCode = 303) {
                if (!$this->request instanceof Tx_Extbase_MVC_Web_Request) throw new Tx_Extbase_Exception_UnsupportedRequestType('redirect() only supports web requests.', 1220539734);
 
-               $uriHelper = t3lib_div::makeInstance('Tx_Extbase_MVC_View_Helper_UriHelper');
-               $uri = $uriHelper->URIFor($this->request, $actionName, $arguments, $controllerName, $extensionKey);
+               $uri = $this->URIHelper->URIFor($actionName, $arguments, $controllerName, $extensionName);
                $this->redirectToURI($uri, $delay, $statusCode);
        }
 
@@ -193,23 +265,35 @@ abstract class Tx_Extbase_MVC_Controller_AbstractController implements Tx_Extbas
                $this->response->setContent($content);
                throw new Tx_Extbase_Exception_StopAction();
        }
+       
+       /**
+        * Collects the base validators which were defined for the data type of each
+        * controller argument and adds them to the argument's validator chain.
+        *
+        * @return void
+        */
+       public function initializeControllerArgumentsBaseValidators() {
+               foreach ($this->arguments as $argument) {
+                       $validator = $this->validatorResolver->getBaseValidatorChain($argument->getDataType());
+                       if ($validator !== NULL) $argument->setValidator($validator);
+               }
+       }
 
        /**
         * Maps arguments delivered by the request object to the local controller arguments.
         *
         * @return void
         */
-       protected function mapRequestArgumentsToLocalArguments() {
-               $requestArguments = $this->request->getArguments();
-               foreach ($this->arguments as $argument) {
-                       $argumentName = $argument->getName();
-                       $argumentShortName = $argument->getShortName();
-                       if (array_key_exists($argumentName, $requestArguments)) {
-                               $argument->setValue($requestArguments[$argumentName]);
-                       } elseif ($argumentShortName !== NULL && array_key_exists($argumentShortName, $requestArguments)) {
-                               $argument->setValue($requestArguments[$argumentShortName]);
-                       }
+       protected function mapRequestArgumentsToControllerArguments() {
+               $optionalPropertyNames = array();
+               $allPropertyNames = $this->arguments->getArgumentNames();
+               foreach ($allPropertyNames as $propertyName) {
+                       if ($this->arguments[$propertyName]->isRequired() === FALSE) $optionalPropertyNames[] = $propertyName;
                }
+
+               $validator = t3lib_div::makeInstance('Tx_Extbase_MVC_Controller_ArgumentsValidator');
+               $this->propertyMapper->mapAndValidate($allPropertyNames, $this->request->getArguments(), $this->arguments, $optionalPropertyNames, $validator);
+               $this->argumentsMappingResults = $this->propertyMapper->getMappingResults();
        }
 }
 
index 9a61417..5271376 100644 (file)
 class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controller_AbstractController {
 
        /**
+        * @var Tx_Extbase_Reflection_Service
+        */
+       protected $reflectionService;
+
+       /**
         * @var boolean If initializeView() should be called on an action invocation.
         */
        protected $initializeView = TRUE;
 
        /**
-        * @var Tx_Extbase_MVC_View_AbstractView By default a view with the same name as the current action is provided. Contains NULL if none was found.
+        * By default a view with the same name as the current action is provided. Contains NULL if none was found.
+        * @var Tx_Extbase_MVC_View_AbstractView
         */
        protected $view = NULL;
 
        /**
-        * By default a matching view will be resolved. If this property is set, automatic resolving is disabled and the specified object is used instead.
+        * By default $this->viewObjectNamePattern is used to find a matching view object.
+        * If no custom view class can be found, $this->defaultViewObjectName will be used.
         * @var string
         */
-       protected $defaultViewObjectName = 'Tx_Fluid_View_TemplateView';
+       protected $standardViewObjectName = 'Tx_Fluid_View_TemplateView';
 
        /**
         * Pattern after which the view object name is built
@@ -53,7 +60,7 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         * @var string
         */
        // SK: Decision: Do we support "format"?
-       protected $viewObjectNamePattern = 'Tx_@extension_View_@controller@action';
+       protected $viewObjectNamePattern = 'Tx_@exension_View_@controller_@action';
 
        /**
         * Name of the action method
@@ -68,6 +75,32 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
        protected $errorMethodName = 'errorAction';
 
        /**
+        * Injects the reflection service
+        *
+        * @param Tx_Extbase_Reflection_Service $reflectionService
+        * @return void
+        * @internal
+        */
+       public function injectReflectionService(Tx_Extbase_Reflection_Service $reflectionService) {
+               $this->reflectionService = $reflectionService;
+       }
+       
+       /**
+        * Checks if the current request type is supported by the controller.
+        *
+        * If your controller only supports certain request types, either
+        * replace / modify the supporteRequestTypes property or override this
+        * method.
+        *
+        * @param Tx_Extbase_MVC_Request $request The current request
+        * @return boolean TRUE if this request type is supported, otherwise FALSE
+        */
+       public function canProcessRequest(Tx_Extbase_MVC_Request $request) {
+               return parent::canProcessRequest($request);
+               
+       }
+
+       /**
         * Handles a request. The result output is returned by altering the given response.
         *
         * @param Tx_Extbase_MVC_Request $request The request object
@@ -75,16 +108,26 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         * @return void
         */
        public function processRequest(Tx_Extbase_MVC_Request $request, Tx_Extbase_MVC_Response $response) {
+               if (!$this->canProcessRequest($request)) throw new Tx_Extbase_MVC_Exception_UnsupportedRequestType(get_class($this) . ' does not support requests of type "' . get_class($request) . '". Supported types are: ' . implode(' ', $this->supportedRequestTypes) , 1187701131);
+               
                $this->request = $request;
                $this->request->setDispatched(TRUE);
                $this->response = $response;
 
                $this->actionMethodName = $this->resolveActionMethodName();
-               $this->initializeActionMethodArguments();
-               $this->initializeArguments();
-               $this->mapRequestArgumentsToLocalArguments();
                if ($this->initializeView) $this->initializeView();
+               
+               $this->initializeActionMethodArguments();
+               $this->initializeControllerArgumentsBaseValidators();
+               $this->initializeActionMethodValidators();
+
                $this->initializeAction();
+               $actionInitializationMethodName = 'initialize' . ucfirst($this->actionMethodName);
+               if (method_exists($this, $actionInitializationMethodName)) {
+                       call_user_func(array($this, $actionInitializationMethodName));
+               }
+
+               $this->mapRequestArgumentsToControllerArguments();
                $this->callActionMethod();
        }
        
@@ -95,13 +138,11 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         * Don't override this method - use initializeArguments() instead.
         *
         * @return void
-        * @author Robert Lemke <robert@typo3.org>
         * @see initializeArguments()
         * @internal
         */
        protected function initializeActionMethodArguments() {
-               $reflectionService = t3lib_div::makeInstance('Tx_Extbase_Reflection_Service');
-               $methodParameters = $reflectionService->getMethodParameters(get_class($this), $this->actionMethodName);
+               $methodParameters = $this->reflectionService->getMethodParameters(get_class($this), $this->actionMethodName);
                foreach ($methodParameters as $parameterName => $parameterInfo) {
                        $dataType = 'Text';
                        if (isset($parameterInfo['type'])) {
@@ -109,17 +150,6 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
                        } elseif ($parameterInfo['array']) {
                                $dataType = 'array';
                        }
-
-                       switch($dataType) {
-                               case 'string':
-                                       $dataType = 'Text';
-                                       break;
-                               case 'integer':
-                               case 'int':
-                                       $dataType = 'Integer';
-                                       break;
-                       }
-
                        $defaultValue = (isset($parameterInfo['defaultValue']) ? $parameterInfo['defaultValue'] : NULL);
 
                        $this->arguments->addNewArgument($parameterName, $dataType, ($parameterInfo['optional'] === FALSE), $defaultValue);
@@ -127,6 +157,21 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
        }
 
        /**
+        * Detects and registers any additional validators for arguments which were
+        * specified in the @validate annotations of an action method
+        *
+        * @return void
+        * @internal
+        */
+       protected function initializeActionMethodValidators() {
+               $validatorChains = $this->validatorResolver->buildMethodArgumentsValidatorChains(get_class($this), $this->actionMethodName);
+               foreach ($validatorChains as $argumentName => $validatorChain) {
+                       if (!isset($this->arguments[$argumentName])) throw new Tx_Extbase_MVC_Exception_NoSuchArgument('Found custom validation rule for non existing argument "' . $argumentName . '" in ' . get_class($this) . '->' . $this->actionMethodName . '().', 1239853108);
+                       $this->arguments[$argumentName]->setValidator($validatorChain);
+               }
+       }
+
+       /**
         * Determines the action method and assures that the method exists.
         *
         * @return string The action method name
@@ -140,19 +185,24 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
 
        /**
         * Calls the specified action method and passes the arguments.
+        *
         * If the action returns a string, it is appended to the content in the
-        * response object.
+        * response object. If the action doesn't return anything and a valid
+        * view exists, the view is rendered automatically.
         *
+        * @param string $actionMethodName Name of the action method to call
         * @return void
         * @internal
         */
        protected function callActionMethod() {
-               $preparedArguments = array();           
+               $argumentsAreValid = TRUE;
+               $preparedArguments = array();
                foreach ($this->arguments as $argument) {
                        $this->preProcessArgument($argument);
                        $preparedArguments[] = $argument->getValue();
                }
-               if (!$this->arguments->areValid()) {
+
+               if ($this->argumentsMappingResults->hasErrors()) {
                        $actionResult = call_user_func(array($this, $this->errorMethodName));
                } else {
                        $actionResult = call_user_func_array(array($this, $this->actionMethodName), $preparedArguments);
@@ -181,12 +231,8 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         * @return void
         */
        protected function initializeView() {
-               $viewObjectName = ($this->defaultViewObjectName === NULL) ? $this->resolveViewObjectName() : $this->defaultViewObjectName;
-               if (!class_exists($viewObjectName)) $viewObjectName = 'Tx_Extbase_MVC_View_EmptyView';
-
-               $this->view = t3lib_div::makeInstance($viewObjectName);
+               $this->view = t3lib_div::makeInstance($this->resolveViewObjectName());
                $this->view->setRequest($this->request);
-               $this->view->initializeView();
        }
 
        /**
@@ -195,12 +241,17 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         * @return string The fully qualified view object name
         */
        protected function resolveViewObjectName() {
-               $possibleViewName = $this->viewObjectNamePattern;
-               $extensionName = $this->request->getExtensionName();
-               $possibleViewName = str_replace('@extension', $extensionName, $possibleViewName);
-               $possibleViewName = str_replace('@controller', $this->request->getControllerName(), $possibleViewName);
-               $possibleViewName = str_replace('@action', ucfirst($this->request->getControllerActionName()), $possibleViewName);
-               return $possibleViewName;
+               $viewObjectName = str_replace('@extension', $this->request->getControllerExtensionName(), $this->viewObjectNamePattern);
+               $viewObjectName = str_replace('@controller', $this->request->getControllerName(), $viewObjectName);
+               $viewObjectName = str_replace('@action', ucfirst($this->request->getControllerActionName()), $viewObjectName);
+               if (!class_exists($viewObjectName)) {
+                       if (class_exists($this->standardViewObjectName)) {
+                               $viewObjectName = $this->standardViewObjectName;
+                       } else {
+                               $viewObjectName = 'Tx_Extbase_View_EmptyView';
+                       }
+               }
+               return $viewObjectName;
        }
 
        /**
@@ -221,13 +272,12 @@ class Tx_Extbase_MVC_Controller_ActionController extends Tx_Extbase_MVC_Controll
         * @return string
         */
        protected function errorAction() {
-               $message = 'An error occurred while trying to call ' . get_class($this) . '->' . $this->actionMethodName . '(). <br />' . PHP_EOL;
-               foreach ($this->arguments as $argument) {
-                       if (!$argument->isValid()) {
-                               foreach ($argument->getErrors() as $errorMessage) {
-                                       $message .= 'Error:   ' . $errorMessage . '<br />' . PHP_EOL;
-                               }
-                       }
+               $message = 'An error occurred while trying to call ' . get_class($this) . '->' . $this->actionMethodName . '().' . PHP_EOL;
+               foreach ($this->argumentsMappingResults->getErrors() as $error) {
+                       $message .= 'Error:   ' . $error . PHP_EOL;
+               }
+               foreach ($this->argumentsMappingResults->getWarnings() as $warning) {
+                       $message .= 'Warning: ' . $warning . PHP_EOL;
                }
                return $message;
        }
index 899db4f..5f0c907 100644 (file)
  * @scope prototype
  */
 class Tx_Extbase_MVC_Controller_Argument {
+       
+       /**
+        * @var Tx_Extbase_Persistence_QueryFactory
+        */
+       protected $queryFactory;
+       
+       /**
+        * @var Tx_Extbase_Property_Mapper
+        */
+       protected $propertyMapper;
 
        /**
         * Name of this argument
@@ -69,19 +79,7 @@ class Tx_Extbase_MVC_Controller_Argument {
        protected $defaultValue = NULL;
 
        /**
-        * The argument is valid
-        * @var boolean
-        */
-       protected $isValid = FALSE;
-
-       /**
-        * Any error (Tx_Extbase_Error_Error) that occured while initializing this argument (e.g. a mapping error)
-        * @var array
-        */
-       protected $errors = array();
-
-       /**
-        * The property validator for this argument
+        * A custom validator, used supplementary to the base validation
         * @var Tx_Extbase_Validation_Validator_ValidatorInterface
         */
        protected $validator = NULL;
@@ -100,6 +98,8 @@ class Tx_Extbase_MVC_Controller_Argument {
         * @throws InvalidArgumentException if $name is not a string or empty
         */
        public function __construct($name, $dataType = 'Text') {
+               $this->queryFactory = t3lib_div::makeInstance('Tx_Extbase_Persistence_QueryFactory');
+               $this->propertyMapper = t3lib_div::makeInstance('Tx_Extbase_Property_Mapper');
                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)) {
@@ -108,7 +108,7 @@ class Tx_Extbase_MVC_Controller_Argument {
                        $this->setDataType($dataType);
                }
        }
-
+       
        /**
         * Returns the name of this argument
         *
@@ -126,7 +126,7 @@ class Tx_Extbase_MVC_Controller_Argument {
         * @throws InvalidArgumentException if $shortName is not a character
         */
        public function setShortName($shortName) {
-               if ($shortName !== NULL && (!is_string($shortName) || strlen($shortName) != 1)) throw new InvalidArgumentException('$shortName must be a single character or NULL', 1195824959);
+               if ($shortName !== NULL && (!is_string($shortName) || strlen($shortName) !== 1)) throw new InvalidArgumentException('$shortName must be a single character or NULL', 1195824959);
                $this->shortName = $shortName;
                return $this;
        }
@@ -139,32 +139,15 @@ class Tx_Extbase_MVC_Controller_Argument {
        public function getShortName() {
                return $this->shortName;
        }
-
-       /**
-        * Sets the default value of the argument
-        *
-        * @param mixed $defaultValue Default value
-        * @return void
-        */
-       public function setDefaultValue($defaultValue) {
-               $this->defaultValue = $defaultValue;
-       }
-
+       
        /**
         * Sets the data type of this argument's value
         *
-        * @param string $dataType: Name of the data type
+        * @param string $dataType The data type. Can be either a built-in type such as "Text" or "Integer" or a fully qualified object name
         * @return Tx_Extbase_MVC_Controller_Argument $this
         */
        public function setDataType($dataType) {
-               $this->dataType = ($dataType != '' ? $dataType : 'Text');
-               // TODO Make validator path and class names configurable
-               $validatorClassName = 'Tx_Extbase_Validation_Validator_' . $this->dataType;
-               $classFilePathAndName = t3lib_extMgm::extPath('extbase') . 'Classes/Validation/Validator/' . $this->dataType . '.php';
-               if (isset($classFilePathAndName) && file_exists($classFilePathAndName)) {
-                       require_once($classFilePathAndName);
-                       $this->validator = t3lib_div::makeInstance($validatorClassName);
-               }
+               $this->dataType = $dataType;
                return $this;
        }
 
@@ -184,7 +167,7 @@ class Tx_Extbase_MVC_Controller_Argument {
         * @return Tx_Extbase_MVC_Controller_Argument $this
         */
        public function setRequired($required) {
-               $this->isRequired = $required;
+               $this->isRequired = (boolean)$required;
                return $this;
        }
 
@@ -198,133 +181,49 @@ class Tx_Extbase_MVC_Controller_Argument {
        }
 
        /**
-        * Sets the value of this argument.
-        *
-        * @param mixed $value: The value of this argument
-        * @return Tx_Extbase_MVC_Controller_Argument $this
-        * @throws Tx_Extbase_Exception_InvalidArgumentValue if the argument is not a valid object of type $dataType
-        */
-       public function setValue($value) {
-               if ($this->isValidValueForThisArgument($value)) {
-                       $this->value = $value;
-               }
-               return $this;
-       }
-
-       /**
-        * Returns the value of this argument
-        *
-        * @return object The value of this argument - if none was set, NULL is returned
-        */
-       public function getValue() {
-               if ($this->value === NULL) {
-                       return $this->defaultValue;
-               } else {
-                       return $this->value;
-               }
-       }
-
-       /**
-        * Checks if this argument has a value set.
-        *
-        * @return boolean TRUE if a value was set, otherwise FALSE
-        */
-       public function isValue() {
-               return $this->value !== NULL;
-       }
-
-       /**
-        * undocumented function
-        *
-        * @param string $value
-        * @return boolean TRUE if the value is valid for this argument, otherwise FALSE
-        */
-       protected function isValidValueForThisArgument($value) {
-               $isValid = TRUE;
-               $this->clearErrors();
-               $validatorErrors = t3lib_div::makeInstance('Tx_Extbase_Validation_Errors');
-               if ($this->getValidator() !== NULL) {
-                       $isValid &= (boolean)$this->getValidator()->isValid($value, $validatorErrors);
-               } else {
-                       throw new Tx_Extbase_Validation_Exception_NoValidatorFound('No appropriate validator for the argument "' . $this->getName() . '" was found.', 1235748909);
-               }
-               if (!$isValid) {
-                       foreach ($validatorErrors as $error) {
-                               $this->addError($error);
-                       }
-               }
-               $this->setIsValid($isValid);
-               return $isValid;
-       }
-
-       /**
-        * Sets the validity of the argument
-        *
-        * @return void
-        */
-       // TODO naming of the method setIsValid()
-       public function setIsValid($isValid) {
-               return $this->isValid = $isValid;
-       }
-
-       /**
-        * Returns TRUE when the argument is valid
-        *
-        * @return boolean TRUE if the argument is valid
-        */
-       public function isValid() {
-               return $this->isValid;
-       }
-
-       /**
-        * Add an initialization error (e.g. a mapping error)
-        *
-        * @param string An error text
-        * @return void
-        */
-       public function addError($error) {
-               $this->errors[] = $error;
-       }
-
-       /**
-        * Removes all errors
+        * Sets the default value of the argument
         *
+        * @param mixed $defaultValue Default value
         * @return void
         */
-       public function clearErrors() {
-               $this->errors = array();
+       public function setDefaultValue($defaultValue) {
+               $this->defaultValue = $defaultValue;
        }
 
        /**
-        * Get all initialization errors
+        * Returns the default value of this argument
         *
-        * @return array An array containing Tx_Extbase_Error_Error objects
-        * @see addError(Tx_Extbase_Error_Error $error)
+        * @return mixed The default value
         */
-       public function getErrors() {
-               return $this->errors;
+       public function getDefaultValue() {
+               return $this->defaultValue;
        }
-
+       
        /**
-        * Returns true if any error was recognized
+        * Sets a custom validator which is used supplementary to the base validation
         *
-        * @return boolean True if an error occured
+        * @param Tx_Extbase_Validation_Validator_ValidatorInterface $validator The actual validator object
+        * @return Tx_Extbase_MVC_Controller_Argument Returns $this (used for fluent interface)
         */
-       public function hasErrors() {
-               return (count($this->errors) > 0);
+       public function setValidator(Tx_Extbase_Validation_Validator_ValidatorInterface $validator) {
+               $this->validator = $validator;
+               return $this;
        }
 
        /**
-        * Set an additional validator
+        * Create and set a validator chain
         *
-        * @param string Class name of a validator
+        * @param array Object names of the validators
         * @return Tx_Extbase_MVC_Controller_Argument Returns $this (used for fluent interface)
         */
-       public function setValidator($className) {
-               $this->validator = t3lib_div::makeInstance($className);
+       public function setNewValidatorChain(array $objectNames) {
+               $this->validator = $this->objectFactory->create('Tx_Extbase_Validation_Validator_ChainValidator');
+               foreach ($objectNames as $objectName) {
+                       if (!$this->objectManager->isObjectRegistered($objectName)) $objectName = 'Tx_Extbase_Validation_Validator_' . $objectName;
+                       $this->validator->addValidator(t3lib_div::makeInstance($objectName));
+               }
                return $this;
        }
-
        /**
         * Returns the set validator
         *
@@ -335,42 +234,72 @@ class Tx_Extbase_MVC_Controller_Argument {
        }
 
        /**
-        * Create and set a validator chain
+        * Sets the value of this argument.
         *
-        * @param array Object names of the validators
-        * @return Tx_Extbase_MVC_Controller_Argument Returns $this (used for fluent interface)
+        * @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
+        * @author Robert Lemke <robert@typo3.org>
         */
-       public function setNewValidatorChain(array $validators) {
-               $this->validator = t3lib_div::makeInstance('Tx_Extbase_Validation_Validator_ChainValidator');
-               foreach ($validators as $validator) {
-                       if (is_array($validator)) {
-                               $objectName = 'Tx_Extbase_Validation_Validator_' . $validator[0];
-                               $this->validator->addValidator(new $objectName);
+       public function setValue($value) {
+               if (is_array($value)) {
+                       if (isset($value['uid'])) {
+                               $existingObject = $this->findObjectByUid($value['uid']);
+                               if ($existingObject === FALSE) throw new Tx_Extbase_MVC_Exception_InvalidArgumentValue('Argument "' . $this->name . '": Querying the repository for the specified object was not sucessful.', 1237305720);
+                               unset($value['uid']);
+                               if (count($value) === 0) {
+                                       $value = $existingObject;
+                               } elseif ($existingObject !== NULL) {
+                                       $newObject = clone $existingObject;
+                                       if ($this->propertyMapper->map(array_keys($value), $value, $newObject)) {
+                                               $value = $newObject;
+                                       }
+                               }
                        } else {
-                               $objectName = 'Tx_Extbase_Validation_Validator_' . $validator;
-                               $this->validator->addValidator(t3lib_div::makeInstance($objectName));
+                               $newObject = t3lib_div::makeInstance($this->dataType);
+                               if ($this->propertyMapper->map(array_keys($value), $value, $newObject)) {
+                                       $value = $newObject;
+                               }
                        }
                }
+               $this->value = $value;
                return $this;
        }
+       
+       /**
+        * Finds an object from the repository by searching for its technical UID.
+        *
+        * @param int $uid The object's uid
+        * @return mixed Either the object matching the uuid or, if none or more than one object was found, FALSE
+        */
+       protected function findObjectByUid($uid) {
+               $query = $this->queryFactory->create($this->dataType);
+               $query->matching('uid=' . intval($uid));
+               $objects = $query->execute();
+               if (count($objects) === 1 ) return current($objects);
+               return FALSE;
+       }
 
        /**
-        * Set the uid for the argument.
+        * Returns the value of this argument
         *
-        * @param string $uid The uid for the argument.
-        * @return void
+        * @return object The value of this argument - if none was set, NULL is returned
         */
-       public function setUid($uid) {
-               $this->uid = $uid;
+       public function getValue() {
+               if ($this->value === NULL) {
+                       return $this->defaultValue;
+               } else {
+                       return $this->value;
+               }
        }
 
        /**
-        * Get the uid of the argument, if it has one.
+        * Checks if this argument has a value set.
         *
-        * @return string Uid of the argument. If none set, returns NULL.
+        * @return boolean TRUE if a value was set, otherwise FALSE
         */
-       public function getUid() {
-               return $this->uid;
+       public function isValue() {
+               return $this->value !== NULL;
        }
 
        /**
index e06b541..56e7679 100644 (file)
@@ -98,11 +98,11 @@ class Tx_Extbase_MVC_Controller_Arguments extends ArrayObject {
         *
         * @param mixed $offset Offset
         * @return Tx_Extbase_MVC_Controller_Argument The requested argument object
-        * @throws Tx_Extbase_Exception_NoSuchArgument if the argument does not exist
+        * @throws Tx_Extbase_MVC_Exception_NoSuchArgument if the argument does not exist
         */
        public function offsetGet($offset) {
                $translatedOffset = $this->translateToLongArgumentName($offset);
-               if ($translatedOffset === '') throw new Tx_Extbase_Exception_NoSuchArgument('The argument "' . $offset . '" does not exist.', 1216909923);
+               if ($translatedOffset === '') throw new Tx_Extbase_MVC_Exception_NoSuchArgument('The argument "' . $offset . '" does not exist.', 1216909923);
                return parent::offsetGet($translatedOffset);
        }
 
@@ -121,6 +121,7 @@ class Tx_Extbase_MVC_Controller_Arguments extends ArrayObject {
                $argument = new Tx_Extbase_MVC_Controller_Argument($name, $dataType);
                $argument->setRequired($isRequired);
                $argument->setDefaultValue($defaultValue);
+               
                $this->addArgument($argument);
                return $argument;
        }
@@ -144,10 +145,10 @@ class Tx_Extbase_MVC_Controller_Arguments extends ArrayObject {
         *
         * @param string $argumentName Name of the argument to retrieve
         * @return Tx_Extbase_MVC_Controller_Argument
-        * @throws Tx_Extbase_Exception_NoSuchArgument
+        * @throws Tx_Extbase_MVC_Exception_NoSuchArgument
         */
        public function getArgument($argumentName) {
-               if (!$this->offsetExists($argumentName)) throw new Tx_Extbase_Exception_NoSuchArgument('An argument "' . $argumentName . '" does not exist.', 1195815178);
+               if (!$this->offsetExists($argumentName)) throw new Tx_Extbase_MVC_Exception_NoSuchArgument('An argument "' . $argumentName . '" does not exist.', 1195815178);
                return $this->offsetGet($argumentName);
        }
 
@@ -185,35 +186,6 @@ class Tx_Extbase_MVC_Controller_Arguments extends ArrayObject {
        }
 
        /**
-        * Returns errors of all arguments
-        *
-        * @return array An array of error messages
-        */
-       public function getErrors() {
-               $errors = array();
-               foreach ($this as $argument) {
-                       $errors = array_merge($errors, $argument->getErrors());
-               }
-               return $errors;
-       }
-       
-       /**
-        * Returns true if all arguments are valid
-        *
-        * @return boolean TRUE if all arguments are valid
-        */
-       public function areValid() {
-               $valid = TRUE;
-               foreach ($this as $argument) {
-                       if (!$argument->isValid()) {
-                               $valid = FALSE;
-                               break;
-                       }
-               }
-               return $valid;
-       }
-
-       /**
         * Magic setter method for the argument values. Each argument
         * value can be set by just calling the setArgumentName() method.
         *
diff --git a/typo3/sysext/extbase/Classes/MVC/Controller/ArgumentsValidator.php b/typo3/sysext/extbase/Classes/MVC/Controller/ArgumentsValidator.php
new file mode 100644 (file)
index 0000000..64ad592
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A validator for controller arguments
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $ID:$
+ * @scope prototype
+ */
+class Tx_Extbase_MVC_Controller_ArgumentsValidator extends Tx_Extbase_Validation_Validator_AbstractObjectValidator {
+
+       /**
+        * Checks if the given value (ie. an Arguments object) is valid.
+        *
+        * If at least one error occurred, the result is FALSE and any errors can
+        * be retrieved through the getErrors() method.
+        *
+        * @param object $arguments The arguments object that should be validated
+        * @return boolean TRUE if all arguments are valid, FALSE if an error occured
+        */
+       public function isValid($arguments) {
+               if (!$arguments instanceof Tx_Extbase_MVC_Controller_Arguments) throw new InvalidArgumentException('Expected Tx_Extbase_MVC_Controller_Arguments, ' . gettype($arguments) . ' given.', 1241079561);
+               $this->errors = array();
+
+               foreach ($arguments->getArgumentNames() as $argumentName) {
+                       if ($this->isPropertyValid($arguments, $argumentName) === FALSE) {
+                               return FALSE;
+                       }
+               }
+               return TRUE;
+       }
+
+       /**
+        * Checks the given object can be validated by the validator implementation
+        *
+        * @param object $object The object to be checked
+        * @return boolean TRUE if this validator can validate instances of the given object or FALSE if it can't
+        */
+       public function canValidate($object) {
+               return ($object instanceof Tx_Extbase_MVC_Controller_Arguments);
+       }
+
+       /**
+        * Checks if the specified property (ie. the argument) of the given arguments
+        * object is valid. Validity is checked by first invoking the validation chain
+        * defined in the argument object.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param object $arguments The arguments object containing the property (argument) to validate
+        * @param string $argumentName Name of the property (ie. name of the argument) to validate
+        * @return boolean TRUE if the argument is valid, FALSE if an error occured
+        */
+       public function isPropertyValid($arguments, $argumentName) {
+               if (!$arguments instanceof Tx_Extbase_MVC_Controller_Arguments) throw new InvalidArgumentException('Expected Tx_Extbase_MVC_Controller_Arguments, ' . gettype($arguments) . ' given.', 1241079562);
+               $argument = $arguments[$argumentName];
+
+               $validatorChain = $argument->getValidator();
+               if ($validatorChain === NULL) return TRUE;
+
+               $argumentValue = $argument->getValue();
+               if ($argumentValue === $argument->getDefaultValue() && $argument->isRequired() === FALSE) return TRUE;
+               if ($validatorChain->isValid($argumentValue) === FALSE) {
+                       $this->errors = $validatorChain->getErrors();
+                       return FALSE;
+               }
+               return TRUE;
+       }
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception.php b/typo3/sysext/extbase/Classes/MVC/Exception.php
new file mode 100644 (file)
index 0000000..fd81f8c
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A generic MVC exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $ID:$
+ */
+class Tx_extbase_MVC_Exception extends Tx_Extbase_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InfiniteLoop.php b/typo3/sysext/extbase/Classes/MVC/Exception/InfiniteLoop.php
new file mode 100644 (file)
index 0000000..94207d0
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Infinite Loop" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InfiniteLoop extends Tx_Extbase_MVC_Exception {
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidActionName.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidActionName.php
new file mode 100644 (file)
index 0000000..82d7d46
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "invalid action name" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidActionName extends Tx_Extbase_MVC_Exception {
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentName.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentName.php
new file mode 100644 (file)
index 0000000..a6f6a64
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Argument Name" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidArgumentName extends Tx_Extbase_MVC_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentType.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentType.php
new file mode 100644 (file)
index 0000000..d3e0227
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Argument Type" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidArgumentType extends Tx_Extbase_MVC_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentValue.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidArgumentValue.php
new file mode 100644 (file)
index 0000000..908bf7a
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Argument Value" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidArgumentValue extends Tx_Extbase_MVC_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidController.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidController.php
new file mode 100644 (file)
index 0000000..d6e8ad9
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Controller" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidController extends Tx_Extbase_MVC_Exception {
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidControllerName.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidControllerName.php
new file mode 100644 (file)
index 0000000..af6b6dd
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Controller Name" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidControllerName extends Tx_Extbase_MVC_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidExtensionName.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidExtensionName.php
new file mode 100644 (file)
index 0000000..6468aea
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Extension Name" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidExtensionName extends Tx_Extbase_MVC_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidMarker.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidMarker.php
new file mode 100644 (file)
index 0000000..3d177c2
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Marker" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidMarker extends Tx_Extbase_MVC_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidRequestMethod.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidRequestMethod.php
new file mode 100644 (file)
index 0000000..e3997cd
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Request Method" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidRequestMethod extends Tx_Extbase_MVC_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidRequestType.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidRequestType.php
new file mode 100644 (file)
index 0000000..9562079
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Request Type" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidRequestType extends Tx_Extbase_MVC_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidTemplateResource.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidTemplateResource.php
new file mode 100644 (file)
index 0000000..8ca6697
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Template Resource" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidTemplateResource extends Tx_Extbase_MVC_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidUriPattern.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidUriPattern.php
new file mode 100644 (file)
index 0000000..c995990
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid URI Pattern" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidUriPattern extends Tx_Extbase_MVC_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/InvalidViewHelper.php b/typo3/sysext/extbase/Classes/MVC/Exception/InvalidViewHelper.php
new file mode 100644 (file)
index 0000000..795b78f
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "invalid ViewHelper" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_InvalidViewHelper extends Tx_Extbase_MVC_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/NoSuchAction.php b/typo3/sysext/extbase/Classes/MVC/Exception/NoSuchAction.php
new file mode 100644 (file)
index 0000000..f201d09
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A "No Such Action" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_NoSuchAction extends Tx_Extbase_MVC_Exception {
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/NoSuchArgument.php b/typo3/sysext/extbase/Classes/MVC/Exception/NoSuchArgument.php
new file mode 100644 (file)
index 0000000..c28b6e3
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A "No Such Argument" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_NoSuchArgument extends Tx_Extbase_MVC_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/NoSuchController.php b/typo3/sysext/extbase/Classes/MVC/Exception/NoSuchController.php
new file mode 100644 (file)
index 0000000..d679c8d
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A "No Such Controller" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_NoSuchController extends Tx_Extbase_MVC_Exception {
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/StopAction.php b/typo3/sysext/extbase/Classes/MVC/Exception/StopAction.php
new file mode 100644 (file)
index 0000000..924a5c2
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * This exception is thrown by a controller to stop the execution of the current
+ * action and return the control to the dispatcher. The dispatcher catches this
+ * exception and - depending on the "dispatched" status of the request - either
+ * continues dispatching the request or returns control to the request handler.
+ *
+ * See the Action Controller's forward() and redirectToURI() methods for more information.
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_StopAction extends Tx_Extbase_MVC_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/Exception/UnsupportedRequestType.php b/typo3/sysext/extbase/Classes/MVC/Exception/UnsupportedRequestType.php
new file mode 100644 (file)
index 0000000..c4e24cf
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Unsupported Request Type" exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_MVC_Exception_UnsupportedRequestType extends Tx_Extbase_MVC_Exception {
+
+}
+?>
\ No newline at end of file
index 1e6ff95..1f3d4b1 100644 (file)
@@ -54,12 +54,12 @@ class Tx_Extbase_MVC_Request {
        /**
         * @var string Name of the extension which is supposed to handle this request. This is the extension name converted to UpperCamelCase
         */
-       protected $extensionName = 'Extbase';
+       protected $controllerExtensionName = 'Extbase';
 
        /**
         * @var string Name of the controller which is supposed to handle this request.
         */
-       protected $controllerName = 'Default';
+       protected $controllerName = 'Standard';
 
        /**
         * @var string Name of the action the controller is supposed to take.
@@ -114,7 +114,7 @@ class Tx_Extbase_MVC_Request {
         * @throws Tx_Extbase_Exception_NoSuchController if the controller does not exist
         */
        public function getControllerObjectName() {
-               $lowercaseObjectName = str_replace('@extension', $this->extensionName, $this->controllerObjectNamePattern);
+               $lowercaseObjectName = str_replace('@extension', $this->controllerExtensionName, $this->controllerObjectNamePattern);
                $lowercaseObjectName = str_replace('@controller', $this->controllerName, $lowercaseObjectName);
                // TODO implement getCaseSensitiveObjectName()
                $objectName = $lowercaseObjectName;
@@ -175,7 +175,7 @@ class Tx_Extbase_MVC_Request {
         */
        public function getViewObjectName() {
                $viewObjectName = $this->viewObjectNamePattern;
-               $viewObjectName = str_replace('@extension', $this->extensionName, $viewObjectName);
+               $viewObjectName = str_replace('@extension', $this->controllerExtensionName, $viewObjectName);
                $viewObjectName = str_replace('@controller', $this->controllerName, $viewObjectName);
                $viewObjectName = str_replace('@action', ucfirst($this->controllerActionName), $viewObjectName);
                return $viewObjectName;
@@ -205,13 +205,13 @@ class Tx_Extbase_MVC_Request {
        /**
         * Sets the extension name of the controller.
         *
-        * @param string $extensionName The extension name.
+        * @param string $controllerExtensionName The extension name.
         * @return void
         * @throws Tx_Extbase_Exception_InvalidExtensionName if the extension name is not valid
         */
-       public function setExtensionName($extensionName = NULL) {
-               if ($extensionName !== NULL) {
-                       $this->extensionName = $extensionName;
+       public function setControllerExtensionName($controllerExtensionName = NULL) {
+               if ($controllerExtensionName !== NULL) {
+                       $this->controllerExtensionName = $controllerExtensionName;
                }
        }
 
@@ -220,8 +220,8 @@ class Tx_Extbase_MVC_Request {
         *
         * @return string The extension name
         */
-       public function getExtensionName() {
-               return $this->extensionName;
+       public function getControllerExtensionName() {
+               return $this->controllerExtensionName;
        }
 
        /**
@@ -229,8 +229,8 @@ class Tx_Extbase_MVC_Request {
         *
         * @return string The extension name
         */
-       public function getExtensionKey() {
-               return Tx_Extbase_Utility_Strings::camelCaseToLowerCaseUnderscored($this->extensionName);
+       public function getControllerExtensionKey() {
+               return Tx_Extbase_Utility_Strings::camelCaseToLowerCaseUnderscored($this->controllerExtensionName);
        }
 
        /**
diff --git a/typo3/sysext/extbase/Classes/MVC/View/Helper/AbstractHelper.php b/typo3/sysext/extbase/Classes/MVC/View/Helper/AbstractHelper.php
new file mode 100644 (file)
index 0000000..11ec92f
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An abstract View Helper
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $ID:$
+ */
+abstract class Tx_Extbase_MVC_View_Helper_AbstractHelper implements Tx_Extbase_MVC_View_Helper_HelperInterface {
+
+       /**
+        * @var Tx_Extbase_MVC_Web_Request
+        */
+       protected $request;
+
+       /**
+        * Sets the current request
+        */
+       public function setRequest(Tx_Extbase_MVC_Web_Request $request) {
+               $this->request = $request;
+       }
+}
+
+?>
diff --git a/typo3/sysext/extbase/Classes/MVC/View/Helper/HelperInterface.php b/typo3/sysext/extbase/Classes/MVC/View/Helper/HelperInterface.php
new file mode 100644 (file)
index 0000000..b0cf84b
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * View Helper Interface
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $ID:$
+ */
+interface Tx_Extbase_MVC_View_Helper_HelperInterface {
+
+       /**
+        * Sets the current request
+        */
+       public function setRequest(Tx_Extbase_MVC_Web_Request $request);
+}
+
+?>
diff --git a/typo3/sysext/extbase/Classes/MVC/View/Helper/URIHelperStep1.php b/typo3/sysext/extbase/Classes/MVC/View/Helper/URIHelperStep1.php
new file mode 100644 (file)
index 0000000..9cbe07f
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/*                                                                        *
+ * This script is part of the TYPO3 project - inspiring people to share!  *
+ *                                                                        *
+ * TYPO3 is free software; you can redistribute it and/or modify it under *
+ * the terms of the GNU General Public License version 2 as published by  *
+ * the Free Software Foundation.                                          *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General      *
+ * Public License for more details.                                       *
+ *                                                                        */
+
+require_once(PATH_t3lib . 'interfaces/interface.t3lib_singleton.php');
+require_once(PATH_tslib . 'class.tslib_content.php');
+
+/**
+ * @package
+ * @subpackage
+ * @version $Id:$
+ */
+// TODO Rename file name URIHelper to URIHelper
+class Tx_Extbase_MVC_View_Helper_URIHelper extends Tx_Extbase_MVC_View_Helper_AbstractHelper implements t3lib_Singleton {
+
+       /**
+        * An instance of tslib_cObj
+        *
+        * @var tslib_cObj
+        */
+       protected $contentObject;
+
+       /**
+        * Constructs this URI Helper
+        */
+       public function __construct(array $arguments = array()) {
+               $this->contentObject = t3lib_div::makeInstance('tslib_cObj');
+       }
+
+       /**
+        * Creates an URI by making use of the typolink mechanism.
+        *
+        * @param string $actionName Name of the action to be called
+        * @param array $arguments Additional arguments 
+        * @param string $controllerName Name of the target controller. If not set, current controller is used
+        * @param string $extensionName Name of the target extension. If not set, current extension is used
+        * @param array $options Further options (usually options of the typolink configuration)
+        * @return string the HTML code for the generated link
+        */
+       // TODO Check the order of the parameters
+       public function URIFor($actionName, $arguments = array(), $controllerName = NULL, $extensionName = NULL, $pageUid = NULL, array $options = array()) {
+               $arguments['action'] = $actionName;
+               $arguments['controller'] = ($controllerName !== NULL) ? $controllerName : $this->request->getControllerName();
+               $prefixedExtensionKey = 'tx_' . strtolower($this->request->getControllerExtensionName()) . '_' . strtolower($this->request->getPluginKey());
+               $prefixedArguments = array();
+               foreach ($arguments as $argumentName => $argumentValue) {
+                       $key = $prefixedExtensionKey . '[' . $argumentName . ']';
+                       $prefixedArguments[$key] = $argumentValue;
+               }
+               $URIString = $this->typolinkURI($pageUid, $options, $prefixedArguments);
+               return $URIString;
+       }
+
+       /**
+        * Get an URI from typolink_URL
+        * 
+        * @return The URI
+        */
+       public function typolinkURI($parameter = NULL, array $options = array(), array $arguments = array()) {
+               $typolinkConfiguration = array();
+               $typolinkConfiguration = t3lib_div::array_merge_recursive_overrule($typolinkConfiguration, $options, 0, FALSE);
+               if (($parameter === NULL) && ($options['parameter'] === NULL)) {
+                       $typolinkConfiguration['parameter'] = $GLOBALS['TSFE']->id;
+               }
+               if (count($arguments) > 0) {
+                       $typolinkConfiguration['additionalParams'] = '';
+                       foreach ($arguments as $argumentNameSpace => $argument) {
+                               $typolinkConfiguration['additionalParams'] .= '&' . $argumentNameSpace . '=' . rawurlencode($argument);
+                       }
+               }
+               return $this->contentObject->typoLink_URL($typolinkConfiguration);
+       }
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/MVC/View/Helper/UriHelper.php b/typo3/sysext/extbase/Classes/MVC/View/Helper/UriHelper.php
deleted file mode 100644 (file)
index 5fa5c21..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/*                                                                        *
- * This script is part of the TYPO3 project - inspiring people to share!  *
- *                                                                        *
- * TYPO3 is free software; you can redistribute it and/or modify it under *
- * the terms of the GNU General Public License version 2 as published by  *
- * the Free Software Foundation.                                          *
- *                                                                        *
- * This script is distributed in the hope that it will be useful, but     *
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General      *
- * Public License for more details.                                       *
- *                                                                        */
-
-require_once(PATH_t3lib . 'interfaces/interface.t3lib_singleton.php');
-require_once(PATH_tslib . 'class.tslib_content.php');
-
-/**
- * @package
- * @subpackage
- * @version $Id:$
- */
-// TODO Rename file name URIHelper to UriHelper
-class Tx_Extbase_MVC_View_Helper_UriHelper extends Tx_Extbase_MVC_View_Helper_AbstractHelper implements t3lib_Singleton {
-
-       /**
-        * An instance of tslib_cObj
-        *
-        * @var tslib_cObj
-        */
-       protected $contentObject;
-
-       /**
-        * Constructs this URI Helper
-        */
-       public function __construct(array $arguments = array()) {
-               $this->contentObject = t3lib_div::makeInstance('tslib_cObj');
-       }
-
-       /**
-        * Creates an URI by making use of the typolink mechanism.
-        *
-        * @param string $actionName Name of the action to be called
-        * @param array $arguments Additional arguments
-        * @param string $controllerName Name of the target controller. If not set, current controller is used
-        * @param string $pageUid 
-        * @param array $options Further options
-        * @return string the HTML code for the generated link
-        * @author Bastian Waidelich <bastian@typo3.org>
-        */
-       public function uriFor($actionName, $arguments = array(), $controllerName = '', $parameter = 0, $anchor = '', $useCacheHash = TRUE) {
-               $prefixedExtensionKey = 'tx_' . strtolower($this->request->getControllerExtensionKey()) . '_' . strtolower($this->request->getPluginKey());
-
-               $arguments['action'] = $actionName;
-               $arguments['controller'] = ($controllerName !== '') ? $controllerName : $this->request->getControllerName();
-               $prefixedArguments = array();
-               foreach ($arguments as $argumentName => $argumentValue) {
-                       $key = $prefixedExtensionKey . '[' . $argumentName . ']';
-                       $prefixedArguments[$key] = $argumentValue;
-               }
-
-               return $this->typolinkUri($pageUid, $anchor, $useCacheHash, $prefixedArguments);
-       }
-
-       /**
-        * Get an URI from typolink
-        * @return The URI
-        */
-       public function typolinkUri($pageUid = 0, $anchor = '', $useCacheHash = TRUE, $arguments = array()) {
-               if ($pageUid === 0) {
-                       $pageUid = $GLOBALS['TSFE']->id;
-               }
-
-               $typolinkConfiguration = array(
-                       'parameter' => $pageUid
-               );
-
-               if (count($arguments) > 0) {
-                       foreach ($arguments as $argumentNameSpace => $argument) {
-                               $typolinkConfiguration['additionalParams'] .= '&' . $argumentNameSpace . '=' . rawurlencode($argument);
-                       }
-               }
-               if (!empty($anchor)) {
-                       $typolinkConfiguration['section'] = $anchor;
-               }
-               if ($useCacheHash === TRUE) {
-                       $typolinkConfiguration['useCacheHash'] = 1;
-               } else {
-                       $typolinkConfiguration['useCacheHash'] = 0;
-               }
-
-               return $this->contentObject->typoLink_URL($typolinkConfiguration);
-       }
-}
-?>
\ No newline at end of file
index 9d53db8..328b110 100644 (file)
@@ -43,7 +43,7 @@ interface Tx_Extbase_MVC_View_ViewInterface {
         * Returns an View Helper instance.
         * View Helpers must implement the interface Tx_Extbase_MVC_View_Helper_HelperInterface
         *
-        * @param string $viewHelperObjectName the full name of the View Helper object including namespace
+        * @param string $viewHelperObjectName the full name of the View Helper object
         * @return Tx_Extbase_MVC_View_Helper_HelperInterface The View Helper instance
         */
        public function getViewHelper($viewHelperObjectName);
index 9caca17..3e80341 100755 (executable)
@@ -77,9 +77,15 @@ class Tx_Extbase_MVC_Web_RequestBuilder {
                }
                if (!empty($configuration['controller'])) {
                        $this->defaultControllerName = $configuration['controller'];
+               } elseif (is_array($configuration['switchableControllerActions.'])) {
+                       $firstControllerActions = current($configuration['switchableControllerActions.']);
+                       $this->defaultControllerName = $firstControllerActions['controller'];
                }
                if (!empty($configuration['action'])) {
                        $this->defaultActionName = $configuration['action'];
+               } elseif (is_array($configuration['switchableControllerActions.'])) {
+                       $firstControllerActions = current($configuration['switchableControllerActions.']);
+                       $this->defaultActionName = array_shift(t3lib_div::trimExplode(',', $firstControllerActions['actions'], TRUE));
                }
                $allowedControllerActions = array();
                if (is_array($configuration['switchableControllerActions.'])) {
@@ -115,7 +121,7 @@ class Tx_Extbase_MVC_Web_RequestBuilder {
 
                $request = t3lib_div::makeInstance('Tx_Extbase_MVC_Web_Request');
                $request->setPluginKey($this->pluginKey);
-               $request->setExtensionName($this->extensionName);
+               $request->setControllerExtensionName($this->extensionName);
                $request->setControllerName($controllerName);
                $request->setControllerActionName($actionName);
                $request->setRequestURI(t3lib_div::getIndpEnv('TYPO3_REQUEST_URL'));
diff --git a/typo3/sysext/extbase/Classes/Persistence/DataMapperInterface.php b/typo3/sysext/extbase/Classes/Persistence/DataMapperInterface.php
new file mode 100644 (file)
index 0000000..a2488f4
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A data mapper interface.
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $ID:$
+ */
+interface Tx_Extbase_Persistence_DataMapperInterface {
+
+       /**
+        * Sets the aggregate root objects. The aggregate root objects are a starting point to traverse the 
+        * object graph.
+        *
+        * @param Tx_Extbase_Persistence_ObjectStorage $objects The objects to be registered
+        * @return void
+        */
+       public function setAggregateRootObjects(Tx_Extbase_Persistence_ObjectStorage $objects);
+       
+       /**
+        * Sets the deleted objects.
+        *
+        * @param Tx_Extbase_Persistence_ObjectStorage $objects The objects to be deleted
+        * @return void
+        */
+       public function setDeletedObjects(Tx_Extbase_Persistence_ObjectStorage $objects);
+
+       /**
+        * Persists all objects traversing the object graph.
+        *
+        * @return void
+        */
+       public function persistObjects();
+
+       /**
+        * Processes all deleted objects.
+        *
+        * @return void
+        */
+       public function processDeletedObjects();
+
+}
+?>
\ No newline at end of file
index 5e0b793..ea62936 100644 (file)
@@ -58,8 +58,7 @@ class Tx_Extbase_Persistence_Mapper_DataMap {
         */
        public function __construct($className) {
                $this->setClassName($className);
-               // SK: strtolower(..) is the wrong conversion for the class name. See the notice in the dispatcher (tt_news ->tx_ttnews)
-               $this->setTableName(strtolower($this->className));
+               $this->setTableName($this->determineTableName($className));
                t3lib_div::loadTCA($this->getTableName());
                $this->initialize();
        }
@@ -99,6 +98,17 @@ class Tx_Extbase_Persistence_Mapper_DataMap {
        public function getTableName() {
                return $this->tableName;
        }
+       
+       /**
+        * Returns the table name for a given class name. If there is an alias defined in the $TCA, it takes the alias name.
+        * Otherwise it converts the class anme to lowercase by default.
+        *
+        * @package default
+        */
+       protected function determineTableName($className) {
+               // TODO Implement table name aliases
+               return strtolower($className);
+       }
 
        /**
         * Initializes the data map by adding column maps for all the configured columns in the $TCA. 
index 4efcf22..daa3999 100644 (file)
@@ -32,7 +32,7 @@ require_once(PATH_tslib . 'class.tslib_content.php');
  * @subpackage extbase
  * @version $ID:$
  */
-class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singleton {
+class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements Tx_Extbase_Persistence_DataMapperInterface, t3lib_Singleton {
 
        /**
         * Cached data maps
@@ -42,11 +42,11 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
        protected $dataMaps = array();
 
        /**
-        * The TYPO3 DB object
+        * The persistence backend
         *
-        * @var t3lib_db
+        * @var t3lib_DB
         **/
-       protected $database;
+       protected $persistenceBackend;
 
        /**
         * The TYPO3 reference index object
@@ -77,15 +77,22 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
        protected $identityMap = array();
 
        /**
+        * A reference to the page select object providing methods to perform language and work space overlays
+        *
+        * @var t3lib_pageSelect
+        **/
+       protected $pageSelectObject;
+
+       /**
         * Constructs a new mapper
         *
         */
-       public function __construct() {
+       public function __construct(t3lib_DB $persistenceBackend) {
+               $this->persistenceBackend = $persistenceBackend;
+               $this->referenceIndex = t3lib_div::makeInstance('t3lib_refindex');
                $this->aggregateRootObjects = new Tx_Extbase_Persistence_ObjectStorage();
                $this->identityMap = new Tx_Extbase_Persistence_IdentityMap();
                $GLOBALS['TSFE']->includeTCA();
-               $this->database = $GLOBALS['TYPO3_DB'];
-               $this->referenceIndex = t3lib_div::makeInstance('t3lib_refindex');
        }
 
        /**
@@ -117,9 +124,9 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
         *
         * <pre>
         * array(
-        *   array('blog_description LIKE ?', $keyword),
-        *      'blogName' => 'Foo'
-        *      )
+        *              array('blog_description LIKE ?', $keyword),
+        *              'blogName' => 'Foo'
+        *              )
         * </pre>
         *
         * Note: The SQL part uses the database columns names, the query by example syntax uses
@@ -177,8 +184,8 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
        protected function buildQueryByExample(Tx_Extbase_Persistence_Mapper_DataMap &$dataMap, $propertyName, $example) {
                $sql = '';
                $columnMap = $dataMap->getColumnMap($propertyName);
-               if (!$columnMap) {
-                       echo "No columnMap for $propertyName";
+               if (empty($columnMap)) {
+                       throw new Tx_Extbase_Persistence_Exception_InvalidPropertyType("No columnMap for $propertyName", 1240305176);
                }
                if (!is_array($example)) {
                        $column = $dataMap->getTableName() . '.' . $columnMap->getColumnName();
@@ -216,16 +223,16 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
         * statement is raw SQL and will not be escaped. It is much safer to use the
         * generic find method to supply where conditions.
         *
-        * @param string $className the className
+        * @param string $className The name of class to be fetched
         * @param string $where WHERE statement
         * @param string $from FROM statement will default to the tablename of the given class
         * @param string $groupBy GROUP BY statement
         * @param string $orderBy ORDER BY statement
         * @param string $limit LIMIT statement
-        * @return array The matched rows
+        * @return array The matched objects
         */
        public function fetch($className, $where = '', $from = '', $groupBy = '', $orderBy = '', $limit = '', $useEnableFields = TRUE) {
-               if (!strlen($where)) {
+               if (strlen($where) === 0) {
                        $where = '1=1';
                }
                $dataMap = $this->getDataMap($className);
@@ -240,7 +247,7 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                        $enableFields = '';
                }
 
-               $res = $this->database->exec_SELECTquery(
+               $res = $this->persistenceBackend->exec_SELECTquery(
                        '*',
                        $from,
                        $where . $enableFields,
@@ -250,12 +257,7 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                        );
 
                $fieldMap = $this->getFieldMapFromResult($res);
-               $rows = $this->getRowsFromResult($res);
-               $this->database->sql_free_result($res);
-               // TODO Implement language and workspace overlay
-               // foreach ($rows as $row) {
-               //      $this->doLanguageAndWorkspaceOverlay($dataMap, $fieldMap, $row);
-               // }
+               $rows = $this->getRowsFromResult($dataMap->getTableName(), $res);
 
                $objects = array();
                if (is_array($rows)) {
@@ -267,20 +269,25 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
        }
 
        /**
-        * Fetches a rows from the database by given SQL statement snippets taking a relation table into account
-        *
-        * @param string Optional WHERE clauses put in the end of the query, defaults to '1=1. NOTICE: You must escape values in this argument with $this->fullQuoteStr() yourself!
-        * @param string Optional GROUP BY field(s), defaults to blank string.
-        * @param string Optional ORDER BY field(s), defaults to blank string.
-        * @param string Optional LIMIT value ([begin,]max), defaults to blank string.
+        * Fetches and reconstitutes objects from the database by given SQL statement snippets taking a relation 
+        * table into account. The fetch process is delegated.
+        *
+        * @param Tx_Extbase_DomainObject_AbstractEntity $parentObject The 
+        * @param Tx_Extbase_Peristence_Mapper_ColumnMap $columnMap 
+        * @param string $where The WHERE clause
+        * @param string $groupBy The GROUP BY clause
+        * @param string $orderBy The ORDER BY clause
+        * @param string $limit The LIMIT clause
+        * @param boolean $useEnableFields TRUE if enableFields() should be checked (default: TRUE) 
+        * @return array An array if matched objects
+        * @see Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper::fetch()
         */
-       public function fetchWithRelationTable($parentObject, $columnMap, $where = '', $groupBy = '', $orderBy = '', $limit = '', $useEnableFields = TRUE) {
-               if (!strlen($where)) {
+       public function fetchWithRelationTable(Tx_Extbase_DomainObject_AbstractEntity $parentObject, Tx_Extbase_Persistence_Mapper_ColumnMap $columnMap, $where = '', $groupBy = '', $orderBy = '', $limit = '', $useEnableFields = TRUE) {
+               if (strlen($where) === 0) {
                        $where = '1=1';
                }
-               $from = $columnMap->getChildTableName() . ' LEFT JOIN ' . $columnMap->getRelationTableName() . ' ON (' . $columnMap->getChildTableName() . '.uid=' . $columnMap->getRelationTableName() . '.uid_foreign)';
-               $where .= ' AND ' . $columnMap->getRelationTableName() . '.uid_local=' . t3lib_div::intval_positive($parentObject->getUid());
-
+               $from = $columnMap->getChildTableName() . ', ' . $columnMap->getRelationTableName();
+               $where .= ' AND ' . $columnMap->getChildTableName() . '.uid=' . $columnMap->getRelationTableName() . '.uid_foreign AND ' . $columnMap->getRelationTableName() . '.uid_local=' . t3lib_div::intval_positive($parentObject->getUid());
                return $this->fetch($columnMap->getChildClassName(), $where, $from, $groupBy, $orderBy, $limit, $useEnableFields);
        }
 
@@ -297,12 +304,17 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                return $fieldMap;
        }
 
-       protected function getRowsFromResult($res) {
+       protected function getRowsFromResult($tableName, $res) {
                $rows = array();
-               if ($res !== FALSE) {
-                       while($rows[] = $this->database->sql_fetch_row($res));
-                       array_pop($rows);
+               while ($row = $this->persistenceBackend->sql_fetch_assoc($res)) {
+                       $row = $this->doLanguageAndWorkspaceOverlay($tableName, $row);
+                       if (is_array($row)) {
+                               $arrayKeys = range(0,count($row));
+                               array_fill_keys($arrayKeys, $row);
+                               $rows[] = $row;
+                       }
                }
+               $this->persistenceBackend->sql_free_result($res);
                return $rows;
        }
 
@@ -316,42 +328,39 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
         * @param string $workspaceUidUid The workspace id
         * @return void
         */
-       protected function doLanguageAndWorkspaceOverlay(Tx_Extbase_Persistence_Mapper_DataMap $dataMap, array &$fieldMap, array &$row, $languageUid = null, $workspaceUid = null) {
-               $tableName = $dataMap->getTableName();
-               if (TYPO3_MODE == 'FE') {
-                       if (is_object($GLOBALS ['TSFE'])) {
-                               $pageSelectObject = $GLOBALS ['TSFE']->sys_page;
-                               if ($languageUid === NULL) {
-                                       $languageUid = $GLOBALS ['TSFE']->sys_language_content;
+       protected function doLanguageAndWorkspaceOverlay($tableName, array $row, $languageUid = NULL, $workspaceUid = NULL) {
+               if (!($this->pageSelectObject instanceof t3lib_pageSelect)) {
+                       if (TYPO3_MODE == 'FE') {
+                               if (is_object($GLOBALS ['TSFE'])) {
+                                       $this->pageSelectObject = $GLOBALS ['TSFE']->sys_page;
+                                       if ($languageUid === NULL) {
+                                               $languageUid = $GLOBALS ['TSFE']->sys_language_content;
+                                       }
+                               } else {
+                                       require_once(PATH_t3lib . 'class.t3lib_page.php');
+                                       $this->pageSelectObject = t3lib_div::makeInstance('t3lib_pageSelect');
+                                       if ($languageUid === NULL) {
+                                               $languageUid = intval(t3lib_div::_GP('L'));
+                                       }
                                }
-                       }
-                       else {
+                               if ($workspaceUid !== NULL) {
+                                       $this->pageSelectObject->versioningWorkspaceId = $workspaceUid;
+                               }
+                       } else {
                                require_once(PATH_t3lib . 'class.t3lib_page.php');
-                               $pageSelectObject = t3lib_div::makeInstance('t3lib_pageSelect');
-                               if ($languageUid === NULL) {
-                                       $languageUid = intval(t3lib_div::_GP('L'));
+                               $this->pageSelectObject = t3lib_div::makeInstance( 't3lib_pageSelect' );
+                               //$this->pageSelectObject->versioningPreview =  TRUE;
+                               if ($workspaceUid === NULL) {
+                                       $workspaceUid = $GLOBALS ['BE_USER']->workspace;
                                }
+                               $this->pageSelectObject->versioningWorkspaceId = $workspaceUid;
                        }
-                       if ($workspaceUid !== NULL) {
-                               $pageSelectObject->versioningWorkspaceId = $workspaceUid;
-                       }
-               } else {
-                       require_once(PATH_t3lib . 'class.t3lib_page.php');
-                       $pageSelectObject = t3lib_div::makeInstance( 't3lib_pageSelect' );
-                       //$pageSelectObject->versioningPreview =  TRUE;
-                       if ($workspaceUid === NULL) {
-                               $workspaceUid = $GLOBALS ['BE_USER']->workspace;
-                       }
-                       $pageSelectObject->versioningWorkspaceId = $workspaceUid;
                }
 
-               $row = $pageSelectObject->getRecordOverlay($tableName, $row, $languageUid, ''); //'hideNonTranslated'
-
+               $this->pageSelectObject->versionOL($tableName, $row, TRUE);
+               $row = $this->pageSelectObject->getRecordOverlay($tableName, $row, $languageUid, ''); //'hideNonTranslated'
                // TODO Skip if empty languageoverlay (languagevisibility)
-
-               if ($dataMap->isVersionable($tableName)) {
-                       $t3lib_pageSelect->versionOL($tableName, $row);
-               }
+               return $row;
        }
 
        /**
@@ -373,6 +382,10 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                return $join;
        }
 
+       public function map(array $rows) {
+               # code...
+       }
+
        /**
         * reconstitutes domain objects from $rows (array)
         *
@@ -418,14 +431,13 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
         *
         * @param Tx_Extbase_Persistence_Mapper_DataMap $dataMap The data map of the target object
         * @param string $fieldMap the field map of the related database table.
-        * @param string $row The row to be mapped on properties
+        * @param array $row The row to be mapped on properties
         * @return void
         */
        protected function getProperties(Tx_Extbase_Persistence_Mapper_DataMap $dataMap, array &$fieldMap, array &$row) {
                $properties = array();
                foreach ($dataMap->getColumnMaps() as $columnMap) {
-                       $fieldValue = $row[$fieldMap[$dataMap->getTableName()][$columnMap->getColumnName()]];
-                       $properties[$columnMap->getPropertyName()] = $dataMap->convertFieldValueToPropertyValue($columnMap->getPropertyName(), $fieldValue);
+                       $properties[$columnMap->getPropertyName()] = $dataMap->convertFieldValueToPropertyValue($columnMap->getPropertyName(), $row[$columnMap->getColumnName()]);
                }
                return $properties;
        }
@@ -437,7 +449,7 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
         * @param array $properties The names of properties and their values which should be set during the reconstitution
         * @return object The reconstituted object
         */
-       protected function reconstituteObject($className, array $properties = array()) {
+       public function reconstituteObject($className, array $properties = array()) {
                // those objects will be fetched from within the __wakeup() method of the object...
                $GLOBALS['Extbase']['reconstituteObject']['properties'] = $properties;
                $object = unserialize('O:' . strlen($className) . ':"' . $className . '":0:{};');
@@ -535,11 +547,11 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                $dataMap = $this->getDataMap($className);
                $tableName = $dataMap->getTableName();
                $this->addCommonFieldsToRow($object, $parentObject, $parentPropertyName, $row);
-               $res = $this->database->exec_INSERTquery(
+               $res = $this->persistenceBackend->exec_INSERTquery(
                        $tableName,
                        $row
                        );
-               $uid = $this->database->sql_insert_id();
+               $uid = $this->persistenceBackend->sql_insert_id();
                $object->_reconstituteProperty('uid', $uid);
                $this->referenceIndex->updateRefIndexTable($tableName, $uid);
        }
@@ -561,7 +573,7 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                        'sorting' => 9999 // TODO sorting of mm table items
                        );
                $tableName = $dataMap->getColumnMap($parentPropertyName)->getRelationTableName();
-               $res = $this->database->exec_INSERTquery(
+               $res = $this->persistenceBackend->exec_INSERTquery(
                        $tableName,
                        $rowToInsert
                        );
@@ -573,7 +585,7 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                $tableName = $dataMap->getTableName();
                $this->addCommonFieldsToRow($object, $parentObject, $parentPropertyName, $row);
                $uid = $object->getUid();
-               $res = $this->database->exec_UPDATEquery(
+               $res = $this->persistenceBackend->exec_UPDATEquery(
                        $tableName,
                        'uid=' . intval($uid),
                        $row
@@ -681,13 +693,13 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                $tableName = $dataMap->getTableName();
                if ($onlySetDeleted === TRUE && $dataMap->hasDeletedColumn()) {
                        $deletedColumnName = $dataMap->getDeletedColumnName();
-                       $res = $this->database->exec_UPDATEquery(
+                       $res = $this->persistenceBackend->exec_UPDATEquery(
                                $tableName,
                                'uid=' . intval($object->getUid()),
                                array($deletedColumnName => 1)
                                );
                } else {
-                       $res = $this->database->exec_DELETEquery(
+                       $res = $this->persistenceBackend->exec_DELETEquery(
                                $tableName,
                                'uid=' . intval($object->getUid())
                                );
@@ -728,13 +740,13 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
        protected function deleteRelationInRelationTable($relatedObject, Tx_Extbase_DomainObject_DomainObjectInterface $parentObject, $parentPropertyName) {
                $dataMap = $this->getDataMap(get_class($parentObject));
                $tableName = $dataMap->getColumnMap($parentPropertyName)->getRelationTableName();
-               $res = $this->database->exec_SELECTquery(
+               $res = $this->persistenceBackend->exec_SELECTquery(
                        'uid_foreign',
                        $tableName,
                        'uid_local=' . $parentObject->getUid()
                        );
                $existingRelations = array();
-               while($row = $this->database->sql_fetch_assoc($res)) {
+               while($row = $this->persistenceBackend->sql_fetch_assoc($res)) {
                        $existingRelations[current($row)] = current($row);
                }
                $relationsToDelete = $existingRelations;
@@ -748,7 +760,7 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                }
                if (count($relationsToDelete) > 0) {
                        $relationsToDeleteList = implode(',', $relationsToDelete);
-                       $res = $this->database->exec_DELETEquery(
+                       $res = $this->persistenceBackend->exec_DELETEquery(
                                $tableName,
                                'uid_local=' . $parentObject->getUid() . ' AND uid_foreign IN (' . $relationsToDeleteList . ')'
                                );
@@ -773,9 +785,9 @@ class Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
         *
         * @return Tx_Extbase_Persistence_Mapper_DataMap The data map
         */
-       protected function getDataMap($className) {
+       public function getDataMap($className) {
                if (empty($this->dataMaps[$className])) {
-                       // TODO Inject DataMap
+                       // TODO This is a little bit costy for table name aliases -> implement a DataMapBuilder (knowing the aliases defined in $TCA)
                        $dataMap = new Tx_Extbase_Persistence_Mapper_DataMap($className);
                        $this->dataMaps[$className] = $dataMap;
                }
diff --git a/typo3/sysext/extbase/Classes/Persistence/Query.php b/typo3/sysext/extbase/Classes/Persistence/Query.php
new file mode 100644 (file)
index 0000000..9ff4f19
--- /dev/null
@@ -0,0 +1,278 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * The Query classs used to run queries against the database
+ *
+ * @package TYPO3
+ * @subpackage Extbase
+ * @version $Id: $
+ * @scope prototype
+ */
+class Tx_Extbase_Persistence_Query implements Tx_Extbase_Persistence_QueryInterface {
+
+       /**
+        * @var string
+        */
+       protected $className;
+
+       /**
+        * @var Tx_Extbase_Persistence_DataMapperInterface
+        */
+       protected $dataMapper;
+
+       /**
+        * @var Tx_Extbase_Persistence_Session
+        */
+       protected $persistenceSession;
+       
+       /**
+        * @var string
+        */
+       protected $where;
+
+       /**
+        * @var string
+        */
+       protected $groupBy;
+
+       /**
+        * @var string
+        */
+       protected $orderBy;
+
+       /**
+        * @var integer
+        */
+       protected $limit;
+
+       /**
+        * @var integer
+        */
+       protected $offset;
+       
+       /**
+        * @var boolean
+        */
+       protected $useEnableFields = TRUE;
+       
+       /**
+        * @var mixed
+        */
+       protected $constraint;
+
+       /**
+        * Constructs a query object working on the given class name
+        *
+        * @param string $className
+        */
+       public function __construct($className) {
+               $this->className = $className;
+       }
+
+       /**
+        * Injects the DataMapper to map nodes to objects
+        *
+        * @param Tx_Extbase_Persistence_DataMapperInterface $dataMapper
+        * @return void
+        */
+       public function injectDataMapper(Tx_Extbase_Persistence_DataMapperInterface $dataMapper) {
+               $this->dataMapper = $dataMapper;
+       }
+
+       /**
+        * Executes the query against the database and returns the result
+        *
+        * @return array The query result as an array of objects
+        */
+       public function execute() {
+               $this->where = $this->generateWhereClause($this->dataMapper->getDataMap($this->className), $this->constraint);
+               $rows = $this->dataMapper->fetch(
+                       $this->className,
+                       $this->where,
+                       $this->from,
+                       $this->groupBy,
+                       $this->orderBy,
+                       $this->limit,
+                       $this->useEnableFields
+                       );
+               return $this->dataMapper->map($rows);
+       }
+       
+       /**
+        * The constraint used to limit the result set
+        *
+        * @param mixed $constraint Some constraint, depending on the backend
+        * @return Tx_Extbase_Persistence_QueryInterface
+        */
+       public function matching($constraint) {
+               $this->constraint = $constraint;
+               return $this;
+       }
+       
+       
+       /**
+        * The following condition array would find entities with description like the given keyword and
+        * name equal to "foo".
+        *
+        * <pre>
+        * array(
+        *              array('blog_description LIKE ?', $keyword),
+        *              'blogName' => 'Foo'
+        *              )
+        * </pre>
+        *
+        * Note: The SQL part uses the database columns names, the query by example syntax uses
+        * the object property name (camel-cased, without underscore).
+        *
+        * @param Tx_Extbase_Persistence_Mapper_DataMap $dataMap The data map
+        * @return string The query where part for the class and given conditions
+        */
+       public function generateWhereClause(Tx_Extbase_Persistence_Mapper_DataMap $dataMap, $constraint) {
+               $where = '';
+               if (is_array($constraint)) {
+                       $whereParts = array();
+                       foreach ($constraint as $key => $condition) {
+                               if (is_array($condition) && isset($condition[0])) {
+                                       $sql = $this->replacePlaceholders($dataMap, $condition[0], array_slice($condition, 1));
+                                       $whereParts[] = '(' . $sql . ')';
+                               } elseif (is_string($key)) {
+                                       $sql = $this->generateWhereClauseByExample($dataMap, $key, $condition);
+                                       if (strlen($sql) > 0) {
+                                               $whereParts[] = '(' . $sql . ')';
+                                       }
+                               }
+                       }
+                       $where = (implode(' AND ', $whereParts));
+               } if (is_string($constraint)) {
+                       $where = $constraint;
+               }
+               return $where;
+       }
+       
+       /**
+        * Replace query placeholders in a query part by the given
+        * parameters.
+        *
+        * @param string $queryPart The query part with placeholders
+        * @param array $parameters The parameters
+        *
+        * @return string The query part with replaced placeholders
+        */
+       protected function replacePlaceholders(Tx_Extbase_Persistence_Mapper_DataMap $dataMap, $queryPart, $parameters) {
+               $sql = $queryPart;
+               foreach ($parameters as $parameter) {
+                       $markPosition = strpos($sql, '?');
+                       if ($markPosition !== FALSE) {
+                               $sql = substr($sql, 0, $markPosition) . $dataMap->convertPropertyValueToFieldValue($parameter) . substr($sql, $markPosition + 1);
+                       }
+               }
+               return $sql;
+       }
+       
+       
+       /**
+        * Get a where part for an example condition (associative array). This also works
+        * for nested conditions.
+        *
+        * @param Tx_Extbase_Persistence_Mapper_DataMap $dataMap The data map
+        * @param array $propertyName The property name
+        * @param array $example The example condition
+        *
+        * @return string The where part
+        */
+       protected function generateWhereClauseByExample(Tx_Extbase_Persistence_Mapper_DataMap $dataMap, $propertyName, $example) {
+               $columnMap = $dataMap->getColumnMap($propertyName);
+               $sql = '';
+               if (empty($columnMap)) {
+                       throw new Tx_Extbase_Persistence_Exception_InvalidPropertyType("No columnMap for $propertyName", 1240305176);
+               }
+               if (!is_array($example)) {
+                       $column = $dataMap->getTableName() . '.' . $columnMap->getColumnName();
+                       $sql = $column . ' = ' . $dataMap->convertPropertyValueToFieldValue($example);
+               } else {
+                       $childDataMap = $this->dataMapper->getDataMap($columnMap->getChildClassName());
+                       $sql = $this->generateWhereClause($childDataMap, $example);
+               }
+               return $sql;
+       }
+
+       /**
+        * Sets the WHERE Statement
+        *
+        * @param string $where The WHERE statement
+        * @return void
+        */
+       public function setWhereClause($where) {
+               $this->where = $where;
+       }
+
+       /**
+        * Sets the GROUP BY Statement
+        *
+        * @param string $groupBy The GROUP BY statement
+        * @return void
+        */
+       public function setGroupByClause($groupBy) {
+               $this->groupBy = $groupBy;
+       }
+
+       /**
+        * Sets the ORDER BY Statement
+        *
+        * @param string $orderBy The ORDER BY statement
+        * @return void
+        */
+       public function setOrderByClause($orderBy) {
+               $this->orderBy = $orderBy;
+       }
+
+       /**
+        * Sets the maximum size of the result set to limit.
+        *
+        * @param integer $limit
+        * @return void
+        */
+       public function setLimit($limit) {
+               if ($limit < 1 || !is_int($limit)) {
+                       throw new InvalidArgumentException('setLimit() accepts only integers greater than 0.', 1217244746);
+               }
+               $this->limit = $limit;
+       }
+
+       /**
+        * Sets the start offset of the result set to offset.
+        *
+        * @param integer $offset
+        * @return void
+        */
+       public function setOffset($offset) {
+               if ($offset < 0 || !is_int($offset)) {
+                       throw new InvalidArgumentException('setOffset() accepts only integers greater than or equal to 0.', 1217245454);
+               }
+               $this->offset = $offset;
+       }
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Persistence/QueryFactory.php b/typo3/sysext/extbase/Classes/Persistence/QueryFactory.php
new file mode 100644 (file)
index 0000000..7298605
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * The QueryFactory used to create queries against the storage backend
+ *
+ * @package TYPO3
+ * @subpackage Extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Persistence_QueryFactory implements Tx_Extbase_Persistence_QueryFactoryInterface {
+
+       /**
+        * Creates a query object working on the given class name
+        *
+        * @param string $className
+        * @return Tx_Extbase_Persistence_Query
+        */
+       public function create($className) {
+               // TODO Make the Query class configurable
+               $query = t3lib_div::makeInstance('Tx_Extbase_Persistence_Query', $className);
+               // TODO Make the responsible Data Mapper configurable
+               $query->injectDataMapper(t3lib_div::makeInstance('Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper', $GLOBALS['TYPO3_DB']));
+               return $query;
+       }
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Persistence/QueryFactoryInterface.php b/typo3/sysext/extbase/Classes/Persistence/QueryFactoryInterface.php
new file mode 100644 (file)
index 0000000..2a02d8e
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A persistence query factory interface
+ *
+ * @package TYPO3
+ * @subpackage Extbase
+ * @version $Id: $
+ */
+interface Tx_Extbase_Persistence_QueryFactoryInterface {
+
+       /**
+        * Creates a query object working on the given class name
+        *
+        * @param string $className
+        * @return Tx_Extbase_Persistence_QueryInterface
+        */
+       public function create($className);
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Persistence/QueryInterface.php b/typo3/sysext/extbase/Classes/Persistence/QueryInterface.php
new file mode 100644 (file)
index 0000000..70a8deb
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A persistence query interface
+ *
+ * @package TYPO3
+ * @subpackage Extbase
+ * @version $Id: $
+ */
+interface Tx_Extbase_Persistence_QueryInterface {
+
+       /**
+        * Executes the query against the backend and returns the result
+        *
+        * @return array The query result, an array of objects
+        */
+       public function execute();
+       
+       /**
+        * The constraint used to limit the result set
+        *
+        * @param mixed $constraint Some constraint, depending on the backend
+        * @return Tx_Extbase_Persistence_QueryInterface
+        */
+       public function matching($constraint);
+
+}
+?>
\ No newline at end of file
index 84f26b1..6fae855 100644 (file)
@@ -61,12 +61,12 @@ abstract class Tx_Extbase_Persistence_Repository implements Tx_Extbase_Persisten
                        $this->aggregateRootClassName = substr($repositoryClassName, 0, -10);
                }
                if (empty($this->aggregateRootClassName)) {
-                       throw new Tx_Extbase_Exception('The domain repository wasn\'t able to resolve the aggregate root class to manage.', 1237897039);
+                       throw new Tx_Extbase_Exception('The domain repository wasn\'t able to resolve the aggregate root class.', 1237897039);
                }
                if (!in_array('Tx_Extbase_DomainObject_DomainObjectInterface', class_implements($this->aggregateRootClassName))) {
                        throw new Tx_Extbase_Exception('The domain repository tried to manage objects which are not implementing the Tx_Extbase_DomainObject_DomainObjectInterface.', 1237897039);
                }
-               $this->dataMapper = t3lib_div::makeInstance('Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper'); // singleton
+               $this->dataMapper = t3lib_div::makeInstance('Tx_Extbase_Persistence_Mapper_ObjectRelationalMapper', $GLOBALS['TYPO3_DB']); // singleton
                $this->persistenceSession = t3lib_div::makeInstance('Tx_Extbase_Persistence_Session'); // singleton
        }
 
@@ -93,32 +93,6 @@ abstract class Tx_Extbase_Persistence_Repository implements Tx_Extbase_Persisten
        }
                
        /**
-        * Replaces an object by another.
-        *
-        * @param object $existingObject The existing object
-        * @param object $newObject The new object
-        */
-       public function replace($existingObject, $newObject) {
-               // TODO Implement replace()
-               // $uid = $dataMapper->getUidByObject($existingObject);
-               // if ($uid !== NULL) {
-               //      // $dataMapper->replaceObject($existingObject, $newObject);
-               //      $this->persistenceSession->unregisterReconstitutedObject($existingObject);
-               //      $this->persistenceSession->registerReconstitutedObject($newObject);
-               // 
-               //      if ($this->persistenceSession->isRemovedObject($existingObject)) {
-               //              $this->persistenceSession->unregisterRemovedObject($existingObject);
-               //              $this->removedObjects->registerRemovedObject($newObject);
-               //      }
-               // } elseif ($this->persistenceSession->isAddedObject($existingObject)) {
-               //      $this->persistenceSession->unregisterAddedObject($existingObject);
-               //      $this->persistenceSession->registerAddedObject($newObject);
-               // } else {
-               //      throw new Tx_Extbase_Persistence_Exception_UnknownObject('The "existing object" is unknown to the persistence backend.', 1238068475);
-               // }
-       }
-       
-       /**
         * Dispatches magic methods (findBy[Property]())
         *
         * @param string $methodName The name of the magic method
@@ -183,6 +157,7 @@ abstract class Tx_Extbase_Persistence_Repository implements Tx_Extbase_Persisten
         */
        public function findByConditions($conditions = '', $groupBy = '', $orderBy = '', $limit = '', $useEnableFields = TRUE) {
                $where = $this->dataMapper->buildQuery($this->aggregateRootClassName, $conditions);
+               // FIXME Should we convert the condition before buiding the where clause (DateTime() -> timestamp)?
                $objects = $this->dataMapper->fetch($this->aggregateRootClassName, $where, '', $groupBy, $orderBy, $limit, $useEnableFields);
                $this->persistenceSession->registerReconstitutedObjects($objects);
                return $objects;
index 64b3d16..773256e 100644 (file)
@@ -48,14 +48,6 @@ interface Tx_Extbase_Persistence_RepositoryInterface {
        public function remove($object);
        
        /**
-        * Replaces an object by another.
-        *
-        * @param object $existingObject The existing object
-        * @param object $newObject The new object
-        */
-       public function replace($existingObject, $newObject);
-       
-       /**
         * Returns all objects of this repository.
         *
         * @return array An array of objects, empty if no objects found
diff --git a/typo3/sysext/extbase/Classes/Property/Exception.php b/typo3/sysext/extbase/Classes/Property/Exception.php
new file mode 100644 (file)
index 0000000..2a2d4dc
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An generic Property related exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Property_Exception extends Tx_Extbase_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Property/Exception/FormatNotSupported.php b/typo3/sysext/extbase/Classes/Property/Exception/FormatNotSupported.php
new file mode 100644 (file)
index 0000000..592be23
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+declare(ENCODING = 'utf-8');
+namespace F3\FLOW3\Property\Exception;
+
+/*                                                                        *
+ * This script belongs to the FLOW3 framework.                            *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ * @package FLOW3
+ * @subpackage Property
+ * @version $Id: FormatNotSupported.php 1811 2009-01-28 12:04:49Z robert $
+ */
+
+/**
+ * An "Format not supported" Exception
+ *
+ * @package FLOW3
+ * @subpackage Property
+ * @version $Id: FormatNotSupported.php 1811 2009-01-28 12:04:49Z robert $
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ */
+class FormatNotSupported extends \F3\FLOW3\Property\Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Property/Exception/InvalidDataType.php b/typo3/sysext/extbase/Classes/Property/Exception/InvalidDataType.php
new file mode 100644 (file)
index 0000000..4623d0a
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+declare(ENCODING = 'utf-8');
+namespace F3\FLOW3\Property\Exception;
+
+/*                                                                        *
+ * This script belongs to the FLOW3 framework.                            *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ * @package FLOW3
+ * @subpackage Property
+ * @version $Id: InvalidDataType.php 1811 2009-01-28 12:04:49Z robert $
+ */
+
+/**
+ * An "Invalid Data Type" Exception
+ *
+ * @package FLOW3
+ * @subpackage Property
+ * @version $Id: InvalidDataType.php 1811 2009-01-28 12:04:49Z robert $
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ */
+class InvalidDataType extends \F3\FLOW3\Property\Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Property/Exception/InvalidFormat.php b/typo3/sysext/extbase/Classes/Property/Exception/InvalidFormat.php
new file mode 100644 (file)
index 0000000..a1f7a98
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+declare(ENCODING = 'utf-8');
+namespace F3\FLOW3\Property\Exception;
+
+/*                                                                        *
+ * This script belongs to the FLOW3 framework.                            *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ * @package FLOW3
+ * @subpackage Property
+ * @version $Id: InvalidFormat.php 1811 2009-01-28 12:04:49Z robert $
+ */
+
+/**
+ * An "Invalid Format" Exception
+ *
+ * @package FLOW3
+ * @subpackage Property
+ * @version $Id: InvalidFormat.php 1811 2009-01-28 12:04:49Z robert $
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ */
+class InvalidFormat extends \F3\FLOW3\Property\Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Property/Exception/InvalidProperty.php b/typo3/sysext/extbase/Classes/Property/Exception/InvalidProperty.php
new file mode 100644 (file)
index 0000000..b2c28bd
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+declare(ENCODING = 'utf-8');
+namespace F3\FLOW3\Property\Exception;
+
+/*                                                                        *
+ * This script belongs to the FLOW3 framework.                            *
+ *                                                                        *
+ * It is free software; you can redistribute it and/or modify it under    *
+ * the terms of the GNU Lesser General Public License as published by the *
+ * Free Software Foundation, either version 3 of the License, or (at your *
+ * option) any later version.                                             *
+ *                                                                        *
+ * This script is distributed in the hope that it will be useful, but     *
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
+ * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
+ * General Public License for more details.                               *
+ *                                                                        *
+ * You should have received a copy of the GNU Lesser General Public       *
+ * License along with the script.                                         *
+ * If not, see http://www.gnu.org/licenses/lgpl.html                      *
+ *                                                                        *
+ * The TYPO3 project - inspiring people to share!                         *
+ *                                                                        */
+
+/**
+ * @package FLOW3
+ * @subpackage Property
+ * @version $Id: InvalidProperty.php 1811 2009-01-28 12:04:49Z robert $
+ */
+
+/**
+ * An "Invalid Property" Exception
+ *
+ * @package FLOW3
+ * @subpackage Property
+ * @version $Id: InvalidProperty.php 1811 2009-01-28 12:04:49Z robert $
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ */
+class InvalidProperty extends \F3\FLOW3\Property\Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Property/Exception/InvalidSource.php b/typo3/sysext/extbase/Classes/Property/Exception/InvalidSource.php
new file mode 100755 (executable)
index 0000000..1ce19f7
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Source" Exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Property_Exception_InvalidSource extends Tx_Extbase_Property_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Property/Exception/InvalidTarget.php b/typo3/sysext/extbase/Classes/Property/Exception/InvalidTarget.php
new file mode 100755 (executable)
index 0000000..a42e7fb
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An "Invalid Target" Exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Property_Exception_InvalidTarget extends Tx_Extbase_Property_Exception {
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Property/Mapper.php b/typo3/sysext/extbase/Classes/Property/Mapper.php
new file mode 100644 (file)
index 0000000..4eff69a
--- /dev/null
@@ -0,0 +1,158 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * The Property Mapper maps properties from a source onto a given target object, often a
+ * (domain-) model. Which properties are required and how they should be filtered can
+ * be customized.
+ *
+ * During the mapping process, the property values are validated and the result of this
+ * validation can be queried.
+ *
+ * The following code would map the property of the source array to the target:
+ *
+ * $target = new ArrayObject();
+ * $source = new ArrayObject(
+ *    array(
+ *       'someProperty' => 'SomeValue'
+ *    )
+ * );
+ * $mapper->mapAndValidate(array('someProperty'), $source, $target);
+ *
+ * Now the target object equals the source object.
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Property_Mapper {
+
+       /**
+        * Results of the last mapping operation
+        * @var Tx_Extbase_Property_MappingResults
+        */
+       protected $mappingResults;
+               
+       /**
+        * @var Tx_Extbase_Validation_ValidatorResolver
+        */
+       protected $validatorResolver;
+       
+       
+       /**
+        * Constructs the Property Mapper.
+        */
+       public function __construct() {
+               $this->validatorResolver = t3lib_div::makeInstance('Tx_Extbase_Validation_ValidatorResolver');
+       }
+       
+       /**
+        * Maps the given properties to the target object and validates the properties according to the defined
+        * validators. If the result object is not valid, the operation will be undone (the target object remains
+        * unchanged) and this method returns FALSE.
+        *
+        * If in doubt, always prefer this method over the map() method because skipping validation can easily become
+        * a security issue.
+        *
+        * @param array $propertyNames Names of the properties to map.
+        * @param mixed $source Source containing the properties to map to the target object. Must either be an array, ArrayObject or any other object.
+        * @param object $target The target object
+        * @param Tx_Extbase_Validation_Validator_ObjectValidatorInterface $targetObjectValidator A validator used for validating the target object
+        * @param array $optionalPropertyNames Names of optional properties. If a property is specified here and it doesn't exist in the source, no error is issued.
+        * @return boolean TRUE if the mapped properties are valid, otherwise FALSE
+        * @see getMappingResults()
+        * @see map()
+        */
+       public function mapAndValidate(array $propertyNames, $source, $target, $optionalPropertyNames = array(), Tx_Extbase_Validation_Validator_ObjectValidatorInterface $targetObjectValidator) {
+               $backupProperties = array();
+
+               $this->map($propertyNames, $source, $backupProperties, $optionalPropertyNames);
+               if ($this->mappingResults->hasErrors()) return FALSE;
+
+               $this->map($propertyNames, $source, $target, $optionalPropertyNames);
+               if ($this->mappingResults->hasErrors()) return FALSE;
+
+               if ($targetObjectValidator->isValid($target) !== TRUE) {
+                       $this->mappingResults->addError('Validation errors: ' . implode('. ', $targetObjectValidator->getErrors()), '*');
+                       $backupMappingResult = $this->mappingResults;
+                       $this->map($propertyNames, $backupProperties, $source, $optionalPropertyNames);
+                       $this->mappingResults = $backupMappingResult;
+               }
+               return (!$this->mappingResults->hasErrors());
+       }
+
+       /**
+        * Maps the given properties to the target object WITHOUT VALIDATING THE RESULT.
+        * If the properties could be set, this method returns TRUE, otherwise FALSE.
+        * Returning TRUE does not mean that the target object is valid and secure!
+        * 
+        * Only use this method if you're sure that you don't need validation!
+        *
+        * @param array $propertyNames Names of the properties to map.
+        * @param mixed $source Source containing the properties to map to the target object. Must either be an array, ArrayObject or any other object.
+        * @param object $target The target object
+        * @param array $optionalPropertyNames Names of optional properties. If a property is specified here and it doesn't exist in the source, no error is issued.
+        * @return boolean TRUE if the properties could be mapped, otherwise FALSE
+        * @see mapAndValidate()
+        */
+       public function map(array $propertyNames, $source, $target, $optionalPropertyNames = array()) {
+               if (!is_object($source) && !is_array($source)) throw new Tx_Extbase_Property_Exception_InvalidSource('The source object must be a valid object or array, ' . gettype($target) . ' given.', 1187807099);
+               if (!is_object($target) && !is_array($target)) throw new Tx_Extbase_Property_Exception_InvalidTarget('The target object must be a valid object or array, ' . gettype($target) . ' given.', 1187807099);
+
+               $this->mappingResults = t3lib_div::makeInstance('Tx_Extbase_Property_MappingResults');
+               $propertyValues = array();
+
+               foreach ($propertyNames as $propertyName) {
+                       if (is_array($source) || $source instanceof ArrayAccess) {
+                               if (isset($source[$propertyName])) $propertyValues[$propertyName] = $source[$propertyName];
+                       } else {
+                               $propertyValues[$propertyName] = Tx_Extbase_Reflection_ObjectAccess::getProperty($source, $propertyName);
+                       }
+               }
+               foreach ($propertyNames as $propertyName) {
+                       if (isset($propertyValues[$propertyName])) {
+                               if (is_array($target)) {
+                                       $target[$propertyName] = $source[$propertyName];
+                               } elseif (Tx_Extbase_Reflection_ObjectAccess::setProperty($target, $propertyName, $propertyValues[$propertyName]) === FALSE) {
+                                       $this->mappingResults->addError("Property '$propertyName' could not be set.", $propertyName);
+                               }
+                       } elseif (!in_array($propertyName, $optionalPropertyNames)) {
+                               $this->mappingResults->addError("Required property '$propertyName' does not exist.", $propertyName);
+                       }
+               }
+               return (!$this->mappingResults->hasErrors() && !$this->mappingResults->hasWarnings());
+       }
+
+       /**
+        * Returns the results of the last mapping operation.
+        *
+        * @return Tx_Extbase_Property_MappingResults The mapping results (or NULL if no mapping has been carried out yet)
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function getMappingResults() {
+               return $this->mappingResults;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Property/MappingResults.php b/typo3/sysext/extbase/Classes/Property/MappingResults.php
new file mode 100644 (file)
index 0000000..cdd66bf
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * The Mapping Results
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ * @scope prototype
+ */
+class Tx_Extbase_Property_MappingResults {
+
+       /**
+        * @var array An array of the occured errors
+        */
+       protected $errors = array();
+       
+       /**
+        * @var array An array of the occured warnings
+        */
+       protected $warnings = array();
+       
+       /**
+        * Adds an error to the mapping results. This might be for example a
+        * validation or mapping error
+        *
+        * @param string $error The occured error
+        * @param string $propertyName The name of the property which caused the error
+        */
+       public function addError($error, $propertyName) {
+               $this->errors[$propertyName] = $error;
+       }
+       
+       /**
+        * Returns all errors that occured so far
+        *
+        * @return array Array of error messages
+        */
+       public function getErrors() {
+               return $this->errors;
+       }
+       
+       /**
+        * Returns true if any error was recognized
+        *
+        * @return boolean True if an error occured
+        */
+       public function hasErrors() {
+               return (count($this->errors) > 0);
+       }
+       
+       /**
+        * Adds a warning to the mapping results. This might be for example a
+        * property that could not be mapped but wasn't marked as required.
+        *
+        * @param string $warning The occured warning
+        * @param string $propertyName The name of the property which caused the error
+        */
+       public function addWarning($warning, $propertyName) {
+               $this->warnings[$propertyName] = $warning;
+       }
+       
+       /**
+        * Returns all warnings that occured so far
+        *
+        * @return array Array of warnings
+        */
+       public function getWarnings() {
+               return $this->warnings;
+       }
+       
+       /**
+        * Returns TRUE if any warning was recognized
+        *
+        * @return boolean TRUE if a warning occured
+        */
+       public function hasWarnings() {
+               return (count($this->warnings) > 0);
+       }
+}
+
+?>
\ No newline at end of file
index f27d041..77e1f22 100644 (file)
@@ -1,38 +1,33 @@
 <?php
-
-/*                                                                        *
- * This script belongs to the FLOW3 framework.                            *
- *                                                                        *
- * It is free software; you can redistribute it and/or modify it under    *
- * the terms of the GNU Lesser General Public License as published by the *
- * Free Software Foundation, either version 3 of the License, or (at your *
- * option) any later version.                                             *
- *                                                                        *
- * This script is distributed in the hope that it will be useful, but     *
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
- * General Public License for more details.                               *
- *                                                                        *
- * You should have received a copy of the GNU Lesser General Public       *
- * License along with the script.                                         *
- * If not, see http://www.gnu.org/licenses/lgpl.html                      *
- *                                                                        *
- * The TYPO3 project - inspiring people to share!                         *
- *                                                                        */
-
-/**
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: ClassReflection.php 1811 2009-01-28 12:04:49Z robert $
- */
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Christopher Hlubek <hlubek@networkteam.com>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
 
 /**
  * Extended version of the ReflectionClass
  *
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: ClassReflection.php 1811 2009-01-28 12:04:49Z robert $
- * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
  */
 class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
 
@@ -45,7 +40,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         * The constructor - initializes the class Tx_Extbase_Reflection_reflector
         *
         * @param  string $className: Name of the class Tx_Extbase_Reflection_to reflect
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function __construct($className) {
                parent::__construct($className);
@@ -58,7 +52,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         *
         * @param  long $filter: A filter mask
         * @return Tx_Extbase_Reflection_MethodReflection Method reflection objects of the methods in this class
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getMethods($filter = NULL) {
                $extendedMethods = array();
@@ -76,7 +69,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         * orginal ReflectionMethod instances.
         *
         * @return Tx_Extbase_Reflection_MethodReflection Method reflection object of the named method
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getMethod($name) {
                $parentMethod = parent::getMethod($name);
@@ -90,7 +82,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         * orginal ReflectionMethod instances.
         *
         * @return Tx_Extbase_Reflection_MethodReflection Method reflection object of the constructor method
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getConstructor() {
                $parentConstructor = parent::getConstructor();
@@ -105,7 +96,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         *
         * @param  long $filter: A filter mask
         * @return array of Tx_Extbase_Reflection_PropertyReflection Property reflection objects of the properties in this class
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getProperties($filter = NULL) {
                $extendedProperties = array();
@@ -123,7 +113,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         *
         * @param  string $name: Name of the property
         * @return Tx_Extbase_Reflection_PropertyReflection Property reflection object of the specified property in this class
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getProperty($name) {
                return new Tx_Extbase_Reflection_PropertyReflection($this->getName(), $name);
@@ -135,7 +124,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         * orginal ReflectionClass instances.
         *
         * @return array of Tx_Extbase_Reflection_ClassReflection Class reflection objects of the properties in this class
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getInterfaces() {
                $extendedInterfaces = array();
@@ -152,7 +140,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         * orginal ReflectionClass instance.
         *
         * @return Tx_Extbase_Reflection_ClassReflection Reflection of the parent class - if any
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getParentClass() {
                $parentClass = parent::getParentClass();
@@ -165,7 +152,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         *
         * @param  string $tag: Tag name to check for
         * @return boolean TRUE if such a tag has been defined, otherwise FALSE
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function isTaggedWith($tag) {
                $result = $this->getDocCommentParser()->isTaggedWith($tag);
@@ -176,7 +162,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         * Returns an array of tags and their values
         *
         * @return array Tags and values
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getTagsValues() {
                return $this->getDocCommentParser()->getTagsValues();
@@ -185,7 +170,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
        /**
         * Returns the values of the specified tag
         * @return array Values of the given tag
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getTagValues($tag) {
                return $this->getDocCommentParser()->getTagValues($tag);
@@ -196,7 +180,6 @@ class Tx_Extbase_Reflection_ClassReflection extends ReflectionClass {
         * runs the parse() method.
         *
         * @return Tx_Extbase_Reflection_DocCommentParser
-        * @author Robert Lemke <robert@typo3.org>
         */
        protected function getDocCommentParser() {
                if (!is_object($this->docCommentParser)) {
index 2768728..2dc9016 100644 (file)
@@ -1,39 +1,33 @@
 <?php
-
-/*                                                                        *
- * This script belongs to the FLOW3 framework.                            *
- *                                                                        *
- * It is free software; you can redistribute it and/or modify it under    *
- * the terms of the GNU Lesser General Public License as published by the *
- * Free Software Foundation, either version 3 of the License, or (at your *
- * option) any later version.                                             *
- *                                                                        *
- * This script is distributed in the hope that it will be useful, but     *
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
- * General Public License for more details.                               *
- *                                                                        *
- * You should have received a copy of the GNU Lesser General Public       *
- * License along with the script.                                         *
- * If not, see http://www.gnu.org/licenses/lgpl.html                      *
- *                                                                        *
- * The TYPO3 project - inspiring people to share!                         *
- *                                                                        */
-
-/**
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: DocCommentParser.php 1966 2009-03-03 13:46:17Z k-fish $
- * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
- */
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Christopher Hlubek <hlubek@networkteam.com>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
 
 /**
  * A little parser which creates tag objects from doc comments
  *
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: DocCommentParser.php 1966 2009-03-03 13:46:17Z k-fish $
- * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
  */
 class Tx_Extbase_Reflection_DocCommentParser {
 
@@ -54,7 +48,6 @@ class Tx_Extbase_Reflection_DocCommentParser {
         *
         * @param string $docComment A doc comment as returned by the reflection getDocComment() method
         * @return void
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function parseDocComment($docComment) {
                $this->description = '';
@@ -64,7 +57,7 @@ class Tx_Extbase_Reflection_DocCommentParser {
                foreach ($lines as $line) {
                        if (strlen($line) > 0 && strpos($line, '@') !== FALSE) {
                                $this->parseTag(substr($line, strpos($line, '@')));
-                       } else if (count($this->tags) === 0) {
+                       } elseif (count($this->tags) === 0) {
                                $this->description .= preg_replace('/\s*\\/?[\\\\*]*(.*)$/', '$1', $line) . chr(10);
                        }
                }
@@ -75,7 +68,6 @@ class Tx_Extbase_Reflection_DocCommentParser {
         * Returns the tags which have been previously parsed
         *
         * @return array Array of tag names and their (multiple) values
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getTagsValues() {
                return $this->tags;
@@ -88,7 +80,6 @@ class Tx_Extbase_Reflection_DocCommentParser {
         *
         * @param string $tagName The tag name to retrieve the values for
         * @return array The tag's values
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getTagValues($tagName) {
                if (!$this->isTaggedWith($tagName)) throw new RuntimeException('Tag "' . $tagName . '" does not exist.', 1169128255);
@@ -100,7 +91,6 @@ class Tx_Extbase_Reflection_DocCommentParser {
         *
         * @param string $tagName The tag name to check for
         * @return boolean TRUE the tag exists, otherwise FALSE
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function isTaggedWith($tagName) {
                return (isset($this->tags[$tagName]));
@@ -110,7 +100,6 @@ class Tx_Extbase_Reflection_DocCommentParser {
         * Returns the description which has been previously parsed
         *
         * @return string The description which has been parsed
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
        public function getDescription() {
                return $this->description;
@@ -122,7 +111,6 @@ class Tx_Extbase_Reflection_DocCommentParser {
         *
         * @param string $line A line of a doc comment which starts with an @-sign
         * @return void
-        * @author Robert Lemke <robert@typo3.org>
         */
        protected function parseTag($line) {
                $tagAndValue = preg_split('/\s/', $line, 2);
index 606a4c4..719f943 100644 (file)
@@ -1,38 +1,33 @@
 <?php
-
-/*                                                                        *
- * This script belongs to the FLOW3 framework.                            *
- *                                                                        *
- * It is free software; you can redistribute it and/or modify it under    *
- * the terms of the GNU Lesser General Public License as published by the *
- * Free Software Foundation, either version 3 of the License, or (at your *
- * option) any later version.                                             *
- *                                                                        *
- * This script is distributed in the hope that it will be useful, but     *
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
- * General Public License for more details.                               *
- *                                                                        *
- * You should have received a copy of the GNU Lesser General Public       *
- * License along with the script.                                         *
- * If not, see http://www.gnu.org/licenses/lgpl.html                      *
- *                                                                        *
- * The TYPO3 project - inspiring people to share!                         *
- *                                                                        */
-
-/**
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: Exception.php 1811 2009-01-28 12:04:49Z robert $
- */
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Christopher Hlubek <hlubek@networkteam.com>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
 
 /**
  * A generic Reflection Exception
  *
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: Exception.php 1811 2009-01-28 12:04:49Z robert $
- * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
  */
 class Tx_Extbase_Reflection_Exception extends Tx_Extbase_Exception {
 
index b02a96c..24bb59f 100644 (file)
@@ -1,38 +1,33 @@
 <?php
-
-/*                                                                        *
- * This script belongs to the FLOW3 framework.                            *
- *                                                                        *
- * It is free software; you can redistribute it and/or modify it under    *
- * the terms of the GNU Lesser General Public License as published by the *
- * Free Software Foundation, either version 3 of the License, or (at your *
- * option) any later version.                                             *
- *                                                                        *
- * This script is distributed in the hope that it will be useful, but     *
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
- * General Public License for more details.                               *
- *                                                                        *
- * You should have received a copy of the GNU Lesser General Public       *
- * License along with the script.                                         *
- * If not, see http://www.gnu.org/licenses/lgpl.html                      *
- *                                                                        *
- * The TYPO3 project - inspiring people to share!                         *
- *                                                                        */
-
-/**
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: MethodReflection.php 1811 2009-01-28 12:04:49Z robert $
- */
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Christopher Hlubek <hlubek@networkteam.com>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
 
 /**
  * Extended version of the ReflectionMethod
  *
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: MethodReflection.php 1811 2009-01-28 12:04:49Z robert $
- * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
  */
 class Tx_Extbase_Reflection_MethodReflection extends ReflectionMethod {
 
@@ -47,7 +42,6 @@ class Tx_Extbase_Reflection_MethodReflection extends ReflectionMethod {
         * @param  string $className Name of the method's class
         * @param  string $methodName Name of the method to reflect
         * @return void
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function __construct($className, $methodName) {
                parent::__construct($className, $methodName);
@@ -57,7 +51,6 @@ class Tx_Extbase_Reflection_MethodReflection extends ReflectionMethod {
         * Returns the declaring class
         *
         * @return Tx_Extbase_Reflection_ClassReflection The declaring class
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getDeclaringClass() {
                return new Tx_Extbase_Reflection_ClassReflection(parent::getDeclaringClass()->getName());
@@ -69,7 +62,6 @@ class Tx_Extbase_Reflection_MethodReflection extends ReflectionMethod {
         * orginal ReflectionParameter instances.
         *
         * @return array of Tx_Extbase_Reflection_ParameterReflection Parameter reflection objects of the parameters of this method
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getParameters() {
                $extendedParameters = array();
@@ -95,7 +87,6 @@ class Tx_Extbase_Reflection_MethodReflection extends ReflectionMethod {
         * Returns an array of tags and their values
         *
         * @return array Tags and values
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getTagsValues() {
                return $this->getDocCommentParser()->getTagsValues();
@@ -106,7 +97,6 @@ class Tx_Extbase_Reflection_MethodReflection extends ReflectionMethod {
         *
         * @param string $tag Tag name to check for
         * @return array Values of the given tag
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getTagValues($tag) {
                return $this->getDocCommentParser()->getTagValues($tag);
@@ -117,7 +107,6 @@ class Tx_Extbase_Reflection_MethodReflection extends ReflectionMethod {
         * runs the parse() method.
         *
         * @return Tx_Extbase_Reflection_DocCommentParser
-        * @author Robert Lemke <robert@typo3.org>
         */
        protected function getDocCommentParser() {
                if (!is_object($this->docCommentParser)) {
index 30c2052..fe61fe6 100644 (file)
@@ -1,30 +1,27 @@
 <?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Christopher Hlubek <hlubek@networkteam.com>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
 
-/*                                                                        *
- * This script belongs to the FLOW3 framework.                            *
- *                                                                        *
- * It is free software; you can redistribute it and/or modify it under    *
- * the terms of the GNU Lesser General Public License as published by the *
- * Free Software Foundation, either version 3 of the License, or (at your *
- * option) any later version.                                             *
- *                                                                        *
- * This script is distributed in the hope that it will be useful, but     *
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
- * General Public License for more details.                               *
- *                                                                        *
- * You should have received a copy of the GNU Lesser General Public       *
- * License along with the script.                                         *
- * If not, see http://www.gnu.org/licenses/lgpl.html                      *
- *                                                                        *
- * The TYPO3 project - inspiring people to share!                         *
- *                                                                        */
-
-/**
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: ObjectAccess.php 2031 2009-03-24 11:36:56Z robert $
- */
 /**
  * Provides methods to call appropriate getter/setter on an object given the
  * property name. It does this following these rules:
  * - if public property exists, return/set the value of it.
  * - else, throw exception
  *
- * @package
- * @subpackage
- * @version $Id: ObjectAccess.php 2031 2009-03-24 11:36:56Z robert $
- * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
  */
 class Tx_Extbase_Reflection_ObjectAccess {
 
@@ -56,8 +52,6 @@ class Tx_Extbase_Reflection_ObjectAccess {
         * @param object $object Object to get the property from
         * @param string $propertyName name of the property to retrieve
         * @return object Value of the property.
-        * @author Robert Lemke <robert@typo3.org>
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
        static public function getProperty($object, $propertyName) {
                if (!is_object($object)) throw new InvalidArgumentException('$object must be an object, ' . gettype($object). ' given.', 1237301367);
@@ -87,8 +81,6 @@ class Tx_Extbase_Reflection_ObjectAccess {
         * @param object $propertyValue Value of the property
         * @return void
         * @throws Tx_Extbase_Reflection_Exception if property was could not be set
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
-        * @author Robert Lemke <robert@typo3.org>
         */
        static public function setProperty($object, $propertyName, $propertyValue) {
                if (!is_object($object)) throw new InvalidArgumentException('$object must be an object, ' . gettype($object). ' given.', 1237301368);
@@ -96,7 +88,7 @@ class Tx_Extbase_Reflection_ObjectAccess {
 
                if (is_callable(array($object, $setterMethodName = self::buildSetterMethodName($propertyName)))) {
                        call_user_func(array($object, $setterMethodName), $propertyValue);
-               } elseif ($object instanceof \ArrayAccess) {
+               } elseif ($object instanceof ArrayAccess) {
                        $object[$propertyName] = $propertyValue;
                } elseif (array_key_exists($propertyName, get_object_vars($object))) {
                        $object->$propertyName = $propertyValue;
@@ -115,7 +107,6 @@ class Tx_Extbase_Reflection_ObjectAccess {
         *
         * @param object $object Object to receive property names for
         * @return array Array of all declared property names
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @todo What to do with ArrayAccess
         */
        static public function getAccessiblePropertyNames($object) {
@@ -139,7 +130,6 @@ class Tx_Extbase_Reflection_ObjectAccess {
         *
         * @param object $object Object to get all properties from.
         * @return array Associative array of all properties.
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
         * @todo What to do with ArrayAccess
         */
        static public function getAccessibleProperties($object) {
@@ -157,7 +147,6 @@ class Tx_Extbase_Reflection_ObjectAccess {
         *
         * @param string $property Name of the property
         * @return string Name of the getter method name
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
        static protected function buildGetterMethodName($property) {
                return 'get' . ucfirst($property);
@@ -169,7 +158,6 @@ class Tx_Extbase_Reflection_ObjectAccess {
         *
         * @param string $property Name of the property
         * @return string Name of the setter method name
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
        static protected function buildSetterMethodName($property) {
                return 'set' . ucfirst($property);
index e69efa3..8dd8931 100644 (file)
@@ -1,38 +1,33 @@
 <?php
-
-/*                                                                        *
- * This script belongs to the FLOW3 framework.                            *
- *                                                                        *
- * It is free software; you can redistribute it and/or modify it under    *
- * the terms of the GNU Lesser General Public License as published by the *
- * Free Software Foundation, either version 3 of the License, or (at your *
- * option) any later version.                                             *
- *                                                                        *
- * This script is distributed in the hope that it will be useful, but     *
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
- * General Public License for more details.                               *
- *                                                                        *
- * You should have received a copy of the GNU Lesser General Public       *
- * License along with the script.                                         *
- * If not, see http://www.gnu.org/licenses/lgpl.html                      *
- *                                                                        *
- * The TYPO3 project - inspiring people to share!                         *
- *                                                                        */
-
-/**
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: ParameterReflection.php 1811 2009-01-28 12:04:49Z robert $
- */
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Christopher Hlubek <hlubek@networkteam.com>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
 
 /**
  * Extended version of the ReflectionParameter
  *
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: ParameterReflection.php 1811 2009-01-28 12:04:49Z robert $
- * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
  */
 class Tx_Extbase_Reflection_ParameterReflection extends ReflectionParameter {
 
@@ -42,7 +37,6 @@ class Tx_Extbase_Reflection_ParameterReflection extends ReflectionParameter {
         * @param  string $functionName: Name of the function
         * @param  string $propertyName: Name of the property to reflect
         * @return void
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function __construct($function, $parameterName) {
                parent::__construct($function, $parameterName);
@@ -52,7 +46,6 @@ class Tx_Extbase_Reflection_ParameterReflection extends ReflectionParameter {
         * Returns the declaring class
         *
         * @return Tx_Extbase_Reflection_ClassReflection The declaring class
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getDeclaringClass() {
                return new Tx_Extbase_Reflection_ClassReflection(parent::getDeclaringClass()->getName());
@@ -62,8 +55,6 @@ class Tx_Extbase_Reflection_ParameterReflection extends ReflectionParameter {
         * Returns the parameter class
         *
         * @return Tx_Extbase_Reflection_ClassReflection The parameter class
-        * @author Robert Lemke <robert@typo3.org>
-        * @author Karsten Dambekalns <karsten@typo3.org>
         */
        public function getClass() {
                try {
index 516cfb9..6b1b324 100644 (file)
@@ -1,38 +1,33 @@
 <?php
-
-/*                                                                        *
- * This script belongs to the FLOW3 framework.                            *
- *                                                                        *
- * It is free software; you can redistribute it and/or modify it under    *
- * the terms of the GNU Lesser General Public License as published by the *
- * Free Software Foundation, either version 3 of the License, or (at your *
- * option) any later version.                                             *
- *                                                                        *
- * This script is distributed in the hope that it will be useful, but     *
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-    *
- * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser       *
- * General Public License for more details.                               *
- *                                                                        *
- * You should have received a copy of the GNU Lesser General Public       *
- * License along with the script.                                         *
- * If not, see http://www.gnu.org/licenses/lgpl.html                      *
- *                                                                        *
- * The TYPO3 project - inspiring people to share!                         *
- *                                                                        */
-
-/**
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: PropertyReflection.php 1811 2009-01-28 12:04:49Z robert $
- */
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Christopher Hlubek <hlubek@networkteam.com>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
 
 /**
  * Extended version of the ReflectionProperty
  *
- * @package FLOW3
- * @subpackage Reflection
- * @version $Id: PropertyReflection.php 1811 2009-01-28 12:04:49Z robert $
- * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
  */
 class Tx_Extbase_Reflection_PropertyReflection extends ReflectionProperty {
 
@@ -47,7 +42,6 @@ class Tx_Extbase_Reflection_PropertyReflection extends ReflectionProperty {
         * @param string $className Name of the property's class
         * @param string $propertyName Name of the property to reflect
         * @return void
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function __construct($className, $propertyName) {
                parent::__construct($className, $propertyName);
@@ -69,7 +63,6 @@ class Tx_Extbase_Reflection_PropertyReflection extends ReflectionProperty {
         * Returns an array of tags and their values
         *
         * @return array Tags and values
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getTagsValues() {
                return $this->getDocCommentParser()->getTagsValues();
@@ -79,7 +72,6 @@ class Tx_Extbase_Reflection_PropertyReflection extends ReflectionProperty {
         * Returns the values of the specified tag
         *
         * @return array Values of the given tag
-        * @author Robert Lemke <robert@typo3.org>
         */
        public function getTagValues($tag) {
                return $this->getDocCommentParser()->getTagValues($tag);
@@ -91,8 +83,6 @@ class Tx_Extbase_Reflection_PropertyReflection extends ReflectionProperty {
         * @param object $object Instance of the declaring class Tx_Extbase_Reflection_to read the value from
         * @return mixed Value of the property
         * @throws Tx_Extbase_Reflection_Exception
-        * @author Robert Lemke <robert@typo3.org>
-        * @author Karsten Dambekalns <karsten@typo3.org>
         * @todo Maybe support private properties as well, as of PHP 5.3.0 we can do
         *   $obj = new Foo;
         *   $prop = new ReflectionProperty('Foo', 'y'); // y is private member
@@ -113,7 +103,6 @@ class Tx_Extbase_Reflection_PropertyReflection extends ReflectionProperty {
         * runs the parse() method.
         *
         * @return Tx_Extbase_Reflection_DocCommentParser
-        * @author Robert Lemke <robert@typo3.org>
         */
        protected function getDocCommentParser() {
                if (!is_object($this->docCommentParser)) {
index c0cf1bd..78255fe 100644 (file)
@@ -28,7 +28,7 @@
  *
  * @package TYPO3
  * @subpackage extbase
- * @version $Id:$
+ * @version $Id: $
  */
 class Tx_Extbase_Reflection_Service implements t3lib_Singleton {
 
@@ -48,6 +48,25 @@ class Tx_Extbase_Reflection_Service implements t3lib_Singleton {
         * @var array Array of array of method parameters by class name and method name
         */
        protected $methodParameters;
+       
+       /**
+        * Array of class names and names of their properties
+        *
+        * @var array
+        */
+       protected $classPropertyNames = array();
+
+
+       /**
+        * Returns the names of all properties of the specified class
+        *
+        * @param string $className Name of the class to return the property names of
+        * @return array An array of property names or an empty array if none exist
+        */
+       public function getClassPropertyNames($className) {
+               if (!isset($this->reflectedClassNames[$className])) $this->reflectClass($className);
+               return (isset($this->classPropertyNames[$className])) ? $this->classPropertyNames[$className] : array();
+       }
 
        /**
         * Returns all tags and their values the specified method is tagged with
@@ -55,8 +74,6 @@ class Tx_Extbase_Reflection_Service implements t3lib_Singleton {
         * @param string $className Name of the class containing the method
         * @param string $methodName Name of the method to return the tags and values of
         * @return array An array of tags and their values or an empty array of no tags were found
-        * @author Robert Lemke <robert@typo3.org>
-        * @author Christopher Hlubek <hlubek@networkteam.com>
         */
        public function getMethodTagsValues($className, $methodName) {
                if (!isset($this->methodTagsValues[$className][$methodName])) {
@@ -79,31 +96,85 @@ class Tx_Extbase_Reflection_Service implements t3lib_Singleton {
         * @param string $className Name of the class containing the method
         * @param string $methodName Name of the method to return parameter information of
         * @return array An array of parameter names and additional information or an empty array of no parameters were found
-        * @author Robert Lemke <robert@typo3.org>
-        * @author Christopher Hlubek <hlubek@networkteam.com>
         */
        public function getMethodParameters($className, $methodName) {
                if (!isset($this->methodParameters[$className][$methodName])) {
                        $method = $this->getMethodReflection($className, $methodName);
                        $this->methodParameters[$className][$methodName] = array();
-                       foreach($method->getParameters() as $parameter) {
-                               $this->methodParameters[$className][$methodName][$parameter->getName()] = $this->convertParameterReflectionToArray($parameter, $method);
+                       foreach($method->getParameters() as $parameterPosition => $parameter) {
+                               $this->methodParameters[$className][$methodName][$parameter->getName()] = $this->convertParameterReflectionToArray($parameter, $parameterPosition, $method);
                        }
                }
                return $this->methodParameters[$className][$methodName];
        }
 
        /**
+        * Returns all tags and their values the specified class property is tagged with
+        *
+        * @param string $className Name of the class containing the property
+        * @param string $propertyName Name of the property to return the tags and values of
+        * @return array An array of tags and their values or an empty array of no tags were found
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function getPropertyTagsValues($className, $propertyName) {
+               if (!isset($this->reflectedClassNames[$className])) $this->reflectClass($className);
+               if (!isset($this->propertyTagsValues[$className])) return array();
+               return (isset($this->propertyTagsValues[$className][$propertyName])) ? $this->propertyTagsValues[$className][$propertyName] : array();
+       }
+
+       /**
+        * Reflects the given class and stores the results in this service's properties.
+        *
+        * @param string $className Full qualified name of the class to reflect
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       protected function reflectClass($className) {
+               $class = new Tx_Extbase_Reflection_ClassReflection($className);
+               $this->reflectedClassNames[$className] = time();
+
+               foreach ($class->getTagsValues() as $tag => $values) {
+                       if (array_search($tag, $this->ignoredTags) === FALSE) {
+                               $this->taggedClasses[$tag][] = $className;
+                               $this->classTagsValues[$className][$tag] = $values;
+                       }
+               }
+
+               foreach ($class->getProperties() as $property) {
+                       $propertyName = $property->getName();
+                       $this->classPropertyNames[$className][] = $propertyName;
+
+                       foreach ($property->getTagsValues() as $tag => $values) {
+                               if (array_search($tag, $this->ignoredTags) === FALSE) {
+                                       $this->propertyTagsValues[$className][$propertyName][$tag] = $values;
+                               }
+                       }
+               }
+
+               foreach ($class->getMethods() as $method) {
+                       $methodName = $method->getName();
+                       foreach ($method->getTagsValues() as $tag => $values) {
+                               if (array_search($tag, $this->ignoredTags) === FALSE) {
+                                       $this->methodTagsValues[$className][$methodName][$tag] = $values;
+                               }
+                       }
+
+                       foreach ($method->getParameters() as $parameter) {
+                               $this->methodParameters[$className][$methodName][$parameter->getName()] = $this->convertParameterReflectionToArray($parameter, $method);
+                       }
+               }
+               ksort($this->reflectedClassNames);
+       }
+       
+       /**
         * Converts the given parameter reflection into an information array
         *
         * @param ReflectionParameter $parameter The parameter to reflect
         * @return array Parameter information array
-        * @author Robert Lemke <robert@typo3.org>
-        * @author Sebastian Kurfürst <sebastian@typo3.org>
         */
-       protected function convertParameterReflectionToArray(ReflectionParameter $parameter, ReflectionMethod $method = NULL) {
+       protected function convertParameterReflectionToArray(ReflectionParameter $parameter, $parameterPosition, ReflectionMethod $method = NULL) {
                $parameterInformation = array(
-                       'position' => $parameter->getPosition(),
+                       'position' => $parameterPosition,
                        'byReference' => $parameter->isPassedByReference() ? TRUE : FALSE,
                        'array' => $parameter->isArray() ? TRUE : FALSE,
                        'optional' => $parameter->isOptional() ? TRUE : FALSE,
@@ -119,8 +190,8 @@ class Tx_Extbase_Reflection_Service implements t3lib_Singleton {
                        $parameterInformation['type'] = $parameterClass->getName();
                } elseif ($method !== NULL) {
                        $methodTagsAndValues = $this->getMethodTagsValues($method->getDeclaringClass()->getName(), $method->getName());
-                       if (isset($methodTagsAndValues['param']) && isset($methodTagsAndValues['param'][$parameter->getPosition()])) {
-                               $explodedParameters = explode(' ', $methodTagsAndValues['param'][$parameter->getPosition()]);
+                       if (isset($methodTagsAndValues['param']) && isset($methodTagsAndValues['param'][$parameterPosition])) {
+                               $explodedParameters = explode(' ', $methodTagsAndValues['param'][$parameterPosition]);
                                if (count($explodedParameters) >= 2) {
                                        $parameterInformation['type'] = $explodedParameters[0];
                                }
index f85cd82..b40759f 100644 (file)
@@ -80,17 +80,18 @@ abstract class Tx_Extbase_Utility_Strings {
         * @return string The extension key
         */
        public static function getExtensionKey() {
-               if(preg_match('/^Tx_([^_]+)/', get_class($this), $matches)) {
-                       $possibleExtensionKey = $matches[1];
-                       if($possibleExtensionKey != 'lib') {
-                               $loadedExtensionKeys = t3lib_div::trimExplode(',', $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList']);
-                               foreach($loadedExtensionKeys as $extensionKey) {
-                                       if($possibleExtensionKey == str_replace('_', '', $extensionKey)) {
-                                               return $extensionKey;
-                                       }
-                               }
-                       }
-               }
+               // TODO Implement Tx_Extbase_Utility_Strings::getExtensionKey()
+               // if(preg_match('/^Tx_([^_]+)/', get_class($this), $matches)) {
+               //      $possibleExtensionKey = $matches[1];
+               //      if($possibleExtensionKey != 'lib') {
+               //              $loadedExtensionKeys = t3lib_div::trimExplode(',', $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList']);
+               //              foreach($loadedExtensionKeys as $extensionKey) {
+               //                      if($possibleExtensionKey == str_replace('_', '', $extensionKey)) {
+               //                              return $extensionKey;
+               //                      }
+               //              }
+               //      }
+               // }
        }
        
 }
index 2f83de2..624e2c6 100755 (executable)
@@ -29,7 +29,7 @@
  * @subpackage extbase
  * @version $ID:$
  */
-class Tx_Extbase_Validation_InvalidSubject extends Tx_Extbase_Validation_Exception {
+class Tx_Extbase_Validation_Exception_InvalidSubject extends Tx_Extbase_Validation_Exception {
 
 }
 
diff --git a/typo3/sysext/extbase/Classes/Validation/Exception/InvalidValidationOptions.php b/typo3/sysext/extbase/Classes/Validation/Exception/InvalidValidationOptions.php
new file mode 100755 (executable)
index 0000000..13852de
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A "InvalidValidationOptions" Exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $ID:$
+ */
+class Tx_Extbase_Validation_Exception_InvalidValidationOptions extends Tx_Extbase_Validation_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Exception/NoSuchValidator.php b/typo3/sysext/extbase/Classes/Validation/Exception/NoSuchValidator.php
new file mode 100644 (file)
index 0000000..6b39e58
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A "NoSuchValidator" Exception
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $ID:$
+ */
+class Tx_Extbase_Validation_Exception_NoSuchValidator extends Tx_Extbase_Validation_Exception {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/AbstractObjectValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/AbstractObjectValidator.php
new file mode 100644 (file)
index 0000000..ee48ff4
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * An abstract Object Validator
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+abstract class Tx_Extbase_Validation_Validator_AbstractObjectValidator extends Tx_Extbase_Validation_Validator_AbstractValidator implements Tx_Extbase_Validation_Validator_ObjectValidatorInterface {
+
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/AbstractValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/AbstractValidator.php
new file mode 100644 (file)
index 0000000..365954d
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Abstract validator
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+abstract class Tx_Extbase_Validation_Validator_AbstractValidator implements Tx_Extbase_Validation_Validator_ValidatorInterface {
+       /**
+        * @var array
+        */
+       protected $options = array();
+
+       /**
+        * @var array
+        */
+       protected $errors = array();
+
+       /**
+        * Sets options for the validator
+        *
+        * @param array $options Options for the validator
+        * @return void
+        */
+       public function setOptions(array $options) {
+               $this->options = $options;
+       }
+
+       /**
+        * Returns an array of errors which occurred during the last isValid() call.
+        *
+        * @return array An array of error messages or an empty array if no errors occurred.
+        */
+       public function getErrors() {
+               return $this->errors;
+       }
+
+       /**
+        * Creates a new validation error object and adds it to $this->errors
+        *
+        * @param string $message The error message
+        * @param integer $code The error code (a unix timestamp)
+        * @return void
+        */
+       protected function addError($message, $code) {
+               $this->errors[] = $message;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/Alphanumeric.php b/typo3/sysext/extbase/Classes/Validation/Validator/Alphanumeric.php
deleted file mode 100644 (file)
index 8dbe939..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Validator for alphanumeric strings
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_Alphanumeric implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Returns TRUE, if the given property ($propertyValue) is a valid
-        * alphanumeric string, which is defined as [a-zA-Z0-9]*.
-        *
-        * If at least one error occurred, the result is FALSE and any errors will
-        * be stored in the given errors object.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               if (is_string($value) && preg_match('/^[a-z0-9]*$/i', $value)) return TRUE;
-               $errors->append('The given subject was not a valid integer.');
-               return FALSE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/AlphanumericValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/AlphanumericValidator.php
new file mode 100644 (file)
index 0000000..ce8b9fd
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Validator for alphanumeric strings
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ * @scope prototype
+ */
+class Tx_Extbase_Validation_Validator_AlphanumericValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
+
+       /**
+        * Returns TRUE, if the given property ($propertyValue) is a valid
+        * alphanumeric string, which is defined as [a-zA-Z0-9]*.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param mixed $value The value that should be validated
+        * @return boolean TRUE if the value is valid, FALSE if an error occured
+        */
+       public function isValid($value) {
+               $this->errors = array();
+               if (is_string($value) && preg_match('/^[a-z0-9]*$/i', $value)) return TRUE;
+               $this->addError('The given subject was not a valid alphanumeric string.', 1221551320);
+               return FALSE;
+       }
+}
+
+?>
\ No newline at end of file
index e7bcdd0..2268796 100644 (file)
  * @version $ID:$
  * @scope prototype
  */
-class Tx_Extbase_Validation_Validator_ChainValidator implements Tx_Extbase_Validation_Validator_ValidatorInterface {
+class Tx_Extbase_Validation_Validator_ChainValidator implements Tx_Extbase_Validation_Validator_ValidatorInterface, Countable {
 
        /**
         * @var array
         */
-       protected $validators = array();
+       protected $options = array();
 
        /**
-        * Checks if the given value is valid according to the validators of the chain..
+        * @var Tx_Extbase_Persistence_ObjectStorage
+        */
+       protected $validators;
+
+       /**
+        * @var array
+        */
+       protected $errors = array();
+
+       /**
+        * Constructs the validator chain
+        *
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function __construct() {
+               $this->validators = new Tx_Extbase_Persistence_ObjectStorage();
+       }
+
+       /**
+        * Checks if the given value is valid according to the validators of the chain ..
         *
-        * If at least one error occurred, the result is FALSE and any errors will
-        * be stored in the given errors object.
+        * If at least one error occurred, the result is FALSE.
         *
         * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
         * @return boolean TRUE if the value is valid, FALSE if an error occured
+        * @author Robert Lemke <robert@typo3.org>
         */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               $subjectIsValid = TRUE;
+       public function isValid($value) {
                foreach ($this->validators as $validator) {
-                       $subjectIsValid &= $validator->isValid($value, $errors);
+                       if ($validator->isValid($value) === FALSE) {
+                               $this->errors = $validator->getErrors();
+                               return FALSE;
+                       }
                }
-               return (boolean)$subjectIsValid;
+               return TRUE;
+       }
+
+       /**
+        * Does nothing.
+        *
+        * @param array $options Not used
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function setOptions(array $options) {
+       }
+
+       /**
+        * Returns an array of errors which occurred during the last isValid() call.
+        *
+        * @return array An array of error messages or an empty array if no errors occurred.
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function getErrors() {
+               return $this->errors;
        }
 
        /**
-        * Adds a new validator to the chain. Returns the index of the chain entry.
+        * Adds a new validator to the chain.
         *
         * @param Tx_Extbase_Validation_Validator_ValidatorInterface $validator The validator that should be added
-        * @return integer The index of the new chain entry
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
         */
        public function addValidator(Tx_Extbase_Validation_Validator_ValidatorInterface $validator) {
-               $this->validators[] = $validator;
-               return count($this->validators) - 1;
+               $this->validators->attach($validator);
        }
 
        /**
-        * Returns the validator with the given index of the chain.
+        * Removes the specified validator.
         *
-        * @param integer $index The index of the validator that should be returned
-        * @return Tx_Extbase_Validation_Validator_ValidatorInterface The requested validator
-        * @throws Tx_Extbase_Validation_Exception_InvalidChainIndex
+        * @param Tx_Extbase_Validation_Validator_ValidatorInterface $validator The validator to remove
+        * @author Robert Lemke <robert@typo3.org>
         */
-       public function getValidator($index) {
-               if (!isset($this->validators[$index])) throw new Tx_Extbase_Validation_Exception_InvalidChainIndex('Invalid chain index.', 1207215864);
-               return $this->validators[$index];
+       public function removeValidator(Tx_Extbase_Validation_Validator_ValidatorInterface $validator) {
+               if (!$this->validators->contains($validator)) throw new Tx_Extbase_Validation_Exception_NoSuchValidator('Cannot remove validator because its not in the chain.', 1207020177);
+               $this->validators->detach($validator);
        }
 
        /**
-        * Removes the validator with the given index of the chain.
+        * Returns the number of validators contained in this chain.
         *
-        * @param integer $index The index of the validator that should be removed
+        * @return integer The number of validators
+        * @author Robert Lemke <robert@typo3.org>
         */
-       public function removeValidator($index) {
-               if (!isset($this->validators[$index])) throw new Tx_Extbase_Validation_Exception_InvalidChainIndex('Invalid chain index.', 1207020177);
-               unset($this->validators[$index]);
+       public function count() {
+               return count($this->validators);
        }
 }
 
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/DateTimeValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/DateTimeValidator.php
new file mode 100644 (file)
index 0000000..35f729f
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Validator for DateTime objects
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Validation_Validator_DateTimeValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
+
+       /**
+        * Checks if the given value is a valid DateTime object.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param mixed $value The value that should be validated
+        * @param array $validationOptions Not used
+        * @return boolean TRUE if the value is valid, FALSE if an error occured
+        * @author Karsten Dambekalns <karsten@typo3.org>
+        */
+       public function isValid($value) {
+               $this->errors = array();
+               if ($value instanceof DateTime) return TRUE;
+               $this->addError('The given subject was not a valid DateTime. Got: "' .gettype($value) . '"', 1238087674);
+               return FALSE;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/EmailAddress.php b/typo3/sysext/extbase/Classes/Validation/Validator/EmailAddress.php
deleted file mode 100644 (file)
index 8fb2de2..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Validator for email addresses
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_EmailAddress implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Checks if the given value is a valid email address.
-        *
-        * Any errors will be stored in the given errors object.
-        * If at least one error occurred, the result is FALSE.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               if (filter_var($value, FILTER_VALIDATE_EMAIL) !== FALSE) return TRUE;
-               $errors->append('The given subject was not a valid email address.');
-               return FALSE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/EmailAddressValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/EmailAddressValidator.php
new file mode 100644 (file)
index 0000000..1bb3c52
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Validator for email addresses
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Validation_Validator_EmailAddressValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
+
+       /**
+        * Checks if the given value is a valid email address.
+        * If at least one error occurred, the result is FALSE.
+        * 
+        * The regexp is a modified version of the last one shown on
+        * http://www.regular-expressions.info/email.html
+        *
+        * @param mixed $value The value that should be validated
+        * @return boolean TRUE if the value is valid, FALSE if an error occured
+        * @author Karsten Dambekalns <karsten@typo3.org>
+        */
+       public function isValid($value) {
+               $this->errors = array();
+               if(is_string($value) && preg_match('
+                               /
+                                       [a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*
+                                       @
+                                       (?:
+                                               (?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[a-z]{2}|aero|asia|biz|cat|com|edu|coop|gov|info|int|invalid|jobs|localdomain|mil|mobi|museum|name|net|org|pro|tel|travel)|
+                                               localhost|
+                                               (?:(?:\d{1,2}|1\d{1,2}|2[0-5][0-5])\.){3}(?:(?:\d{1,2}|1\d{1,2}|2[0-5][0-5]))
+                                       )
+                                       \b
+                               /ix', $value)) return TRUE;
+               $this->addError('The given subject was not a valid email address.', 1221559976);
+               return FALSE;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/Float.php b/typo3/sysext/extbase/Classes/Validation/Validator/Float.php
deleted file mode 100644 (file)
index 6cd853a..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Validator for floats
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_Float implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Checks if the given value is a valid float.
-        *
-        * If at least one error occurred, the result is FALSE and any errors will
-        * be stored in the given errors object.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               if ($value !== filter_var($value, FILTER_SANITIZE_FLOAT)) {
-                       return TRUE;
-               }
-               $errors->append('The given subject was not a valid float.');
-               return FALSE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/FloatValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/FloatValidator.php
new file mode 100644 (file)
index 0000000..433c1a6
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Validator for floats
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Validation_Validator_FloatValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
+
+       /**
+        * Checks if the given value is a valid float.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param mixed $value The value that should be validated
+        * @return boolean TRUE if the value is valid, FALSE if an error occured
+        * @author Karsten Dambekalns <karsten@typo3.org>
+        */
+       public function isValid($value) {
+               $this->errors = array();
+               if (is_float($value) || (is_string($value) && strpos($value, '.') !== FALSE && preg_match('/^[0-9.e+-]+$/', $value))) {
+                       return TRUE;
+               }
+               $this->addError('The given subject was not a valid float.', 1221560288);
+               return FALSE;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/GenericObjectValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/GenericObjectValidator.php
new file mode 100644 (file)
index 0000000..2c17a4e
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A generic object validator which allows for specifying property validators
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ * @scope prototype
+ */
+class Tx_Extbase_Validation_Validator_GenericObjectValidator extends Tx_Extbase_Validation_Validator_AbstractObjectValidator {
+
+       /**
+        * @var array
+        */
+       protected $propertyValidators = array();
+
+       /**
+        * Checks if the given value is valid according to the property validators
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param mixed $value The value that should be validated
+        * @return boolean TRUE if the value is valid, FALSE if an error occured
+        */
+       public function isValid($value) {
+               if (!is_object($value)) {
+                       $this->addError('Value is no object.', 1241099148);
+                       return FALSE;
+               }
+
+               foreach (array_keys($this->propertyValidators) as $propertyName) {
+                       if ($this->isPropertyValid($value, $propertyName) === FALSE) {
+                               return FALSE;
+                       }
+               }
+               return TRUE;
+       }
+
+       /**
+        * Checks the given object can be validated by the validator implementation
+        *
+        * @param object $object The object to be checked
+        * @return boolean TRUE if the given value is an object
+        */
+       public function canValidate($object) {
+               return is_object($object);
+       }
+
+       /**
+        * Checks if the specified property of the given object is valid.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param object $object The object containing the property to validate
+        * @param string $propertyName Name of the property to validate
+        * @return boolean TRUE if the property value is valid, FALSE if an error occured
+        */
+       public function isPropertyValid($object, $propertyName) {
+               if (!is_object($object)) throw new InvalidArgumentException('Object expected, ' . gettype($object) . ' given.', 1241099149);
+               if (!isset($this->propertyValidators[$propertyName])) return TRUE;
+
+               foreach ($this->propertyValidators[$propertyName] as $validator) {
+                       if ($validator->isValid(Tx_Extbase_Reflection_ObjectAccess::getProperty($object, $propertyName)) === FALSE) {
+                               $this->errors = $validator->getErrors();
+                               return FALSE;
+                       }
+               }
+               return TRUE;
+       }
+
+       /**
+        * Adds the given validator for validation of the specified property.
+        *
+        * @param string $propertyName Name of the property to validate
+        * @param Tx_Extbase_Validation_Validator_ValidatorInterface $validator The property validator
+        * @return void
+        */
+       public function addPropertyValidator($propertyName, Tx_Extbase_Validation_Validator_ValidatorInterface $validator) {
+               if (!isset($this->propertyValidators[$propertyName])) {
+                       $this->propertyValidators[$propertyName] = new Tx_Extbase_Persistence_ObjectStorage;
+               }
+               $this->propertyValidators[$propertyName]->attach($validator);
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/Integer.php b/typo3/sysext/extbase/Classes/Validation/Validator/Integer.php
deleted file mode 100644 (file)
index 5a1382a..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Validator for integers
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_Integer implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Checks if the given value is a valid integer.
-        *
-        * If at least one error occurred, the result is FALSE and any errors will
-        * be stored in the given errors object.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               if (filter_var($value, FILTER_VALIDATE_INT) !== FALSE) return TRUE;
-               $errors->append('The given subject was not a valid integer.');
-               return FALSE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/IntegerValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/IntegerValidator.php
new file mode 100644 (file)
index 0000000..a237584
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Validator for integers
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Validation_Validator_IntegerValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
+
+       /**
+        * Checks if the given value is a valid integer.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param mixed $value The value that should be validated
+        * @return boolean TRUE if the value is valid, FALSE if an error occured
+        * @author Karsten Dambekalns <karsten@typo3.org>
+        */
+       public function isValid($value) {
+               $this->errors = array();
+               if (filter_var($value, FILTER_VALIDATE_INT) !== FALSE) return TRUE;
+               $this->addError('The given subject was not a valid integer.', 1221560494);
+               return FALSE;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/NotEmpty.php b/typo3/sysext/extbase/Classes/Validation/Validator/NotEmpty.php
deleted file mode 100644 (file)
index d92ef7f..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Validator for not empty values
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_NotEmpty implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Checks if the given property ($propertyValue) is not empty (NULL or empty string).
-        *
-        * If at least one error occurred, the result is FALSE and any errors will
-        * be stored in the given errors object.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               if ($value === NULL) {
-                       $errors->append('The given subject was NULL.');
-                       return FALSE;
-               }
-               if ($value === '') {
-                       $errors->append('The given subject was empty.');
-                       return FALSE;
-               }
-               return TRUE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/NotEmptyValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/NotEmptyValidator.php
new file mode 100644 (file)
index 0000000..9926516
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Validator for not empty values
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Validation_Validator_NotEmptyValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
+
+       /**
+        * Checks if the given property ($propertyValue) is not empty (NULL or empty string).
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param mixed $value The value that should be validated
+        * @return boolean TRUE if the value is valid, FALSE if an error occured
+        * @author Andreas Förthner <andreas.foerthner@netlogix.de>
+        * @author Karsten Dambekalns <karsten@typo3.org>
+        */
+       public function isValid($value) {
+               $this->errors = array();
+               if ($value === NULL) {
+                       $this->addError('The given subject was NULL.', 1221560910);
+                       return FALSE;
+               }
+               if ($value === '') {
+                       $this->addError('The given subject was empty.', 1221560718);
+                       return FALSE;
+               }
+               return TRUE;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/Number.php b/typo3/sysext/extbase/Classes/Validation/Validator/Number.php
deleted file mode 100644 (file)
index b229302..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Validator for general numbers
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_Number implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Checks if the given value is a valid number.
-        *
-        * If at least one error occurred, the result is FALSE and any errors will
-        * be stored in the given errors object.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               if (is_numeric($value)) return TRUE;
-               $errors->append('The given subject was not a valid number.');
-               return FALSE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/NumberRange.php b/typo3/sysext/extbase/Classes/Validation/Validator/NumberRange.php
deleted file mode 100644 (file)
index 7669dd8..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Validator for general numbers
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_NumberRange implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Returns TRUE, if the given property ($propertyValue) is a valid number in the given range.
-        *
-        * If at least one error occurred, the result is FALSE and any errors will
-        * be stored in the given errors object.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               if (!is_numeric($value)) {
-                       $errors->append('The given subject was not a valid number. Got: "' . $value . '"');
-                       return FALSE;
-               }
-
-               $startRange = (isset($validationOptions['startRange'])) ? intval($validationOptions['startRange']) : 0;
-               $endRange = (isset($validationOptions['endRange'])) ? intval($validationOptions['endRange']) : PHP_INT_MAX;
-               if ($startRange > $endRange) {
-                       $x = $startRange;
-                       $startRange = $endRange;
-                       $endRange = $x;
-               }
-               if ($value >= $startRange && $value <= $endRange) return TRUE;
-
-               $errors->append('The given subject was not in the valid range (' . $startRange . ', ' . $endRange . ').');
-               return FALSE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/NumberRangeValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/NumberRangeValidator.php
new file mode 100644 (file)
index 0000000..95c2d1d
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Validator for general numbers
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ * @scope prototype
+ */
+class Tx_Extbase_Validation_Validator_NumberRangeValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
+
+       /**
+        * Returns TRUE, if the given property ($propertyValue) is a valid number in the given range.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param mixed $value The value that should be validated
+        * @param \F3\FLOW3\Validation\Errors $errors An Errors object which will contain any errors which occurred during validation
+        * @return boolean TRUE if the value is within the range, otherwise FALSE
+        * @author Andreas Förthner <andreas.foerthner@netlogix.de>
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function isValid($value) {
+               $this->errors = array();
+               if (!is_numeric($value)) {
+                       $this->addError('The given subject was not a valid number.', 1221563685);
+                       return FALSE;
+               }
+
+               $startRange = (isset($this->options['startRange'])) ? intval($this->options['startRange']) : 0;
+               $endRange = (isset($this->options['endRange'])) ? intval($this->options['endRange']) : PHP_INT_MAX;
+               if ($startRange > $endRange) {
+                       $x = $startRange;
+                       $startRange = $endRange;
+                       $endRange = $x;
+               }
+               if ($value >= $startRange && $value <= $endRange) return TRUE;
+
+               $this->addError('The given subject was not in the valid range (' . $startRange . ' - ' . $endRange . ').', 1221561046);
+               return FALSE;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/NumberValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/NumberValidator.php
new file mode 100644 (file)
index 0000000..89e9bc3
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Validator for general numbers
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Validation_Validator_NumberValidator extends Tx_Extbase_Validation_Validator_AbstractValidator {
+
+       /**
+        * Checks if the given value is a valid number.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param mixed $value The value that should be validated
+        * @return boolean TRUE if the value is valid, FALSE if an error occured
+        * @author Andreas Förthner <andreas.foerthner@netlogix.de>
+        * @author Karsten Dambekalns <karsten@typo3.org>
+        */
+       public function isValid($value) {
+               $this->errors = array();
+               if (is_numeric($value)) return TRUE;
+               $this->addError('The given subject was not a valid number.', 1221563685);
+               return FALSE;
+       }
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/ObjectValidatorInterface.php b/typo3/sysext/extbase/Classes/Validation/Validator/ObjectValidatorInterface.php
new file mode 100755 (executable)
index 0000000..f92ed0e
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * Contract for an object validator
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+interface Tx_Extbase_Validation_Validator_ObjectValidatorInterface extends Tx_Extbase_Validation_Validator_ValidatorInterface {
+
+       /**
+        * Checks the given object can be validated by the validator implementation
+        *
+        * @param object $object The object to be checked
+        * @return boolean TRUE if this validator can validate instances of the given object or FALSE if it can't
+        */
+       public function canValidate($object);
+
+       /**
+        * Checks if the specified property of the given object is valid.
+        *
+        * If at least one error occurred, the result is FALSE.
+        *
+        * @param object $object The object containing the property to validate
+        * @param string $propertyName Name of the property to validate
+        * @return boolean TRUE if the property value is valid, FALSE if an error occured
+        */
+       public function isPropertyValid($object, $propertyName);
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/Raw.php b/typo3/sysext/extbase/Classes/Validation/Validator/Raw.php
deleted file mode 100644 (file)
index 3599c94..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * A validator which accepts any input
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_Raw implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Always returns TRUE.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               return TRUE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/RawValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/RawValidator.php
new file mode 100644 (file)
index 0000000..b4e8602
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  This copyright notice MUST APPEAR in all copies of the script!
+***************************************************************/
+
+/**
+ * A validator which accepts any input
+ *
+ * @package TYPO3
+ * @subpackage extbase
+ * @version $Id: $
+ */
+class Tx_Extbase_Validation_Validator_RawValidator implements Tx_Extbase_Validation_Validator_ValidatorInterface {
+
+       /**
+        * Always returns TRUE
+        *
+        * @param mixed $value The value that should be validated
+        * @return boolean TRUE
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function isValid($value) {
+               return TRUE;
+       }
+
+       /**
+        * Sets options for the validator
+        *
+        * @param array $options Not used
+        * @return void
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function setOptions(array $options) {
+       }
+
+       /**
+        * Returns an array of errors which occurred during the last isValid() call.
+        *
+        * @return array An array of error messages or an empty array if no errors occurred.
+        * @author Robert Lemke <robert@typo3.org>
+        */
+       public function getErrors() {
+               return array();
+       }
+
+}
+?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/RegularExpression.php b/typo3/sysext/extbase/Classes/Validation/Validator/RegularExpression.php
deleted file mode 100644 (file)
index 196e4e4..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-
-/**
- * Validator for regular expressions
- *
- * @package TYPO3
- * @subpackage extbase
- * @version $ID:$
- */
-class Tx_Extbase_Validation_Validator_RegularExpression implements Tx_Extbase_Validation_Validator_ValidatorInterface {
-
-       /**
-        * Returns TRUE, if the given property ($value) matches the given regular expression.
-        *
-        * If at least one error occurred, the result is FALSE and any errors will
-        * be stored in the given errors object.
-        *
-        * @param mixed $value The value that should be validated
-        * @param Tx_Extbase_Validation_Errors $errors An Errors object which will contain any errors which occurred during validation
-        * @param array $validationOptions Not used
-        * @return boolean TRUE if the value is valid, FALSE if an error occured
-        */
-       public function isValid($value, Tx_Extbase_Validation_Errors &$errors, array $validationOptions = array()) {
-               if (!isset($validationOptions['regularExpression'])) {
-                       $errors->append('The regular expression was empty.');
-                       return FALSE;
-               }
-               $result = preg_match($validationOptions['regularExpression'], $value);
-               if ($result === 0) {
-                       $errors->append('The given subject did not match the pattern.');
-                       return FALSE;
-               }
-               if ($result === FALSE) {
-                       $errors->append('The regular expression "' . $validationOptions['regularExpression'] . '" contained an error.');
-                       return FALSE;
-               }
-               return TRUE;
-       }
-}
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/extbase/Classes/Validation/Validator/RegularExpressionValidator.php b/typo3/sysext/extbase/Classes/Validation/Validator/RegularExpressionValidator.php
new file mode 100644 (file)
index 0000000..c35a97c
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
+*  All rights reserved
+*
+*  This script is part of the TYPO3 project. The TYPO3 project is
+*  free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  The GNU General Public License can be found at
+*  http://www.gnu.org/copyleft/gpl.html.
+*
+*  This script is distributed