コード例 #1
0
        /// <summary>
        /// Lê o arquivo de exportação e salva as ferragens contidas nele.
        /// </summary>
        public SaveResult Importar(byte[] arquivo, bool substituirFerragemExistente)
        {
            #region Declaração de variáveis

            // Variável onde será salvo o resultado da importação do arquivo de exportação de ferragem.
            var resultadoImportacao = new ResultadoImportacao();
            // Variável onde será criado o texto de retorno da importação, com as ferragens que foram ou não importadas.
            var retornoImportacao = string.Empty;

            #endregion

            #region Tradução e inserção dos dados de exportação

            try
            {
                // Descompacta e deserializa os dados do arquivo de exportação.
                // Insere, no WebGlass, as ferragens informadas no arquivo de exportação.
                resultadoImportacao = SalvarItens(Deserializar(Arquivos.Descompactar(arquivo)).Itens, substituirFerragemExistente);
            }
            catch (Exception ex)
            {
                throw new Exception("Não foi possível importar o arquivo. Verifique se é um arquivo válido de ferragens do WebGlass.", ex);
            }

            #endregion

            #region Retorno do resultado importação

            // Verifica se alguma ferragem não foi importadas.
            if (resultadoImportacao.FerragensNaoImportadas.Count > 0)
            {
                // Caso alguma ferragem tenha sido importadas, informa o nome delas na mensagem de erro, junto com o nome das ferragens que não foram importadas.
                if (resultadoImportacao.FerragensImportadas.Count > 0)
                {
                    retornoImportacao = $@"Algumas ferragens não foram importadas. Verifique se elas já existem.
                        \nFerragens importadas: { string.Join(", ", resultadoImportacao.FerragensImportadas) }
                        \nFerragens não importadas: { string.Join(", ", resultadoImportacao.FerragensNaoImportadas) }
                        \n{ string.Join(", ", resultadoImportacao.MensagensErro) }";
                }
                // Monta uma mensagem de erro informando quais ferragens não foram importadas.
                else
                {
                    retornoImportacao = $@"Não foi possível importar as ferragens.
                        \nFerragens não importadas: { string.Join(", ", resultadoImportacao.FerragensNaoImportadas) }
                        \n{ string.Join(", ", resultadoImportacao.MensagensErro) }";
                }

                return(new SaveResult(false, retornoImportacao.GetFormatter()));
            }
            // Salva uma mensagem de sucesso, informando o nome das ferragens importadas.
            else
            {
                retornoImportacao = $"Importação realizada com sucesso! Ferragens importadas: { string.Join(", ", resultadoImportacao.FerragensImportadas) }.";
                return(new SaveResult(true, retornoImportacao.GetFormatter()));
            }

            #endregion
        }
