예제 #1
0
        /// <summary>
        /// Importa o arquivo de log (insere os registros no banco de dados)
        /// </summary>
        private Boolean ImportFile(String fileName, Boolean createDigest)
        {
            Boolean result = false;

            try
            {
                // Caso os registros do arquivo não estejam no banco realiza a importação
                PrintLogPersistence logPersistence = new PrintLogPersistence(1, dataAccess.GetConnection(), this, createDigest);
                DateRange           dateRange      = new DateRange(true);
                DateTime?           fileDate       = PrintLogFile.GetDate(fileName);
                if (fileDate != null)
                {
                    // Verifica se existe alguma impressão na mesma data, considera o intervalo
                    // de um dia ( 23 horas e 59 minutos )
                    TimeSpan timeSpan = new TimeSpan(23, 59, 00);
                    dateRange.SetRange(fileDate.Value.Date, fileDate.Value.Date.Add(timeSpan));
                }
                if (!logPersistence.FileImported(dateRange))
                {
                    result = logPersistence.ImportFile(fileName);
                }
            }
            catch (Exception exc)
            {
                fileLogger.LogInfo("Exceção encontrada.");
                fileLogger.LogError(exc.Message);
                return(false);
            }

            return(result);
        }
예제 #2
0
        private Boolean ProcessPrintLogFile(String fileName, PrintLogSender printLogSender)
        {
            // Informações de trace são enviadas ao listener através de NotifyListener()
            // O listener grava essas informações em log de arquivo
            CSVReader reader = new CSVReader(fileName, listener);

            NotifyListener("Fazendo a leitura do CSV.");
            DataTable fullTable = reader.Read();
            int       rowCount  = fullTable.Rows.Count;

            // Verifica se existem registros no CSV
            if (rowCount < 1)
            {
                NotifyListener("CSV inválido. Nenhum registro encontrado.");
                return(false);
            }

            // Informa a quantidade de registros no CSV e uma amostra de seu conteúdo
            NotifyListener("Quantidade de registros no CSV - " + rowCount);
            String sampleData = fullTable.Rows[0]["Time"].ToString() + " - " +
                                fullTable.Rows[0]["Document Name"].ToString();

            NotifyListener("Amostra dos dados - " + sampleData);

            // Gera uma view do log com uma faixa de horário
            String    startHour            = DateTime.Now.AddHours(-1).ToString("yyyy-MM-dd HH:mm:ss");
            String    endHour              = DateTime.Now.AddHours(+1).ToString("yyyy-MM-dd HH:mm:ss");
            String    rowFilter            = "Time > '" + startHour + "' AND Time < '" + endHour + "'";
            DataView  view                 = new DataView(fullTable, rowFilter, null, DataViewRowState.Added);
            DataTable printedDocumentTable = view.ToTable();

            // Cria arquivo que armazenará resumo dos trabalhos de impressão
            DateTime?      fileDate = PrintLogFile.GetDate(fileName);
            PrintLogDigest digest   = new PrintLogDigest();

            digest.Create(fileDate);

            PrintedDocument printedDocument;

            foreach (DataRow row in printedDocumentTable.Rows)
            {
                printedDocument             = new PrintedDocument();
                printedDocument.tenantId    = tenantId;
                printedDocument.jobTime     = DateTime.Parse(row["Time"].ToString());
                printedDocument.userName    = row["User"].ToString();
                printedDocument.printerName = row["Printer"].ToString();
                printedDocument.name        = row["Document Name"].ToString();
                printedDocument.pageCount   = int.Parse(row["Pages"].ToString());
                printedDocument.copyCount   = int.Parse(row["Copies"].ToString());
                printedDocument.duplex      = ConvertToBool(row["Duplex"].ToString());
                printedDocument.color       = !ConvertToBool(row["Grayscale"].ToString());

                printLogSender.AddPrintedDocument(printedDocument);
                digest.AddToDigest(printedDocument, row["Language"].ToString(), row["Size"].ToString());
            }

            return(true);
        }
