/** * Remove idSoftware * * @param \Cacic\CommonBundle\Entity\Software $idSoftware */ public function removeIdSoftware(Software $idSoftware) { $idSoftware->removeAquisico($this); $this->idSoftware->removeElement($idSoftware); }
public function setSoftwareElement($software, $valor, $computador, $classObject) { $logger = $this->get('logger'); $em = $this->getDoctrine()->getManager(); if (empty($software)) { $logger->error("COLETA: Erro na coleta de software. Elemento nulo {$software}"); return false; } try { // FIX: alteração para igualar os campos nome do software e descrição $idSoftware = $software; if (array_key_exists('description', $valor)) { $software = $valor['description']; } // Recupera classProperty para o software $classProperty = $em->getRepository('CacicCommonBundle:ClassProperty')->findOneBy(array('idClass' => $classObject, 'nmPropertyName' => $idSoftware)); if (empty($classProperty)) { $classProperty = new ClassProperty(); $classProperty->setTePropertyDescription("Software detectado: {$software}"); $classProperty->setNmPropertyName($idSoftware); $classProperty->setIdClass($classObject); $classProperty->setAtivo(true); // Se não der o flush aqui, as consultas de baixo não encontram o objeto $em->persist($classProperty); $em->flush(); } $ativo = $classProperty->getAtivo(); //$logger->debug("11111111111111111111111111111111111111111: |$ativo| |$propriedade|"); if ($ativo === false) { // Só vou gravar o software se a propriedade estiver ativa $logger->debug("COLETA: Pulando software inativo: {$software}"); return false; } // Eduardo: 2015-08-06 // A propriedade passa a ser um identificador para o Software $softwareObject = $em->getRepository('CacicCommonBundle:Software')->getByNameOrProperty($software, $classProperty->getIdClassProperty()); if (empty($softwareObject)) { // Se nao existir, cria $logger->info("COLETA: Cadastrando software não encontrado {$software}"); $softwareObject = new Software(); $softwareObject->setNmSoftware($software); $softwareObject->setIdClassProperty($classProperty); // Se não der o flush aqui, as consultas de baixo não encontram o objeto $em->persist($softwareObject); $em->flush(); } // Adiciona software ao computador $propSoftware = $em->getRepository('CacicCommonBundle:PropriedadeSoftware')->findOneBy(array('classProperty' => $classProperty, 'computador' => $computador, 'software' => $softwareObject)); if (empty($propSoftware)) { $propSoftware = new PropriedadeSoftware(); $propSoftware->setComputador($computador); $propSoftware->setSoftware($softwareObject); $propSoftware->setClassProperty($classProperty); } // Garante que o software deve estar ativo $propSoftware->setAtivo(true); $propSoftware->setDataExclusao(null); // Encontra coleta já feita para o Computador $computadorColeta = $em->getRepository('CacicCommonBundle:ComputadorColeta')->findOneBy(array('computador' => $computador, 'classProperty' => $classProperty)); if (empty($computadorColeta)) { //$logger->debug("COLETA: Registrando nova coleta para o software $software no computador ".$computador->getIdComputador()); // Armazena no banco o objeto $computadorColeta = new ComputadorColeta(); $computadorColeta->setComputador($computador); $computadorColeta->setClassProperty($classProperty); $computadorColeta->setTeClassPropertyValue($software); $computadorColeta->setIdClass($classObject); $computadorColeta->setDtHrInclusao(new \DateTime()); $computadorColeta->setAtivo(true); $computadorColeta->setDtHrExclusao(null); $em->persist($computadorColeta); // Pega novo computador gerado no computador coleta $computador = $computadorColeta->getComputador(); // Gravo um histórico $computadorColetaHistorico = new ComputadorColetaHistorico(); $computadorColetaHistorico->setComputadorColeta($computadorColeta); $computadorColetaHistorico->setComputador($computador); $computadorColetaHistorico->setClassProperty($classProperty); $computadorColetaHistorico->setTeClassPropertyValue($software); $computadorColetaHistorico->setDtHrInclusao(new \DateTime()); $em->persist($computadorColetaHistorico); } elseif ($computadorColeta->getTeClassPropertyValue() != $software) { // Armazena no banco o objeto $computadorColeta->setComputador($computador); $computadorColeta->setClassProperty($classProperty); $computadorColeta->setTeClassPropertyValue($software); $computadorColeta->setIdClass($classObject); $computadorColeta->setDtHrInclusao(new \DateTime()); $computadorColeta->setAtivo(true); $computadorColeta->setDtHrExclusao(null); $em->persist($computadorColeta); // Pega novo computador gerado no computador coleta $computador = $computadorColeta->getComputador(); // Aqui é necessário uma entrada no histórico $computadorColetaHistorico = new ComputadorColetaHistorico(); $computadorColetaHistorico->setComputadorColeta($computadorColeta); $computadorColetaHistorico->setComputador($computador); $computadorColetaHistorico->setClassProperty($classProperty); $computadorColetaHistorico->setTeClassPropertyValue($software); $computadorColetaHistorico->setDtHrInclusao(new \DateTime()); $em->persist($computadorColetaHistorico); } // Atualiza valores do Software // $softwareObject->setNmSoftware($software); if (array_key_exists('description', $valor)) { $softwareObject->setTeDescricaoSoftware($valor['description']); $propSoftware->setDisplayName($valor['description']); $classProperty->setPrettyName($valor['description']); } /* if (array_key_exists('name', $valor)) { $classProperty->setNmPropertyName($valor['name']); } */ if (array_key_exists('url', $valor)) { $propSoftware->setUrlInfoAbout($valor['url']); } if (array_key_exists('version', $valor)) { $propSoftware->setDisplayVersion($valor['version']); } if (array_key_exists('publisher', $valor)) { $propSoftware->setPublisher($valor['publisher']); } // Persiste os objetos $em->persist($propSoftware); // Tem que adicionar isso aqui ou o Doctrine vai duplicar o software $em->flush(); } catch (ORMException $e) { // Reopen Entity Manager if (!$em->isOpen()) { // reset the EM and all alias $container = $this->container; $container->set('doctrine.orm.entity_manager', null); $container->set('doctrine.orm.default_entity_manager', null); } $logger->error("COLETA: Erro na inserçao de dados do software {$software}."); $logger->debug($e); return false; } catch (DBALException $e) { // Reopen Entity Manager if (!$em->isOpen()) { // reset the EM and all alias $container = $this->container; $container->set('doctrine.orm.entity_manager', null); $container->set('doctrine.orm.default_entity_manager', null); } $logger->error("COLETA: Erro impossível de software repetido para {$software}."); $logger->debug($e); return false; } return true; }
/** * Processa parâmetros da coleta de software * * @param $strNewClassValues * @param $arrCollectsDefClasses * @param $strCollectType * @param $strClassName */ public function coletaSoftware($strNewClassValues, $arrCollectsDefClasses, $strCollectType, $strClassName, $computador) { $logger = $this->get('logger'); // Primeiro preciso pegar todas as tags que forem software $arrSoftware = TagValueHelper::getSoftwareTags($strNewClassValues); // Agora insere cada registro de software individualmente foreach ($arrSoftware as $software) { // Armazeno todas as propriedades dessa classe enviadas pela requisição $arrTags = TagValueHelper::getTagsFromValues($software); // Crio um array multidimensional com as tags e os valores foreach ($arrTags as $tagNames) { // Essa função garante que só serão retornados caracteres com UTF8 Válido $texto = TagValueHelper::UTF8Sanitize(TagValueHelper::getValueFromTags($tagNames, $software)); $arrTagsNames[$tagNames] = $texto; } // Para software, cada identificador será uma propriedade $softwareName = $arrTagsNames['IDSoftware']; // Remove o IDSoftware do array unset($arrTagsNames['IDSoftware']); // Armazeno o IDSoftware como Propriedade $idClassProperty = $arrCollectsDefClasses[$strCollectType][$strClassName][$softwareName]['idClassProperty']; // Se o IDSoftware não existir, cria if (empty($idClassProperty)) { $logger->debug("Software {$softwareName} não encontrado. Adicionando um novo software"); // Pega o Id da classe $idClass = $this->getDoctrine()->getRepository('CacicCommonBundle:Classe')->findOneBy(array('nmClassName' => $strClassName)); $property = new ClassProperty(); $property->setNmPropertyName($softwareName); $property->setTePropertyDescription($arrTagsNames['DisplayName']); // Referência à classe $property->setIdClass($idClass); // Grava a propriedade nova $this->getDoctrine()->getManager()->persist($property); $this->getDoctrine()->getManager()->flush(); // Retorna o novo ID $idClassProperty = $property->getIdClassProperty(); } // Chama função que grava a propriedade $this->gerColsSetProperty('IDSoftware', $software, $idClassProperty, $computador); // Agora gravo todas as propriedades para o software na tabela propriedade_software $propriedadeSoftware = $this->getDoctrine()->getRepository('CacicCommonBundle:PropriedadeSoftware')->findOneBy(array('classProperty' => $idClassProperty, 'computador' => $computador)); $classPropertyObject = $this->getDoctrine()->getRepository('CacicCommonBundle:ClassProperty')->findOneBy(array('idClassProperty' => $idClassProperty)); if (empty($propriedadeSoftware)) { // Se não tiver nome coloco o ID Software no nome if (empty($arrTagsNames['DisplayName'])) { $nmSoftware = $softwareName; } else { $nmSoftware = $arrTagsNames['DisplayName']; } $softwareObject = $this->getDoctrine()->getRepository('CacicCommonBundle:Software')->findOneBy(array('nmSoftware' => $nmSoftware)); if (empty($softwareObject)) { $softwareObject = new Software(); // Se não tiver nome coloco o ID Software no nome if (empty($arrTagsNames['DisplayName'])) { $softwareObject->setNmSoftware($softwareName); } else { $softwareObject->setNmSoftware($arrTagsNames['DisplayName']); } // Grava software recém inserido $this->getDoctrine()->getManager()->persist($softwareObject); $this->getDoctrine()->getManager()->flush(); } // Depois adiciono as propriedades $propriedadeSoftware = new PropriedadeSoftware(); $propriedadeSoftware->setClassProperty($classPropertyObject); $propriedadeSoftware->setComputador($computador); // Ajusta valores coletados $propriedadeSoftware->setDisplayName($arrTagsNames['DisplayName']); $propriedadeSoftware->setDisplayVersion($arrTagsNames['DisplayVersion']); $propriedadeSoftware->setURLInfoAbout($arrTagsNames['URLInfoAbout']); $propriedadeSoftware->setSoftware($softwareObject); // Grava no banco de dados $this->getDoctrine()->getManager()->persist($propriedadeSoftware); $this->getDoctrine()->getManager()->flush(); } else { // Se não tiver nome coloco o ID Software no nome if (empty($arrTagsNames['DisplayName'])) { $nmSoftware = $softwareName; } else { $nmSoftware = $arrTagsNames['DisplayName']; } // Adiciona referência à tabela de softwares $softwareObject = $this->getDoctrine()->getRepository('CacicCommonBundle:Software')->findOneBy(array('nmSoftware' => $nmSoftware)); if (empty($softwareObject)) { $softwareObject = new Software(); // Se não tiver nome coloco o ID Software no nome if (empty($arrTagsNames['DisplayName'])) { $softwareObject->setNmSoftware($softwareName); } else { $softwareObject->setNmSoftware($arrTagsNames['DisplayName']); } // Grava software recém inserido $this->getDoctrine()->getManager()->persist($softwareObject); $this->getDoctrine()->getManager()->flush(); } // Ajusta valores coletados $propriedadeSoftware->setDisplayName($arrTagsNames['DisplayName']); $propriedadeSoftware->setDisplayVersion($arrTagsNames['DisplayVersion']); $propriedadeSoftware->setURLInfoAbout($arrTagsNames['URLInfoAbout']); $propriedadeSoftware->setSoftware($softwareObject); // Salva valor da coleta $this->getDoctrine()->getManager()->persist($propriedadeSoftware); $this->getDoctrine()->getManager()->flush(); } } }