Skip to content

Commit

Permalink
Implementing connectors factory (#1)
Browse files Browse the repository at this point in the history
* Implementing connectors factory
  • Loading branch information
akadlec committed Jul 3, 2022
1 parent 33ca1db commit 7f70798
Show file tree
Hide file tree
Showing 24 changed files with 451 additions and 127 deletions.
2 changes: 1 addition & 1 deletion fastybird_devices_module/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@
Devices module
"""

__version__ = "0.66.0"
__version__ = "0.67.0"
89 changes: 30 additions & 59 deletions src/Connectors/Connector.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
use Nette\Utils;
use Psr\EventDispatcher as PsrEventDispatcher;
use Psr\Log;
use SplObjectStorage;
use Throwable;

/**
Expand All @@ -50,14 +49,11 @@ final class Connector
/** @var bool */
private bool $stopped = true;

/** @var IConnector|null */
private ?IConnector $service = null;

/** @var MetadataEntities\Modules\DevicesModule\IConnectorEntity|null */
private ?MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector = null;
/** @var ConnectorFactory */
private ConnectorFactory $factory;

/** @var SplObjectStorage<IConnector, null> */
private SplObjectStorage $connectors;
/** @var IConnector|null */
private ?IConnector $connector = null;

/** @var Models\Connectors\Properties\IPropertiesRepository */
private Models\Connectors\Properties\IPropertiesRepository $connectorPropertiesRepository;
Expand All @@ -81,6 +77,7 @@ final class Connector
private Log\LoggerInterface $logger;

public function __construct(
ConnectorFactory $factory,
Models\Connectors\Properties\IPropertiesRepository $connectorPropertiesRepository,
Models\Connectors\Properties\IPropertiesManager $connectorPropertiesManager,
Models\States\ConnectorPropertiesRepository $connectorPropertiesStateRepository,
Expand All @@ -89,6 +86,8 @@ public function __construct(
?PsrEventDispatcher\EventDispatcherInterface $dispatcher,
?Log\LoggerInterface $logger = null
) {
$this->factory = $factory;

$this->connectorPropertiesRepository = $connectorPropertiesRepository;
$this->connectorPropertiesManager = $connectorPropertiesManager;
$this->connectorPropertiesStateRepository = $connectorPropertiesStateRepository;
Expand All @@ -98,8 +97,6 @@ public function __construct(
$this->dispatcher = $dispatcher;

$this->logger = $logger ?? new Log\NullLogger();

$this->connectors = new SplObjectStorage();
}

/**
Expand All @@ -111,45 +108,31 @@ public function __construct(
*/
public function execute(MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector): void
{
$this->connectors->rewind();

if ($this->dispatcher !== null) {
$this->dispatcher->dispatch(new Events\BeforeConnectorStartEvent($connector));
}

$this->connector = $connector;

foreach ($this->connectors as $service) {
if ($connector->getType() === $service->getType()) {
$this->logger->debug('Starting connector...', [
'source' => 'devices-module',
'type' => 'connector',
]);

try {
$this->service = $service;
$this->service->initialize($connector);
$this->connector = $this->factory->create($connector);

// Start connector service
$this->service->execute();

$this->stopped = false;
$this->logger->debug('Starting connector...', [
'source' => 'devices-module',
'type' => 'connector',
]);

$this->setConnectorState(ConnectionStateType::get(ConnectionStateType::STATE_RUNNING));
} catch (Throwable $ex) {
throw new Exceptions\TerminateException('Connector can\'t be started');
}
try {
// Start connector service
$this->connector->execute();

if ($this->dispatcher !== null) {
$this->dispatcher->dispatch(new Events\AfterConnectorStartEvent($connector));
}
$this->stopped = false;

return;
}
$this->setConnectorState(ConnectionStateType::get(ConnectionStateType::STATE_RUNNING));
} catch (Throwable $ex) {
throw new Exceptions\TerminateException('Connector can\'t be started');
}

throw new Exceptions\InvalidArgumentException(sprintf('Connector %s is not registered', $connector->getId()
->toString()));
if ($this->dispatcher !== null) {
$this->dispatcher->dispatch(new Events\AfterConnectorStartEvent($connector));
}
}

/**
Expand All @@ -165,12 +148,12 @@ public function terminate(): void
]);

try {
if ($this->service !== null) {
if ($this->dispatcher !== null && $this->connector !== null) {
if ($this->connector !== null) {
if ($this->dispatcher !== null) {
$this->dispatcher->dispatch(new Events\BeforeConnectorTerminateEvent($this->connector));
}

$this->service->terminate();
$this->connector->terminate();

$now = $this->dateTimeFactory->getNow();

Expand All @@ -183,16 +166,16 @@ public function terminate(): void
$this->dateTimeFactory->getNow()->getTimestamp() - $now->getTimestamp()
) < self::SHUTDOWN_WAITING_DELAY
) {
if (!$this->service->hasUnfinishedTasks()) {
if (!$this->connector->hasUnfinishedTasks()) {
$waitingForClosing = false;
}
}
}

$this->setConnectorState(ConnectionStateType::get(ConnectionStateType::STATE_STOPPED));
if ($this->dispatcher !== null) {
$this->dispatcher->dispatch(new Events\AfterConnectorTerminateEvent($this->connector));
}

if ($this->dispatcher !== null && $this->connector !== null) {
$this->dispatcher->dispatch(new Events\AfterConnectorTerminateEvent($this->connector));
$this->setConnectorState(ConnectionStateType::get(ConnectionStateType::STATE_STOPPED));
}
} catch (Throwable $ex) {
$this->logger->error('Connector couldn\'t be stopped. An unexpected error occurred', [
Expand All @@ -206,18 +189,6 @@ public function terminate(): void
}
}

/**
* @param IConnector $connector
*
* @return void
*/
public function registerConnector(IConnector $connector): void
{
if ($this->connectors->contains($connector) === false) {
$this->connectors->attach($connector);
}
}

/**
* @param ConnectionStateType $state
*
Expand Down
66 changes: 66 additions & 0 deletions src/Connectors/ConnectorFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php declare(strict_types = 1);

/**
* ConnectorFactory.php
*
* @license More in license.md
* @copyright https://www.fastybird.com
* @author Adam Kadlec <adam.kadlec@fastybird.com>
* @package FastyBird:DevicesModule!
* @subpackage Connectors
* @since 0.67.0
*
* @date 03.07.22
*/

namespace FastyBird\DevicesModule\Connectors;

use FastyBird\DevicesModule\Exceptions;
use FastyBird\Metadata\Entities as MetadataEntities;
use SplObjectStorage;

/**
* Connector factory
*
* @package FastyBird:DevicesModule!
* @subpackage Connectors
*
* @author Adam Kadlec <adam.kadlec@fastybird.com>
*/
final class ConnectorFactory
{

/** @var SplObjectStorage<IConnectorFactory, null> */
private SplObjectStorage $factories;

/**
* @param IConnectorFactory[] $factories
*/
public function __construct(
array $factories
) {
$this->factories = new SplObjectStorage();

foreach ($factories as $factory) {
$this->factories->attach($factory);
}
}

/**
* @param MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector
*
* @return IConnector
*/
public function create(MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector): IConnector
{
/** @var IConnectorFactory $factory */
foreach ($this->factories as $factory) {
if ($connector->getType() === $factory->getType()) {
return $factory->create($connector);
}
}

throw new Exceptions\InvalidStateException('Connector could not be created');
}

}
15 changes: 3 additions & 12 deletions src/Connectors/IConnector.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

namespace FastyBird\DevicesModule\Connectors;

use FastyBird\Metadata\Entities as MetadataEntities;
use Ramsey\Uuid;

/**
* Devices connector interface
Expand All @@ -29,9 +29,9 @@ interface IConnector
{

/**
* @return string
* @return Uuid\UuidInterface
*/
public function getType(): string;
public function getId(): Uuid\UuidInterface;

/**
* @return void
Expand All @@ -48,13 +48,4 @@ public function terminate(): void;
*/
public function hasUnfinishedTasks(): bool;

/**
* @param MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector
*
* @return void
*/
public function initialize(
MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector
): void;

}
43 changes: 43 additions & 0 deletions src/Connectors/IConnectorFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php declare(strict_types = 1);

/**
* IConnectorFactory.php
*
* @license More in license.md
* @copyright https://www.fastybird.com
* @author Adam Kadlec <adam.kadlec@fastybird.com>
* @package FastyBird:DevicesModule!
* @subpackage Connectors
* @since 0.67.0
*
* @date 03.07.22
*/

namespace FastyBird\DevicesModule\Connectors;

use FastyBird\Metadata\Entities as MetadataEntities;

/**
* Connector factory interface
*
* @package FastyBird:DevicesModule!
* @subpackage Connectors
*
* @author Adam Kadlec <adam.kadlec@fastybird.com>
*/
interface IConnectorFactory
{

/**
* @return string
*/
public function getType(): string;

/**
* @param MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector
*
* @return IConnector
*/
public function create(MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector): IConnector;

}
3 changes: 3 additions & 0 deletions src/DI/DevicesModuleExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,9 @@ public function loadConfiguration(): void
->setType(Models\DataStorage\ChannelControlsRepository::class);

// Connector services
$builder->addDefinition($this->prefix('connector.factory'), new DI\Definitions\ServiceDefinition())
->setType(Connectors\ConnectorFactory::class);

$builder->addDefinition($this->prefix('connector.service'), new DI\Definitions\ServiceDefinition())
->setType(Connectors\Connector::class);

Expand Down
2 changes: 2 additions & 0 deletions src/DataStorage/Writer.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,10 @@ public function write(): void
$findConnectors = new Queries\FindConnectorsQuery();

$connectors = $this->connectorsRepository->findAllBy($findConnectors);
var_dump(count($connectors));

foreach ($connectors as $connector) {
var_dump($connector->getIdentifier());
$devices = [];

foreach ($connector->getDevices() as $device) {
Expand Down
14 changes: 7 additions & 7 deletions src/Events/AfterConnectorTerminateEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

namespace FastyBird\DevicesModule\Events;

use FastyBird\Metadata\Entities as MetadataEntities;
use FastyBird\DevicesModule\Connectors;
use Symfony\Contracts\EventDispatcher;

/**
Expand All @@ -29,22 +29,22 @@
class AfterConnectorTerminateEvent extends EventDispatcher\Event
{

/** @var MetadataEntities\Modules\DevicesModule\IConnectorEntity */
private MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector;
/** @var Connectors\IConnector */
private Connectors\IConnector $connector;

/**
* @param MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector
* @param Connectors\IConnector $connector
*/
public function __construct(
MetadataEntities\Modules\DevicesModule\IConnectorEntity $connector
Connectors\IConnector $connector
) {
$this->connector = $connector;
}

/**
* @return MetadataEntities\Modules\DevicesModule\IConnectorEntity
* @return Connectors\IConnector
*/
public function getConnector(): MetadataEntities\Modules\DevicesModule\IConnectorEntity
public function getConnector(): Connectors\IConnector
{
return $this->connector;
}
Expand Down
Loading

0 comments on commit 7f70798

Please sign in to comment.