예제 #3
0
        /// <summary>
        /// Importa os registros do arquivo de log(.CSV) e insere no banco de dados
        /// </summary>
        public Boolean ImportFile(String fileName)
        {
            DateTime?fileDate = PrintLogFile.GetDate(fileName);

            // Informações de trace são enviadas ao listener através de NotifyListener()
            // O listener grava essas informações em log de arquivo
            CSVReader reader = new CSVReader(fileName, listener);

            NotifyListener("Fazendo a leitura do CSV.");
            DataTable printedDocumentTable = reader.Read();
            int       rowCount             = printedDocumentTable.Rows.Count;

            // Verifica se existem registros no CSV
            if (rowCount < 1)
            {
                NotifyListener("CSV inválido. Nenhum registro encontrado.");
                return(false);
            }

            // Informa a quantidade de registros no CSV e uma amostra de seu conteúdo
            NotifyListener("Quantidade de registros no CSV - " + rowCount);
            String sampleData = printedDocumentTable.Rows[0]["Time"].ToString() + " - " +
                                printedDocumentTable.Rows[0]["Document Name"].ToString();

            NotifyListener("Amostra dos dados - " + sampleData);

            PrintedDocumentDAO printedDocumentDAO = new PrintedDocumentDAO(sqlConnection);

            CreateDigest(fileDate);

            PrintedDocument printedDocument;

            foreach (DataRow row in printedDocumentTable.Rows)
            {
                printedDocument             = new PrintedDocument();
                printedDocument.tenantId    = tenantId;
                printedDocument.jobTime     = DateTime.Parse(row["Time"].ToString());
                printedDocument.userName    = row["User"].ToString();
                printedDocument.printerName = row["Printer"].ToString();
                printedDocument.name        = row["Document Name"].ToString();
                printedDocument.pageCount   = int.Parse(row["Pages"].ToString());
                printedDocument.copyCount   = int.Parse(row["Copies"].ToString());
                printedDocument.duplex      = ConvertToBool(row["Duplex"].ToString());
                printedDocument.color       = !ConvertToBool(row["Grayscale"].ToString());

                printedDocumentDAO.InsertPrintedDocument(printedDocument);
                AddToDigest(printedDocument, row["Language"].ToString(), row["Size"].ToString());
            }

            return(true);
        }
예제 #4
0
        public PrintLogSorter(String logPath)
        {
            DirectoryInfo dirInfo = new DirectoryInfo(logPath);

            foreach (FileInfo fileInfo in dirInfo.GetFiles())
            {
                String fileName = fileInfo.Name;
                int?   fileID   = PrintLogFile.GetToken(fileName);

                if (fileID != null)
                {
                    fileList.Add(fileID.Value, fileName);
                }
            }
        }
예제 #5
0
        /// <summary>
        /// Importa a massa de dados existente no diretório de logs
        /// </summary>
        private void ImportPreviousLogs(String logDirectory)
        {
            PrintLogSorter logSorter = new PrintLogSorter(logDirectory);

            String[] logFiles     = logSorter.GetOrderedFiles();
            DateTime?lastFileDate = null;

            // Importa os arquivos encontrados no diretório de log
            fileLogger.LogInfo("Importando logs pré-existentes no diretório " + logDirectory);
            foreach (String file in logFiles)
            {
                DateTime?fileDate = PrintLogFile.GetDate(file); // considera hora como sendo 00:00:00
                DateTime?today    = DateTime.Now.Date;          // considera hora como sendo 00:00:00

                // Importa todos com exceção do arquivo com as impressões de hoje, faz isso no final do dia
                if ((fileDate != null) && (fileDate != today))
                {
                    String fileName = PathFormat.Adjust(logDirectory) + file;
                    // Loga informações sem profundidade, para não sobrecarregar/poluir o arquivo de logs. Apenas
                    // em caso de falha acrescenta detalhes (processa as notificações)
                    fileLogger.LogInfo("Importando arquivo " + Path.GetFileName(fileName));
                    notifications.Clear();

                    Boolean imported = ImportFile(fileName, false);
                    if (!imported) // Falha ao importar o log
                    {
                        // São gravados logs detalhados para que se possa determinar a causa da falha
                        ProcessNotifications();
                        return;
                    }
                    lastFileDate = fileDate;
                }
            }

            // Grava a data do último acesso (baseada na data do último arquivo)
            if (lastFileDate != null)
            {
                PrintLogAccess printLogAccess = new PrintLogAccess(dataAccess.GetConnection());
                printLogAccess.SetLastAccess(lastFileDate.Value.AddDays(1));
            }
        }