コード例 #2
0
        /// <summary>
        /// Método criado para a importação da ferragem. Insere as ferragens do arquivo, no WebGlass.
        /// </summary>
        private static ResultadoImportacao SalvarItens(List <ExportarFerragem.Item> itens, bool substituirFerragemExistente)
        {
            #region Declaração de variáveis

            var ferragemFluxo                  = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <IFerragemFluxo>();
            var ferragemId                     = new List <Tuple <int, Entidades.Ferragem> >();
            var fabricanteFerragemId           = new List <Tuple <int, Entidades.FabricanteFerragem> >();
            var fabricantesFerragemInseridos   = new List <Entidades.FabricanteFerragem>();
            var repositorioImagemFerragem      = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <Entidades.IFerragemRepositorioImagens>();
            var repositorioCalcPackageFerragem = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance <Entidades.IFerragemRepositorioCalcPackage>();
            var resultadoImportacao            = new ResultadoImportacao();

            #endregion

            #region Recuperação dos objetos que devem ser atualizados ao invés de serem inseridos

            // Caso as ferragens devam ser substituídas, busca todas as ferragens, do arquivo de exportação, que existem no sistema de importação.
            if (substituirFerragemExistente)
            {
                // Recupera todas as ferragens, do sistema atual, com base no nome delas e no nome do fabricante associado.
                ferragemId = SourceContext.Instance.CreateQuery()
                             .Select("f.IdFerragem, f.Nome, f.IdFabricanteFerragem")
                             .From <Ferragem>("f")
                             .Where(string.Join(" OR ", itens?.Select(f => string.Format("f.Nome='{0}'", f.Ferragem.Nome))))
                             // Seleciona os IDs de ferragem do arquivo de exportação, junto com as entidades de ferragens (correspondentes) no sistema de importação.
                             .Execute()?.Select(f => new Tuple <int, Entidades.Ferragem>((itens.FirstOrDefault(g => g.Ferragem.Nome == f.GetString(1))?.Ferragem.IdFerragem).GetValueOrDefault(),
                                                                                         ferragemFluxo.ObterFerragem(f.GetInt32(0)))).Distinct().ToList();
            }

            // O fabricante deve ser sempre atualizado, caso exista no sistema de importação. Independentemente da existência da ferragem.
            if (itens.Any(f => f.FabricanteFerragem?.IdFabricanteFerragem > 0))
            {
                // No sistema onde o arquivo está sendo importado, recupera os fabricantes que possuem o mesmo nome dos fabricantes inseridos no arquivo de exportação.
                fabricanteFerragemId = SourceContext.Instance.CreateQuery()
                                       .Select("ff.IdFabricanteFerragem, ff.Nome")
                                       .From <FabricanteFerragem>("ff")
                                       .Where(string.Join(" OR ", itens?.Select(f => string.Format("ff.Nome='{0}'", f.FabricanteFerragem.Nome))))
                                       // Seleciona os IDs de fabricante de ferragem do arquivo de exportação, junto com as entidades de fabricantes de ferragens (correspondentes) no sistema de importação.
                                       .Execute()?.Select(f => new Tuple <int, Entidades.FabricanteFerragem>((itens.FirstOrDefault(g => g.FabricanteFerragem.Nome == f.GetString(1))?.FabricanteFerragem.IdFabricanteFerragem).GetValueOrDefault(),
                                                                                                             ferragemFluxo.ObterFabricanteFerragem(f.GetInt32(0)))).Distinct().ToList();
            }

            #endregion

            // Percorre cada item, do arquivo de exportação, e os insere no sistema.
            for (var i = 0; i < itens.Count(); i++)
            {
                try
                {
                    #region Declaração de variáveis

                    // Entidade de ferragem.
                    Entidades.Ferragem ferragem = null;
                    // Entidade de fabricante de ferragem.
                    Entidades.FabricanteFerragem fabricanteFerragem = null;

                    #endregion

                    #region Recuperação/criação da ferragem

                    // Verifica se a ferragem existe no sistema atual.
                    if (ferragemId != null && ferragemId.Any(f => f.Item1 == itens[i].Ferragem.IdFerragem))
                    {
                        ferragem = ferragemId.FirstOrDefault(f => f.Item1 == itens[i].Ferragem.IdFerragem).Item2;
                    }
                    // Cria uma nova ferragem.
                    else
                    {
                        ferragem = ferragemFluxo.CriarFerragem();
                    }

                    #region Propriedades ferragem

                    // Define/atualiza os dados da ferragem, com base no arquivo de importação.
                    ferragem.Altura           = itens[i].Ferragem.Altura;
                    ferragem.EstiloAncoragem  = itens[i].Ferragem.EstiloAncoragem;
                    ferragem.Largura          = itens[i].Ferragem.Largura;
                    ferragem.MedidasEstaticas = itens[i].Ferragem.MedidasEstaticas;
                    ferragem.Nome             = itens[i].Ferragem.Nome;
                    ferragem.PodeEspelhar     = itens[i].Ferragem.PodeEspelhar;
                    ferragem.PodeRotacionar   = itens[i].Ferragem.PodeRotacionar;
                    ferragem.Situacao         = itens[i].Ferragem.Situacao;
                    ferragem.UUID             = itens[i].Ferragem.UUID;

                    #endregion

                    #region Fabricante ferragem

                    // Verifica se o fabricante existe no sistema atual.
                    if (fabricanteFerragemId?.Any(f => f.Item1 == itens[i].FabricanteFerragem.IdFabricanteFerragem) ?? false)
                    {
                        // Recupera o fabricante. Os dados não devem ser atualizados.
                        fabricanteFerragem = fabricanteFerragemId.FirstOrDefault(f => f.Item1 == itens[i].FabricanteFerragem.IdFabricanteFerragem).Item2;
                    }
                    else if (fabricantesFerragemInseridos.Any(f => f.Nome.ToLowerInvariant() == itens[i].FabricanteFerragem.Nome.ToLowerInvariant()))
                    {
                        fabricanteFerragem = fabricantesFerragemInseridos.FirstOrDefault(f => f.Nome.ToLowerInvariant() == itens[i].FabricanteFerragem.Nome.ToLowerInvariant());
                    }
                    else
                    {
                        // Cria um novo fabricante.
                        fabricanteFerragem       = new Entidades.FabricanteFerragem();
                        fabricanteFerragem.Nome  = itens[i].FabricanteFerragem.Nome;
                        fabricanteFerragem.Sitio = itens[i].FabricanteFerragem.Sitio;

                        // Insere/atualiza o fabricante.
                        var retornoFabricanteFerragem = ferragemFluxo.SalvarFabricanteFerragem(fabricanteFerragem);

                        // Caso ocorra algum erro na atualização do fabricante, a ferragem não deve ser inserida.
                        if (!retornoFabricanteFerragem)
                        {
                            throw new Exception(retornoFabricanteFerragem.Message.ToString());
                        }
                        else
                        {
                            fabricantesFerragemInseridos.Add(fabricanteFerragem);
                        }
                    }

                    // Atualiza a referência do fabricante na ferragem.
                    ferragem.IdFabricanteFerragem = fabricanteFerragem.IdFabricanteFerragem;

                    #endregion

                    #region Código ferragem

                    // Caso a ferragem exista e esteja sendo atualizada, os códigos devem ser removidos e adicionados novamente.
                    ferragem.Codigos.Clear();

                    // Seta os códigos da ferragem.
                    for (var j = 0; j < itens[i].CodigosFerragem.Count(); j++)
                    {
                        var codigoFerragem = new Entidades.CodigoFerragem();
                        codigoFerragem.IdFerragem = ferragem.IdFerragem;
                        codigoFerragem.Codigo     = itens[i].CodigosFerragem[j].Codigo;

                        ferragem.Codigos.Add(codigoFerragem);
                    }

                    #endregion

                    #region Constante ferragem

                    // Caso a ferragem exista e esteja sendo atualizada, as constantes devem ser removidas e adicionadas novamente.
                    ferragem.Constantes.Clear();

                    // Seta as constantes da ferragem.
                    for (var j = 0; j < itens[i].ConstantesFerragem.Count(); j++)
                    {
                        var constanteFerragem = new Entidades.ConstanteFerragem();
                        constanteFerragem.IdFerragem = ferragem.IdFerragem;
                        constanteFerragem.Nome       = itens[i].ConstantesFerragem[j].Nome;
                        constanteFerragem.Valor      = itens[i].ConstantesFerragem[j].Valor;

                        ferragem.Constantes.Add(constanteFerragem);
                    }

                    #endregion

                    #endregion

                    #region Inserção da imagem

                    // Verifica se a ferragem exportada possui imagem.
                    if (itens[i].ImagemFerragem != null)
                    {
                        EventHandler <Colosoft.Business.EntitySavedEventArgs> ferragemSalva = null;
                        var imagemStream = new MemoryStream(itens[i].ImagemFerragem, 0, itens[i].ImagemFerragem.Length);

                        ferragemSalva = (sender, args) =>
                        {
                            try
                            {
                                // Salva a imagem da ferragem.
                                repositorioImagemFerragem.SalvarImagem(ferragem.IdFerragem, imagemStream);
                            }
                            finally
                            {
                                ferragem.Saved -= ferragemSalva;
                            }
                        };

                        ferragem.Saved += ferragemSalva;
                    }

                    #endregion

                    #region Inserção do arquivo CalcPackage

                    if (itens[i].ArquivoCalcPackage != null)
                    {
                        CalcEngine.Dxf.DxfProject      projeto = null;
                        CalcEngine.ProjectFilesPackage pacote  = null;

                        using (Stream pacoteStream = new MemoryStream(itens[i].ArquivoCalcPackage, 0, itens[i].ArquivoCalcPackage.Length))
                        {
                            pacote = CalcEngine.ProjectFilesPackage.LoadPackage(pacoteStream);
                        }

                        try
                        {
                            projeto = CalcEngine.Dxf.DxfProject.LoadFromPackage(pacote);
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(string.Format("Não foi possível carregar os dados do arquivo da ferragem de ID {0}.", itens[i].Ferragem.IdFerragem), ex);
                        }

                        EventHandler <Colosoft.Business.EntitySavedEventArgs> ferragemSalva = null;

                        // Configura o método anonimo para ser acionado quando os dados da ferragem forem salvos
                        ferragemSalva = (sender, args) =>
                        {
                            try
                            {
                                using (var stream = new MemoryStream())
                                {
                                    // Cria o pacote para onde serão salvo os dados do CalcPackage
                                    var package = CalcEngine.ProjectFilesPackage.CreatePackage(stream, false);
                                    projeto.Save(package);
                                    package.Close();

                                    stream.Position = 0;

                                    // Salva os dados no repositório das ferragens
                                    repositorioCalcPackageFerragem.SalvarCalcPackage(ferragem.IdFerragem, stream);
                                }
                            }
                            finally
                            {
                                ferragem.Saved -= ferragemSalva;
                            }
                        };

                        ferragem.Saved += ferragemSalva;
                    }

                    #endregion

                    #region Inserção da ferragem

                    // Insere/atualiza a ferragem.
                    var retornoSalvarFerragem = ferragemFluxo.SalvarFerragem(ferragem);

                    if (!retornoSalvarFerragem)
                    {
                        throw new Exception(retornoSalvarFerragem.Message.ToString());
                    }

                    #endregion

                    // Salva, na variável de retorno, o nome da ferragem importada.
                    resultadoImportacao.FerragensImportadas.Add(itens[i].Ferragem.Nome);
                }
                catch (Exception ex)
                {
                    // Salva, na variável de retorno, o nome da ferragem não importada e a mensagem de erro.
                    resultadoImportacao.FerragensNaoImportadas.Add(itens[i].Ferragem.Nome);
                    resultadoImportacao.MensagensErro.Add(ex.Message);

                    ErroDAO.Instance.InserirFromException(HttpContext.Current != null ? HttpContext.Current.Request.Url.ToString() : null, ex);
                }
            }

            return(resultadoImportacao);
        }