api_factory = $api_factory; $this->guest_os_repository = $guest_os_repository; $this->hypervisor_type_repository = $hypervisor_type_repository; $this->api_version_repository = $api_version_repository; $this->component_repository = $component_repository; $this->release_repository = $release_repository; $this->supported_version_repository = $supported_version_repository; } protected function clearCollections(ICompanyService &$implementation){ parent::clearCollections($implementation); $implementation->clearCapabilities(); $implementation->clearHypervisors(); $implementation->clearGuests(); } protected function updateCollections(ICompanyService &$implementation, array $data){ parent::updateCollections($implementation, $data); if(array_key_exists('guest_os',$data) && is_array($data['guest_os'])){ $data_guests = $data['guest_os']; foreach($data_guests as $guest_id){ $this->registerGuest($implementation, $guest_id); } } //add hyper visors if(array_key_exists('hypervisors',$data) && is_array($data['hypervisors'])){ $data_hypervisors = $data['hypervisors']; foreach($data_hypervisors as $hypervisor_id){ $this->registerHyperVisor($implementation, $hypervisor_id); } } //add capabilities if(array_key_exists('capabilities',$data) && is_array($data['capabilities'])){ $data_capabilities = $data['capabilities']; foreach($data_capabilities as $capability_data){ $this->addCapability($capability_data,$implementation); } } } protected function registerCapability(IOpenStackImplementation $implementation, IOpenStackImplementationApiCoverage $capability){ //check release $release = $this->release_repository->getById($capability->getReleaseSupportedApiVersion()->getRelease()->getIdentifier()); if(!$release) throw new NotFoundEntityException('',''); //check component $component = $this->component_repository->getById($capability->getReleaseSupportedApiVersion()->getOpenStackComponent()->getIdentifier()); if(!$component) throw new NotFoundEntityException('',''); if(!$release->supportsComponent($component->getCodeName())) throw new InvalidAggregateRootException('','','',''); if($component->getSupportsVersioning()){ //check api version $api_version = $this->api_version_repository->getByIdAndComponent($capability->getReleaseSupportedApiVersion()->getApiVersion()->getIdentifier(),$component->getIdentifier()); if(!$api_version) throw new NotFoundEntityException('',''); } else{ $api_version = $capability->getReleaseSupportedApiVersion()->getApiVersion(); $api_version->setReleaseComponent($component); } $release_supported_api = $release->supportsApiVersion($api_version); if(!$release_supported_api) throw new InvalidAggregateRootException('','','',''); $capability->setReleaseSupportedApiVersion($release_supported_api); $implementation->addCapability($capability); } protected function addCapability(array $capability_data, IOpenStackImplementation $implementation){ $validator = $this->validator_factory->buildValidatorForCapability($capability_data); if ($validator->fails()) { return $this->validationError($validator->messages()); } $component = $this->component_repository->getById(intval($capability_data['component_id'])); if(!$component) throw new NotFoundEntityException('OpenStackComponent',sprintf('id %',intval($capability_data['component_id']))); $release = $this->release_repository->getById(intval($capability_data['release_id'])); if(!$release) throw new NotFoundEntityException('OpenStackRelease',sprintf('id %',intval($capability_data['release_id']))); if(!$release->supportsComponent($component->getCodeName())) throw new NonSupportedComponent($release,$component); $supported_version = null; if($component->getSupportsVersioning()){ $version = $this->api_version_repository->getById(intval($capability_data['version_id'])); if(!$version) throw new NotFoundEntityException('OpenStackApiVersion',sprintf('id %',intval($capability_data['version_id']))); $supported_version = $release->supportsApiVersion($version); } else{ $supported_version = $this->supported_version_repository->getByReleaseAndComponentAndApiVersion(intval($capability_data['release_id']),intval($capability_data['component_id']),0); } if(!$supported_version) throw new NotFoundEntityException('OpenStackReleaseSupportedVersion',''); $capability = $this->factory->buildCapability(intval($capability_data['coverage']),$supported_version, $implementation); $this->registerCapability($implementation,$capability); } protected function registerGuest(IOpenStackImplementation $implementation, $guest_type_id){ $guest = $this->guest_os_repository->getById($guest_type_id); if(!$guest) throw new NotFoundEntityException('',''); $implementation->addGuest($guest); } protected function registerHyperVisor(IOpenStackImplementation $implementation, $hypervisor_type_id){ $hypervisor = $this->hypervisor_type_repository->getById($hypervisor_type_id); if(!$hypervisor) throw new NotFoundEntityException('',''); $implementation->addHyperVisor($hypervisor); } }