diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 53a957c419a64..96663be95f857 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -34,6 +34,7 @@ 'OCP\\AppFramework\\Db\\MultipleObjectsReturnedException' => $baseDir . '/lib/public/AppFramework/Db/MultipleObjectsReturnedException.php', 'OCP\\AppFramework\\Db\\QBMapper' => $baseDir . '/lib/public/AppFramework/Db/QBMapper.php', 'OCP\\AppFramework\\Db\\TTransactional' => $baseDir . '/lib/public/AppFramework/Db/TTransactional.php', + 'OCP\\AppFramework\\Db\\TypedEntity' => $baseDir . '/lib/public/AppFramework/Db/TypedEntity.php', 'OCP\\AppFramework\\Http' => $baseDir . '/lib/public/AppFramework/Http.php', 'OCP\\AppFramework\\Http\\ContentSecurityPolicy' => $baseDir . '/lib/public/AppFramework/Http/ContentSecurityPolicy.php', 'OCP\\AppFramework\\Http\\DataDisplayResponse' => $baseDir . '/lib/public/AppFramework/Http/DataDisplayResponse.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index a35df71e3765a..89394211633cb 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -67,6 +67,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\AppFramework\\Db\\MultipleObjectsReturnedException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/MultipleObjectsReturnedException.php', 'OCP\\AppFramework\\Db\\QBMapper' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/QBMapper.php', 'OCP\\AppFramework\\Db\\TTransactional' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/TTransactional.php', + 'OCP\\AppFramework\\Db\\TypedEntity' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/TypedEntity.php', 'OCP\\AppFramework\\Http' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Http.php', 'OCP\\AppFramework\\Http\\ContentSecurityPolicy' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Http/ContentSecurityPolicy.php', 'OCP\\AppFramework\\Http\\DataDisplayResponse' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Http/DataDisplayResponse.php', diff --git a/lib/public/AppFramework/Db/TypedEntity.php b/lib/public/AppFramework/Db/TypedEntity.php new file mode 100644 index 0000000000000..7e630fc695bed --- /dev/null +++ b/lib/public/AppFramework/Db/TypedEntity.php @@ -0,0 +1,69 @@ + + * + * @author 2022 Christoph Wurst + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +namespace OCP\AppFramework\Db; + +use ReflectionClass; +use function get_class; + +class TypedEntity extends Entity { + + /** @var string[][] */ + static $reflectedFieldTypes = []; + + public function __construct() { + $class = get_class($this); + $cachedTypes = self::$reflectedFieldTypes[get_class($this)] ?? null; + if ($cachedTypes !== null) { + foreach ($cachedTypes as $name => $type) { + $this->addType($name, $type); + } + } else { + $reflectedSelf = new ReflectionClass($this); + $fieldTypes = $this->getFieldTypes(); + self::$reflectedFieldTypes[$class] = []; + foreach ($reflectedSelf->getProperties() as $property) { + if (isset($fieldTypes[$property->getName()])) { + // Don't override + continue; + } + $propertyType = $property->getType(); + if ($propertyType === null) { + // Can't derive + continue; + } + + if (!$propertyType->isBuiltin()) { + // Complex type is not supported + continue; + } + + $this->addType($property->getName(), $propertyType->getName()); + self::$reflectedFieldTypes[$class][$property->getName()] = $propertyType->getName(); + } + } + } + +}