* @throws \InvalidArgumentException * @psalm-taint-escape callable */ private function validateObjectStoreClassString(string $class): string { if (!\is_subclass_of($class, IObjectStore::class)) { throw new \InvalidArgumentException('Invalid object store'); } return $class; } /** * Process storage ready for mounting * * @throws QueryException */ private function prepareStorageConfig(StorageConfig &$storage, IUser $user): void { foreach ($storage->getBackendOptions() as $option => $value) { $storage->setBackendOption($option, MountConfig::substitutePlaceholdersInConfig($value, $user->getUID())); } $objectStore = $storage->getBackendOption('objectstore'); if ($objectStore) { $objectClass = $this->validateObjectStoreClassString($objectStore['class']); $storage->setBackendOption('objectstore', new $objectClass($objectStore)); } $storage->getAuthMechanism()->manipulateStorageConfig($storage, $user); $storage->getBackend()->manipulateStorageConfig($storage, $user); } /** * Construct the storage implementation * * @param StorageConfig $storageConfig */ private function constructStorage(StorageConfig $storageConfig): IStorage { $class = $storageConfig->getBackend()->getStorageClass(); if (!is_a($class, IConstructableStorage::class, true)) { Server::get(LoggerInterface::class)->warning('Building a storage not implementing IConstructableStorage is deprecated since 31.0.0', ['class' => $class]); } $storage = new $class($storageConfig->getBackendOptions()); // auth mechanism should fire first $storage = $storageConfig->getBackend()->wrapStorage($storage); $storage = $storageConfig->getAuthMechanism()->wrapStorage($storage); return $storage; } /** * Get all mountpoints applicable for the user * * @return IMountPoint[] */ public function getMountsForUser(IUser $user, IStorageFactory $loader) { $this->userStoragesService->setUser($user); $this->userGlobalStoragesService->setUser($user); $storageConfigs = $this->userGlobalStoragesService->getAllStoragesForUser(); $storages = array_map(function (StorageConfig $storageConfig) use ($user) { try { $this->prepareStorageConfig($storageConfig, $user); return $this->constructStorage($storageConfig); } catch (\Exception $e) { // propagate exception into filesystem return new FailedStorage(['exception' => $e]); } }, $storageConfigs); Storage::getGlobalCache()->loadForStorageIds(array_map(function (IStorage $storage) { return $storage->getId(); }, $storages)); $availableStorages = array_map(function (IStorage $storage, StorageConfig $storageConfig): IStorage { try { $availability = $storage->getAvailability(); if (!$availability['available'] && !Availability::shouldRecheck($availability)) { $storage = new FailedStorage([ 'exception' => new StorageNotAvailableException('Storage with mount id ' . $storageConfig->getId() . ' is not available') ]); } } catch (\Exception $e) { // propagate exception into filesystem $storage = new FailedStorage(['exception' => $e]); } return $storage; }, $storages, $storageConfigs); $mounts = array_map(function (StorageConfig $storageConfig, IStorage $storage) use ($user, $loader) { $storage->setOwner($user->getUID()); if ($storageConfig->getType() === StorageConfig::MOUNT_TYPE_PERSONAL) { return new PersonalMount( $this->userStoragesService, $storageConfig, $storageConfig->getId(), new KnownMtime([ 'storage' => $storage, 'clock' => $this->clock, ]), '/' . $user->getUID() . '/files' . $storageConfig->getMountPoint(), null, $loader, $storageConfig->getMountOptions(), $storageConfig->getId() ); } else { return new SystemMountPoint( $storageConfig, $storage, '/' . $user->getUID() . '/files' . $storageConfig->getMountPoint(), null, $loader, $storageConfig->getMountOptions(), $storageConfig->getId() ); } }, $storageConfigs, $availableStorages); $this->userStoragesService->resetUser(); $this->userGlobalStoragesService->resetUser(); return $mounts; } } t'>remote-run/flow-atmosphere-test Vaadin 6, 7, 8 is a Java framework for modern Java web applications: https://github.com/vaadin/frameworkwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/documentation/gwt/gwt-componentcontainer.asciidoc
blob: 8bdb4e6d7fd4a810654aa311ee67741b6305659b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
title: Component Containers
order: 9
layout: page
---

[[gwt.componentcontainer]]
= Component Containers

Component containers, such as layout components, are a special group of
components that require some consideration. In addition to handling state, they
need to manage communicating the hierarchy of their contained components to the
other side.

The easiest way to implement a component container is extend the
[classname]#AbstractComponentContainer#, which handles the synchronization of
the container server-side components to the client-side.