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;
 }