예제 #6
0
        public Boolean SendPrintJobs(String logDirectories)
        {
            Boolean        success        = true;
            DateTime       today          = DateTime.Now.Date;
            PrintLogSender printLogSender = new PrintLogSender(serviceUrl, listener);

            String[] directoryArray = logDirectories.Split(new Char[] { ';' });
            foreach (String directory in directoryArray)
            {
                DirectoryInfo logDir   = new DirectoryInfo(directory);
                String        fileName = null;
                if (logDir.Exists)
                {
                    fileName = PrintLogFile.MountName(directory, today.Day, today.Month, today.Year);
                    FileInfo logFile = new FileInfo(fileName);
                    if (!logFile.Exists)
                    {
                        fileName = null;
                    }
                }

                // Se o arquivo existe, processa seu conteúdo
                if (!String.IsNullOrEmpty(fileName))
                {
                    // Informa dados do arquivo
                    NotifyListener("Arquivo - fileName = " + fileName);

                    if (!ProcessPrintLogFile(fileName, printLogSender))
                    {
                        success = false; // Falha ao processar o arquivo .CSV
                    }
                }
            }

            if (!printLogSender.FinishSending())
            {
                success = false; // Falha ao enviar algum pacote de logs
            }
            return(success);
        }
예제 #7
0
        public void Execute()
        {
            // Verifica se as dependências foram instanciadas (se o método InitializeTaskState foi chamado)
            if (taskParams == null)
            {
                return;
            }
            if (dataAccess == null)
            {
                return;
            }
            if (notifications == null)
            {
                return;
            }
            if (fileLogger == null)
            {
                return;
            }

            // Verifica os parâmetros recebidos
            String  logDirectory       = taskParams["logDirectory"];
            Boolean importPreviousLogs = Boolean.Parse(taskParams["importPreviousLogs"]);

            dataAccess.OpenConnection();

            // "lastAccess" é gravado e recuperado do banco com frequência, logo não pode ser obtido de "taskParams"
            PrintLogAccess printLogAccess = new PrintLogAccess(dataAccess.GetConnection());
            DateTime       lastAccess     = printLogAccess.GetLastAccess();

            // Importa a massa de dados existente
            if ((importPreviousLogs) && (firstExecution))
            {
                ImportPreviousLogs(logDirectory);
                firstExecution = false;
                dataAccess.CloseConnection();
                return;
            }

            // Procura pelo arquivo do último dia trabalhado
            String fileName = PrintLogFile.GetLastFile(logDirectory);

            if (fileName == null)
            {
                // Não processa (sai do método) se não achou o arquivo
                dataAccess.CloseConnection();
                return;
            }

            // Compara a data do arquivo com a data do último acesso
            DateTime?fileDate = PrintLogFile.GetDate(fileName);

            if ((fileDate == null) || (fileDate.Value.CompareTo(lastAccess) < 0))
            {
                // Não processa (sai do método) se o arquivo já foi processado
                dataAccess.CloseConnection();
                return;
            }

            // Inicia o append no arquivo de log (acrescentando o "startingDelimiter")
            fileLogger.LogInfo("Importação de log - Iniciando execução...", true);
            // Informa dados do arquivo
            fileLogger.LogInfo("Arquivo - fileName = " + fileName);
            fileLogger.LogInfo("Data - fileDate = " + fileDate.Value.ToShortDateString());
            notifications.Clear();
            // Persiste os registros do arquivo de log
            Boolean imported = ImportFile(fileName, true);

            ProcessNotifications();
            fileLogger.LogInfo("Execução concluída.");

            // Grava a data do último acesso no banco
            if (imported)
            {
                printLogAccess.SetLastAccess(DateTime.Now);
            }

            dataAccess.CloseConnection();
        }