/** * MailArchiver is an application that provides services for storing and managing e-mail messages through a Web Services SOAP interface. * Copyright (C) 2012 Marcio Andre Scholl Levien and Fernando Alberto Reuter Wendt and Jose Ronaldo Nogueira Fonseca Junior * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ /******************************************************************************\ * * This product was developed by * * SERVIÇO FEDERAL DE PROCESSAMENTO DE DADOS (SERPRO), * * a government company established under Brazilian law (5.615/70), * at Department of Development of Porto Alegre. * \******************************************************************************/ package serpro.mailarchiver.util.bshcommands; import java.nio.file.Files; import java.nio.file.Path; import java.sql.SQLException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import bsh.CallStack; import bsh.Interpreter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import com.vaadin.data.Property; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.CheckBox; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.OptionGroup; import com.vaadin.ui.Panel; import com.vaadin.ui.PasswordField; import com.vaadin.ui.ProgressIndicator; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.Window.Notification; import serpro.mailarchiver.service.Settings; import serpro.mailarchiver.service.dto.TFolder; import serpro.mailarchiver.service.dto.TMessage; import serpro.mailarchiver.service.web.ArchiveServices; import serpro.mailarchiver.service.web.ServiceFault; import serpro.mailarchiver.util.Browser; import serpro.mailarchiver.util.GearsUtil; import serpro.mailarchiver.util.Logger; import serpro.mailarchiver.util.Sqlite; import serpro.mailarchiver.util.SystemAccount; import serpro.mailarchiver.util.SystemAuthenticator; import serpro.mailarchiver.view.admin.AdminConsoleApp; @Configurable public class importGears { private static final Logger log = Logger.getLocalLogger(); @Autowired private SystemAuthenticator sysAuth; @Autowired private Settings settings; @Autowired private ArchiveServices archiveServices; private Window window = new Window("MailArchiver ImportGears"); private GearsArchive gearsArchive = null; private LoginPanel loginPanel; private PanelWindow1 panel1; private PanelWindow2 panel2; private PanelWindow3 panel3; private PanelWindow4 panel4; private PanelWindow5 panel5; private PanelWindow6 panel6; private PanelWindow7 panel7; private ThreadSearch search; private ThreadValidateWindow validate; private ThreadArchiverWindow archiverWindow; private ThreadArchiverProcess archiverProcess; private ThreadValidateProcess archiverValidateProcess; private boolean reImporter = false; public static void invoke(final Interpreter interpreter, final CallStack callstack) { // System.out.println("importGears.invoke sendo executado... "); log.debug("importGears.invoke sendo executado... "); new importGears().init(); } private void init() { gearsArchive = new GearsArchive(); //apenas para inicializar a tela principal panel1 = new PanelWindow1(); window.setHeight("300px"); window.setWidth("600px"); window.setPositionY(110); final VerticalLayout layout = (VerticalLayout) window.getContent(); //painel que representa a tela inicial do aplicativo layout.addComponent(panel1.getPanel()); AdminConsoleApp.getInstance().getMainWindow().addWindow(window); } //classe para manipulação de arquivamentos do google gears public class GearsArchive { private String userId = null; private String sessionId = null; private boolean inProcess = true; private boolean validate = true; private String currentInportMessageSubject = new String(); private Integer currentValidInportMessageNumber = 0; private Integer totalMessages = 0; private Integer totalValidMessages = 0; private Integer totalFailMessages = 1; private Double percentProgress = new Double("00.00"); private List listGearsBrowserArchives = new ArrayList(); private Map> validDatabasePaths = new HashMap>(); private Set listSelectedGearsBrowserArchives = new HashSet(); private String mailArchiveId = null; private SystemAccount account = null; public List getListGearsBrowserArchives() { return listGearsBrowserArchives; } public void setListGearsBrowserArchives(List listGearsBrowserArchives) { this.listGearsBrowserArchives = listGearsBrowserArchives; } public Set getListSelectedGearsBrowserArchives() { return listSelectedGearsBrowserArchives; } public void setListSelectedGearsBrowserArchives(Set listSelectedGearsBrowserArchives) { this.listSelectedGearsBrowserArchives = listSelectedGearsBrowserArchives; } public Map> getValidDatabasePaths() { return validDatabasePaths; } public void setValidDatabasePaths(Map> validDatabasePaths) { this.validDatabasePaths = validDatabasePaths; } public GearsArchive() { //id do destino de importação mailArchiveId = settings.get("dbid"); //carrega o sessionId sessionId = AdminConsoleApp.getInstance().getSession().getSessionId(); //carrega user logado ao mailarchiver userId = AdminConsoleApp.getInstance().getSession().getUserId().substring(0, 9); } private boolean authenticateUserOs(String userOs, String passwdOs, String domain){ account = sysAuth.authenticate(userOs, passwdOs); if(account != null) { return true; } return false; } private void configureGearsPaths() { //listagem dos arquivamentos válidos encontrados // System.out.println("importGears.configureGearsPaths sendo executado... "); log.debug("importGears.configureGearsPaths sendo executado... "); //armazena os arquivamentos descobertos localmente por browser List browserArchivePaths = new ArrayList(); try{ Path chromeGearsPath = account.getGearsPath(Browser.Chrome); if((chromeGearsPath != null) && (Files.isReadable(chromeGearsPath))) { browserArchivePaths.add(chromeGearsPath.toString()); } else { // log.warn("O diretório padrão do Google Gears para o navegador Chrome não existe ou o MailArchive não tem permissões sobre a localização do mesmo."); } Path firefoxGearsPath = account.getGearsPath(Browser.Firefox); if((firefoxGearsPath != null) && (Files.isReadable(firefoxGearsPath))) { browserArchivePaths.add(firefoxGearsPath.toString()); } else { log.warn("O diretório padrão do Google Gears para o navegador Firefox não existe ou o MailArchive não tem permissões sobre a localização do mesmo."); } Path internetExplorerGearsPath = account.getGearsPath(Browser.InternetExplorer); if((internetExplorerGearsPath != null) && (Files.isReadable(internetExplorerGearsPath))) { browserArchivePaths.add(internetExplorerGearsPath.toString()); } else { log.warn("O diretório padrão do Google Gears para o navegador Internet Explorer não existe ou o MailArchive não tem permissões sobre a localização do mesmo."); } } catch (Exception e) { log.error("Falha na identificação do perfil do usuário junto ao navegador: diretório de dados do Gears não localizado para as credencias de sistema informados!"); } finally{ for(String pathStr : browserArchivePaths) { validateDatabasePaths(pathStr); } } log.debug("importGears.configureGearsPaths sendo finalizado... "); } // valida as estruturas de arquivamento por browser a adiciona aos validDatabasePaths // valida a permissão de acesso do usuário logado ao expresso private void validateDatabasePaths(String browserArchivePath) { List databaseFilePaths = new ArrayList(); Sqlite.getInstance().setBrowserArchiverPath(browserArchivePath); Iterator databasePaths = Sqlite.getInstance().listDatabasePaths().values().iterator(); while(databasePaths.hasNext()) { List databasePathValues = (List) databasePaths.next(); for(String databasePath : databasePathValues) { if(databasePath != null && !databasePath.isEmpty()) { // testa a permissão de usuário if(Sqlite.getInstance().isExpressoDatabase(databasePath) && Sqlite.getInstance().isUserDatabase(databasePath, userId)) { databaseFilePaths.add(databasePath); //para listagem da tela listGearsBrowserArchives.add(browserArchivePath); } } } } //armazena os database válidos por raiz de arquivamento gears validDatabasePaths.put(browserArchivePath, databaseFilePaths); } // contabiliza o número total de emails passíveis de importação pelo MailArchiver // a contagem será efetuada após a seleção de arquivamentos pelo usr public void setTotalMessages() { totalMessages = 0; Iterator validPaths = validDatabasePaths.keySet().iterator(); while(validPaths.hasNext()) { String browserArchivePath = validPaths.next().toString(); if(listSelectedGearsBrowserArchives.contains(browserArchivePath)) { List databaseFilePaths = validDatabasePaths.get(browserArchivePath); // contabiliza email para o databasePath corrente for(String databasePath : databaseFilePaths) { totalMessages += Sqlite.getInstance().getTotalMessages(databasePath, mailArchiveId, userId); // System.out.println("Número de mensagens encontradas..: " + totalMessages); log.debug("Número de mensagens encontradas..: " + totalMessages); } } } } // grava dados de msgs aptas a importação pelo mailarchiver na table archive_importer // o método ArchiveServices.archive utilizará as informações salvas nesta tabela private void preArchiveMessages() { // System.out.println("importGears.preArchiveMessages sendo executado... "); log.debug("importGears.preArchiveMessages sendo executado... "); Date startArchiverDate = new Date(); Integer currentMessageNumber = 0; System.out.println("PROCESSO DE ARQUIVAMENTO GEARS INICIANDO EM..: " + new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(startArchiverDate)); System.out.println("USUÁRIO LOGADO..: " + userId); log.debug("PROCESSO DE ARQUIVAMENTO GEARS INICIANDO EM..: " + new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(startArchiverDate)); log.debug("USUÁRIO LOGADO..: " + userId); //contabiliza o total de msgs a serem analisadas para posteior importação pelo MailArchiver setTotalMessages(); Iterator selectedArchivePaths = listSelectedGearsBrowserArchives.iterator(); while(selectedArchivePaths.hasNext() && validate) { String browserSelectedArchivePath = selectedArchivePaths.next().toString(); Sqlite.getInstance().setBrowserArchiverPath(browserSelectedArchivePath); if(validDatabasePaths.containsKey(browserSelectedArchivePath)) { Iterator databasePaths = validDatabasePaths.get(browserSelectedArchivePath).iterator(); // começa o pré-arquivamento por databasePath while(databasePaths.hasNext() && validate) { String databasePath = databasePaths.next().toString(); if(reImporter) { //atualiza tabela de controle para possibilitar re-importação do databasePath corrente // System.out.println("Atualizando tabela de controle para re-importação."); try { Sqlite.getInstance().deleteMessageParameters(databasePath, mailArchiveId, userId); //re-contabiliza as msgs a serem analisadas setTotalMessages(); } catch(SQLException ex) { log.error("Falha no processo de deleção de parâmetros de mensagens referente ao MailArChiveId..: " + mailArchiveId, null, ex); } } // carrega listagem de folders Iterator folders = Sqlite.getInstance().listFolders(databasePath, userId).iterator(); while(folders.hasNext() && validate) { String folder = (String) folders.next(); // carrega as mensagens que ainda não foram importadas - teste pelo mailArchiveId // a chave é o mail id e o value eh um map com subject de chave e mail serializado como value Map> messages = Sqlite.getInstance().listMessages(databasePath, folder, mailArchiveId, userId); // caso 1 - primeiro arquivamento // executa pre-archiver if(!messages.isEmpty()) { Iterator messagesIds = messages.keySet().iterator(); while(messagesIds.hasNext() && validate) { String messageId = messagesIds.next().toString(); currentMessageNumber++; //contador de mensagens passíveis de importação Map messageValues = messages.get(messageId); Iterator messageValuesIterator = messageValues.keySet().iterator(); while(messageValuesIterator.hasNext()) { // parametro carregado apenas para identificação de mensagem não importada na log String messageSubject = messageValuesIterator.next().toString(); String urlExportFile = GearsUtil.unserializeUrlEntries(messageValues.get(messageSubject).toString()); String urlFilePath = null; try { urlFilePath = Sqlite.getInstance().getResponseBodiesFilePath(urlExportFile); } catch(SQLException ex) { // grava ocorrência de mensagem com erro no log de usuário GearsUtil.writeInUserLogFile("FolderName..: " + folder + " Message Subject..: " + messageSubject, totalFailMessages++); log.error("FolderName..: " + folder); log.error("Message subject.: " + messageSubject); log.error("Não foram encontradas ocorrências de filePath para a url " + urlExportFile + " na table localserver.entries", ex); } if(urlFilePath != null) { // System.out.println("UrlFilePath..: " + urlFilePath); log.debug("UrlFilePath..: " + urlFilePath); String messageFilePath = GearsUtil.loadFilePaths(browserSelectedArchivePath, urlFilePath); // System.out.println("MessageFilePath..: " + messageFilePath); log.debug("MessageFilePath..: " + messageFilePath); if(messageFilePath != null) { try { Sqlite.getInstance().insertMessageParameters(databasePath, folder, messageId, mailArchiveId, messageFilePath, userId); currentValidInportMessageNumber++; } catch(SQLException ex) { // grava ocorrência de mensagem com erro no log de usuário GearsUtil.writeInUserLogFile("FolderName..: " + folder + " Message Subject..: " + messageSubject, totalFailMessages++); log.error("FolderName..: " + folder); log.error("Message subject.: " + messageSubject); log.error("Falha na inserção do registro de controle referente a mensagem de mailId.: " + messageId, ex); } } else {//loga informações a respeito da mensagam não validada // grava ocorrência de mensagem com erro no log de usuário GearsUtil.writeInUserLogFile("FolderName..: " + folder + " Message Subject..: " + messageSubject, totalFailMessages++); log.error("FolderName..: " + folder); log.error("Message subject.: " + messageSubject); log.error("Não foi encontrado fonte para a mensagem: " + messageId + " e não inserida na estrututura de meta-arquivamento(h2)"); } } } // totalizar percentual de mensagens analisadas percentProgress = (currentMessageNumber.doubleValue() / totalMessages) * 100; } } } } } } validate = false; // System.out.println("importGears.preArchiveMessages sendo finalizado... "); log.debug("importGears.preArchiveMessages sendo finalizado... "); } // contabiliza o total de mensagens a serem importadas pelo mailarchiver para todos os arquivamentos encontrados // utiliza os registros já validados da tabela archive_importer private void setTotalValidMessages() { totalValidMessages = 0; Iterator database = validDatabasePaths.values().iterator(); while(database.hasNext()) { List databasePaths = (List) database.next(); for(String databasePath : databasePaths) { totalValidMessages += Sqlite.getInstance().getTotalValidMessages(databasePath, mailArchiveId, userId); } } // System.out.println("TOTAL DE MENSAGENS VÁLIDAS A SEREM IMPORTADAS PELO MAILARCHIVER..: " + totalValidMessages); log.debug("TOTAL DE MENSAGENS VÁLIDAS A SEREM IMPORTADAS PELO MAILARCHIVER..: " + totalValidMessages); } private void archiveMessages() { // System.out.println("importGears.archiveMessages sendo executado... "); log.debug("importGears.archiveMessages sendo executado... "); // carrega o numero total de mensagens validadas na fase de pré-arquivamento // o número diz respeito a todos databasePaths encontrados if(inProcess) { setTotalValidMessages(); } if(totalValidMessages > 0) { currentValidInportMessageNumber = 0; //re-inicializa contador Iterator browserArchivePaths = validDatabasePaths.keySet().iterator(); while(browserArchivePaths.hasNext() && inProcess) { Iterator databasePaths = validDatabasePaths.get(browserArchivePaths.next()).iterator(); while(databasePaths.hasNext() && inProcess) { String databasePath = databasePaths.next().toString(); // lê os dados de email aptos a importação da table archive_importer (imported=false) LinkedList messageParameters = Sqlite.getInstance().listMessageParameters(databasePath, mailArchiveId, userId); Set archivedFolders = new HashSet(); Iterator parameters = messageParameters.iterator(); TFolder archiveFolder = null; while(parameters.hasNext() && inProcess) { String[] parameter = (String[]) parameters.next(); String folderName = parameter[0]; String mailId = parameter[1]; String messageFilePath = parameter[2]; String messageHeader = parameter[3]; String unseen = parameter[4]; try { // cria folder no meta-arquivamento a partir do parametro folder if(!archivedFolders.contains(folderName)) { archiveFolder = archiveServices.createAbsoluteFolder(sessionId, folderName); } } catch(ServiceFault ex) { log.error("Falha na criação do Folder " + folderName, ex); } if(archiveFolder != null) { //adiciona ao set de controle de folders arquivados no mailarchiver archivedFolders.add(archiveFolder.getName()); //ler os dados da mensagem do filesystem de usr a partir do parametro messagefilepath String messageContent = GearsUtil.getMessageRFC822(messageFilePath); if(messageContent != null && messageContent.length() > 0) { //cria mensagem no meta-arquivamento TMessage message = null; try { //TMessage archive(String sessionId, String folderId, String message) throws ServiceFault; message = archiveServices.archive(sessionId, archiveFolder.getId(), messageContent); } catch(ServiceFault ex) { // grava ocorrência de mensagem com erro no log de usuário GearsUtil.writeInUserLogFile("FolderName..: " + archiveFolder.getName() + " MessageFilePath..: " + messageFilePath, totalFailMessages++); log.error("FolderName..: " + folderName); log.error("MessageFilepath..: " + messageFilePath, ex); // log.error("Conteúdo da mensagem..: " + "\n" + messageContent, ex); } if(message != null && message.getSize() > 0) { try { // atualiza registro na tabela de controle a partir do parametro mailid Sqlite.getInstance().updateMessageParameters(databasePath, mailId, mailArchiveId, userId); try { //aplica as tags lidas da column mail.header String xmlQueryConfig = GearsUtil.writeQueryConfigHeaders(message.getId(), messageHeader, unseen); if(xmlQueryConfig != null) { archiveServices.tagMessages(sessionId, xmlQueryConfig); } } catch(ServiceFault ex) { log.error(ex); } currentInportMessageSubject = message.getSubject(); currentValidInportMessageNumber++; // System.out.println("Inserindo mensagem..: " + currentValidInportMessageNumber + " de" + totalValidMessages); } catch(SQLException ex) { // grava ocorrência de mensagem com erro no log de usuário GearsUtil.writeInUserLogFile("FolderName..: " + archiveFolder.getName() + " Message Subject..: " + message.getSubject(), totalFailMessages++); log.error("FolderName..: " + folderName); log.error("Message subject.: " + message.getSubject()); log.error("Falha na atualização da tabela archive_importer para o mailId..: " + mailId, ex); } } else { // grava ocorrência de mensagem com erro no log de usuário GearsUtil.writeInUserLogFile("FolderName..: " + archiveFolder.getName() + " MessageFilePath..: " + messageFilePath, totalFailMessages++); log.error("Falha na criação da mensagem ao invocar ArchiveServices.archive()!!"); log.error("FolderName..: " + folderName); log.error("MessageFilepath..: " + messageFilePath); } } } else { log.error("Folder não inserido na estrututura de meta-arquivamento(h2)..: " + folderName); } } } } inProcess = false; } Date finishArchiverDate = new Date(); System.out.println("PROCESSO DE ARQUIVAMENTO GEARS FINALIZADO EM..: " + new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(finishArchiverDate)); log.debug("PROCESSO DE ARQUIVAMENTO GEARS FINALIZADO EM..: " + new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(finishArchiverDate)); log.debug("Foram inseridas " + currentValidInportMessageNumber + " mensagens na estrututura de meta-arquivamento(h2)!"); // System.out.println("importGears.archiveMessages sendo finalizado... "); log.debug("importGears.archiveMessages sendo finalizado... "); } } // login - será chamado após painel1 de boas vindas public class LoginPanel extends VerticalLayout{ private final TextField username; private final TextField domain; private final PasswordField password; private Panel panel; public Panel getPanel() { return panel; } public LoginPanel(){ panel = new Panel("Painel de autenticação da aplicação! "); panel.addComponent(new Label("Informe os dados referentes a conta do sistema operacional.")); setSizeUndefined(); // let content 'push' size setSpacing(true); // Username username = new TextField("Nome do Usuário"); panel.addComponent(username); // Password password = new PasswordField("Senha"); panel.addComponent(password); // Domain domain = new TextField("Domínio"); // panel.addComponent(domain ); HorizontalLayout footer = new HorizontalLayout(); footer.setSpacing(true); footer.setMargin(true); // Login button Button loginButton = new Button("Validar", new Button.ClickListener() { // inline click listener public void buttonClick(ClickEvent event) { try{ if(gearsArchive.authenticateUserOs( username.getValue().toString(), password.getValue().toString(), domain.getValue().toString())){ panel.setVisible(false); panel2 = new PanelWindow2(); window.getContent().addComponent(panel2.getPanel()); panel2.getPanel().setVisible(true); search = new ThreadSearch(); search.setName("ARCHIVE-IMPORTGEARS-SEARCH-THREAD"); search.start(); panel2.getProgress().setEnabled(true); panel2.getProgress().setVisible(true); } else { // informa mensagem ao usuário panel.getApplication().getMainWindow(). showNotification("Validação local falhou, verifique os dados informados!", Notification.TYPE_ERROR_MESSAGE); } }catch(Exception e){ panel.getApplication().getMainWindow(). showNotification("Validação local falhou, verifique os dados informados!", Notification.TYPE_ERROR_MESSAGE); } } }); footer.addComponent(loginButton); Button exit = new Button("Sair"); exit.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.getApplication().getMainWindow().removeWindow(window); } }); footer.addComponent(exit); panel.addComponent(footer); addComponent(panel); // setComponentAlignment(loginButton, Alignment.TOP_RIGHT); } } public class PanelWindow1 extends VerticalLayout { private Panel panel; public Panel getPanel() { return panel; } public PanelWindow1() { panel = new Panel("Painel de abertura da aplicação! "); setMargin(true); setSpacing(true); panel.addComponent(new Label("Assistente de importação Gears/MailArchiver.")); HorizontalLayout footer = new HorizontalLayout(); footer.setSpacing(true); footer.setMargin(true); Button next = new Button("Avançar"); next.setDescription("Iniciar processo de importação de emails"); Button exit = new Button("Sair"); next.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.setVisible(false); loginPanel = new LoginPanel(); window.getContent().addComponent(loginPanel.getPanel()); loginPanel.getPanel().setVisible(true); } }); exit.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.getApplication().getMainWindow().removeWindow(window); } }); footer.addComponent(next); footer.addComponent(exit); panel.addComponent(footer); addComponent(panel); } } public class PanelWindow2 extends VerticalLayout { private Panel panel; private ProgressIndicator progress; public Panel getPanel() { return panel; } public ProgressIndicator getProgress() { return progress; } public PanelWindow2() { panel = new Panel("Painel de pesquisa de arquivamentos! "); setMargin(true); setSpacing(true); panel.addComponent(new Label("Procurando arquivamentos válidos... ")); progress = new ProgressIndicator(); progress.setIndeterminate(true); progress.setPollingInterval(1000); progress.setEnabled(false); panel.addComponent(progress); Button cancel = new Button("Cancelar "); cancel.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.getApplication().getMainWindow().removeWindow(window); } }); panel.addComponent(cancel); addComponent(panel); } } public class PanelWindow3 extends VerticalLayout { Panel panel; public Panel getPanel() { return panel; } public PanelWindow3() { panel = new Panel("Painel de listagem de arquivamentos válidos! "); setMargin(true); setSpacing(true); HorizontalLayout footer = new HorizontalLayout(); footer.setSpacing(true); footer.setMargin(true); OptionGroup gearsSelectPath = null; Button next = new Button("Avançar"); next.setDescription("Iniciar processo de importação de emails"); Button cancel = new Button("Cancelar"); cancel.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { // System.out.println("Aplicação encerrada pelo usuário!"); panel.getApplication().getMainWindow().removeWindow(window); log.error("Aplicação encerrada pelo usuário!"); } }); footer.addComponent(cancel); //carrega a listagem de arquivamentos default válidos encontrados gearsArchive.configureGearsPaths(); // só habilitará o OptionGroup e Next se existirem arquivamentos válidos if(!gearsArchive.getListGearsBrowserArchives().isEmpty()) { gearsSelectPath = new OptionGroup("Selecione os arquivamentos desejados.... ", gearsArchive.getListGearsBrowserArchives()); gearsSelectPath.setMultiSelect(true); gearsSelectPath.setImmediate(true); gearsSelectPath.addListener(new Property.ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { gearsArchive.getListSelectedGearsBrowserArchives().addAll((Set) event.getProperty().getValue()); } }); panel.addComponent(gearsSelectPath); next.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { if(gearsArchive.getListSelectedGearsBrowserArchives().size() > 0) { panel.setVisible(false); panel4 = new PanelWindow4(); window.getContent().addComponent(panel4.getPanel()); panel4.getPanel().setVisible(true); } } }); footer.addComponent(next); } else { // informa mensagem ao usuário // panel.getApplication().getMainWindow().showNotification("Dados de login incorretos!", Notification.TYPE_ERROR_MESSAGE); panel.addComponent(new Label("Não foram encontradas mensagens a serem importadas!")); } panel.addComponent(footer); addComponent(panel); } } public class PanelWindow4 extends VerticalLayout { private Panel panel; public Panel getPanel() { return panel; } public PanelWindow4() { panel = new Panel("Painel de confirmação de importação de arquivamentos!"); setMargin(true); setSpacing(true); panel.addComponent(new Label("Arquivamentos a serem importados..: ")); // System.out.println("Número de arquivamentos selecionados(Raiz)..: " + gearsArchive.getListSelectedGearsBrowserArchives().size()); if(gearsArchive.getListSelectedGearsBrowserArchives().size() > 0) { Iterator paths = gearsArchive.getListSelectedGearsBrowserArchives().iterator(); while(paths.hasNext()) { String path = paths.next().toString(); if(path.contains(Browser.Chrome.name().toLowerCase())) { panel.addComponent(new Label("Google Chrome")); } if(path.contains(Browser.InternetExplorer.name().toLowerCase())) { panel.addComponent(new Label("Internet Explorer")); } if(path.contains(Browser.Firefox.name().toLowerCase())) { panel.addComponent(new Label("Mozilla Firefox")); } } } CheckBox reImport = new CheckBox("Re-importação de emails.."); reImport.setValue(false); reImport.setDescription("Re-importação de mails...."); reImport.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { reImporter = event.getButton().booleanValue(); } }); reImport.setImmediate(true); panel.addComponent(reImport); HorizontalLayout footer = new HorizontalLayout(); footer.setSpacing(true); footer.setMargin(true); Button next = new Button("Avançar"); next.setDescription("Arquivar mensagens."); next.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.setVisible(false); panel5 = new PanelWindow5(); window.getContent().addComponent(panel5.getPanel()); panel5.getPanel().setVisible(true); validate = new ThreadValidateWindow(); validate.setName("ARCHIVE-IMPORTGEARS-VALIDATE-WINDOW-THREAD"); validate.start(); archiverValidateProcess = new ThreadValidateProcess(); archiverValidateProcess.setName("ARCHIVE-IMPORTGEARS-VALIDATE-THREAD"); archiverValidateProcess.start(); panel5.getProgress().setEnabled(true); panel5.getProgress().setVisible(true); } }); Button cancel = new Button("Cancelar"); cancel.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.getApplication().getMainWindow().removeWindow(window); } }); Button back = new Button("Voltar"); back.setDescription("Voltar para seleção de arquivamentos."); back.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.setVisible(false); window.getContent().addComponent(panel3.getPanel()); panel3.getPanel().setVisible(true); } }); footer.addComponent(cancel); footer.addComponent(next); footer.addComponent(back); panel.addComponent(footer); addComponent(panel); } } public class PanelWindow5 extends VerticalLayout { private Panel panel; private ProgressIndicator progress; private Label messageCounter = new Label(); public Panel getPanel() { return panel; } public ProgressIndicator getProgress() { return progress; } public Label getMessageCounter() { return messageCounter; } public PanelWindow5() { panel = new Panel("Painel de validação de emails para arquivamento! "); setMargin(true); setSpacing(true); panel.addComponent(new Label("Aguarde! Analisando emails arquivados pelo Google Gears.")); panel.addComponent(new Label("Esta operação poderá levar vários minutos!")); progress = new ProgressIndicator(); progress.setIndeterminate(true); // progress.setPollingInterval(1); progress.setEnabled(false); panel.addComponent(progress); Button cancel = new Button("Cancelar "); cancel.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { gearsArchive.validate = false; gearsArchive.inProcess = false; panel.getApplication().getMainWindow().removeWindow(window); } }); panel.addComponent(messageCounter); // exibe um totalizador de mensagens validadas panel.addComponent(cancel); addComponent(panel); } } public class PanelWindow6 extends VerticalLayout { private Panel panel; private ProgressIndicator progress; private Label message = new Label(); private Label messageCounter = new Label(); public Panel getPanel() { return panel; } public ProgressIndicator getProgress() { return progress; } public Label getMessage() { return message; } public Label getMessageCounter() { return messageCounter; } public PanelWindow6() { panel = new Panel("Painel de andamento do processo de arquivamento! "); setMargin(true); setSpacing(true); panel.addComponent(new Label("Andamento do processo..: ")); progress = new ProgressIndicator(); progress.setIndeterminate(true); // progress.setPollingInterval(1);//atualiza a tela via ProgressIndicator progress.setEnabled(false); panel.addComponent(progress); Button cancel = new Button("Cancelar "); cancel.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.setVisible(false); gearsArchive.inProcess = false;//termina arquivamento panel7 = new PanelWindow7(); window.getContent().addComponent(panel7.getPanel()); panel7.getPanel().setVisible(true); } }); panel.addComponent(cancel); panel.addComponent(message); // exibe os filePaths das mensagens sendo importadas panel.addComponent(messageCounter); // exibe um totalizador de mensagens importadas addComponent(panel); } } public class PanelWindow7 extends VerticalLayout { private Panel panel; public Panel getPanel() { return panel; } public PanelWindow7() { panel = new Panel("Painel de resumo do processo de importação! "); setMargin(true); setSpacing(true); panel.addComponent(new Label("Importação Concluída!")); panel.addComponent(new Label("Mensagens Arquivadas..: " + gearsArchive.currentValidInportMessageNumber)); Button ok = new Button("ok"); ok.setDescription("Terminar o aplicativo!"); ok.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { panel.getApplication().getMainWindow().removeWindow(window); } }); panel.addComponent(ok); addComponent(panel); } } public class ThreadSearch extends Thread { @Override public void run() { // System.out.println("ThreadSearch.run sendo executado... "); try { Thread.sleep(1000); } catch(InterruptedException e) { log.error(e); } synchronized(window.getApplication()) { panel2.getPanel().setVisible(false); panel3 = new PanelWindow3(); window.getContent().addComponent(panel3.getPanel()); panel3.getPanel().setVisible(true); } // System.out.println("ThreadSearch.run sendo finalizado... "); } } public class ThreadValidateWindow extends Thread { @Override public void run() { // System.out.println("ThreadValidateWindow.run sendo executado... "); boolean condition = true; DecimalFormat decimalFormat = new DecimalFormat("0.00"); while(condition) { synchronized(window.getApplication()) { panel5.getMessageCounter().setCaption(decimalFormat.format(gearsArchive.percentProgress) + "% Mensagens analisadas... "); log.debug(decimalFormat.format(gearsArchive.percentProgress) + "% Mensagens analisadas... "); // panel5.getMessageCounter().setEnabled(false); if(gearsArchive.totalMessages > 0) { panel5.getMessageCounter().setVisible(true); } if(!gearsArchive.validate) { panel5.getPanel().setVisible(false); panel6 = new PanelWindow6(); window.getContent().addComponent(panel6.getPanel()); panel6.getPanel().setVisible(true); panel6.getProgress().setEnabled(true); panel6.getProgress().setVisible(true); condition = false; } } } // inicializa o processo de arquivamento no h2 archiverWindow = new ThreadArchiverWindow(); archiverWindow.setName("ARCHIVE-IMPORTGEARS-WINDOW-THREAD"); archiverWindow.start(); archiverProcess = new ThreadArchiverProcess(); archiverProcess.setName("ARCHIVE-IMPORTGEARS-THREAD"); archiverProcess.start(); // System.out.println("ThreadValidateWindow.run sendo finalizado... "); } } // dispara o pré-arquivamento de mensagens public class ThreadValidateProcess extends Thread { @Override public void run() { // System.out.println("ThreadArchiverValidateProcess.run sendo executado... "); //efetua a carga previa nos dados para posterior importação pelo mailarchiver gearsArchive.preArchiveMessages(); // System.out.println("ThreadArchiverValidateProcess.run sendo finalizado... "); } } //controla as atualizações de tela enquanto o arquivamento é processado public class ThreadArchiverWindow extends Thread { @Override public void run() { // System.out.println("ThreadArchiverWindow.run sendo executado... "); while(gearsArchive.inProcess) { synchronized(window.getApplication()) { panel6.getMessage().setCaption("Arquivando a mensagem..: " + gearsArchive.currentInportMessageSubject); panel6.getMessageCounter().setCaption(gearsArchive.currentValidInportMessageNumber + " de " + gearsArchive.totalValidMessages); panel6.getMessage().setEnabled(false); panel6.getMessageCounter().setEnabled(false); panel6.getMessage().setVisible(true); panel6.getMessageCounter().setVisible(true); } } panel6.getPanel().setVisible(false); panel7 = new PanelWindow7(); window.getContent().addComponent(panel7.getPanel()); panel7.getPanel().setVisible(true); // System.out.println("ThreadArchiverWindow.run sendo finalizado... "); } } //dispara a importação de mensagens para o h2 public class ThreadArchiverProcess extends Thread { @Override public void run() { // System.out.println("ThreadArchiverProcess.run sendo executado... "); // // System.out.println("ThreadSearch --> "+ search.getState()); // // System.out.println("ThreadValidateWindow --> "+ validate.getState()); // // System.out.println("ThreadValidateProcess --> "+ archiverValidateProcess.getState()); gearsArchive.archiveMessages(); gearsArchive.inProcess = false; // System.out.println("ThreadArchiverProcess.run sendo finalizado... "); } } }